刘 涛 伍少成 马 越 赵 杰 姜和芳
(深圳供电局有限公司 广东深圳 518001)(1513629216@qq.com)
随着电力市场化交易的出现,电能计量系统正从传统的离线方式向在线方式转换,系统新功能的不断推送,使得系统的安全隐患和风险加大,一旦系统任何节点的源代码存在安全漏洞或缺陷,导致电能现货交易意外中断,就会给政府和电力企业带来不可估量的社会影响和重大经济损失.为了及时查找软件代码可能存在的安全缺陷,通常采用静态代码分析和动态代码分析[1].前者是用来发现程序代码本身的安全漏洞,测试工具简单易用;而后者需要更专业的测试工具和人员配置,才可发现静态代码如何与其他组件交互时的错误.
研究人员马均飞和郑文强[2]对代码静态测试评审的原则和类型进行了较准确详细的描述,给出实际分析案例,并通过基于代码和基于架构的分析方法,进一步加深对代码安全性静态分析的论述;贺江敏和相里朋[3]在马均飞等人[2]研究的基础上,开展了代码安全性人工走查和静态工具分析相结合的研究,针对目前常见的软件安全漏洞,比如SQL注入、缓冲区溢出、资源未释放等进行人工走查的方式查找安全漏洞,然后,通过代码安全性静态分析工具对数据流、控制流和程序结构等方面的自动化扫描分析,再结合人工分析方法加以完善.
不过,人工排查源代码安全漏洞的方法需要对代码编程有较高技术才可完成,费用高、时间长.随着静态代码自动检测工具的快速发展,为了达到软件运维人员无需具备对软件编程和安全测试等专业知识的深入了解,就可轻松地使用专业化的自动检测工具,来完成软件代码安全漏洞的自动、高效、准确的测试,生成可视化的代码质量等级测试报告[4],在这方面有大量的自动测试工具可供选择[5-6],其中SonarQube是一种国内外同行公认的、最普遍采用的静态代码安全漏洞自动扫描测试工具.
SonarQube可以从7个维度制定代码规则,对软件源代码进行持续化安全漏洞检测,从而提前捕获和提示代码中的错误[7-8].许多学者和用户在其代码规则的基础上已不断扩展了更加智能化[9-10]、可视化[11]和高精度的规则或功能,以澄清某些对SonarQube在代码规则有效性和准确性方面的质疑[12-13],从而在源代码库的质量或安全受到威胁之前,确保消除代码安漏洞或缺陷,避免如缓冲区溢出、空指针引用、资源泄露和SQL注入等安全漏洞或缺陷,从多个方面提高代码的安全性和可靠性.
当计量系统版本更新升级时,系统运维人员依靠基于SonarQube的智能安全测试平台,从版本控制数据仓库中获取由软件开发团队提交的代码,自动编译后,通过SonarQube开源接口的2次开发,将代码传递到该工具进行安全漏洞自动扫描,动态生成Web可视化的代码安全等级分析报告.因此,计量系统运维人员依托智能安全测试平台就可以实现对软件代码的安全漏洞测试及质量控制.
智能安全测试平台在逻辑上分为管理端和智能测试服务2个部分.管理端主要负责协调各服务间的数据交流及管理;服务端主要包括版本控制、漏洞扫描和系统管理,其中版本控制是对软件源代码、远程设备、设备固件、配置文件等的版本管理,漏洞扫描负责对源代码的各种安全漏洞进行智能自动扫描、测试并给出安全漏洞的等级,系统管理是根据用户的职责赋予相应的角色、权限以及对重要操作的审计(图1所示).
图1 智能安全测试平台逻辑架构图
智能安全测试平台的设计是以GitLab为安全漏洞检测入口,以SonarQube为检测的主要工具和测试报告生成出口,智能安全测试平台作为一个协调机制将GitLab和SonarQube关联起来.当软件开发团队通过平台向GitLab数据仓库提交代码后,由Maven对代码进行编译,然后将代码和编译的输出信息送给SonarQube进行代码安全漏洞自动检测.
智能安全测试平台将SonarQube代码审计融入到软件项目持续的版本更新升级的过程中,可以自动生成高质量、可视化Web页面的安全检测报告.
为了开展计量系统软件源代码的自动测试任务,根据软件开发团队、计量系统维护人员、平台系统管理员等用户职责的不同,赋予不同权限,并对所有用户使用平台的主要行为进行监管.功能主要包括:
1) 权限管理.包括角色和用户管理.角色管理是根据用户职责的不同,通过角色来承载不同的权限,如该角色可以操作哪些菜单或同一个界面只允许操作哪些按钮等.用户管理是对系统的操作进行管理.
2) 数据权限管理.通过角色向用户分配数据权限的最小单元,如同一个界面中只能看到允许的数据.
3) 系统日志.记录用户登录平台、删除、添加等关键操作信息.为避免日志过于庞大,影响系统性能,允许系统管理员通过日志固定周期的配置,将数据库中记录的日志定期分割到文件中作为备份.
安全漏洞扫描工具SonarQube、版本控制系统GitLab、数据库PostgreSQL等安装在不同的服务器或虚拟机上,此模块将对这些服务器的创建、修改、查询和删除进行管理.
在版本控制系统GitLab[14]数据仓库中创建软件测试项目、分支等目录,并在GitLab开源接口的基础上进行Java 2次开发,以满足智能安全测试平台与GitLab之间的信息连接,再由系统管理员为软件开发团队创建1组用户,通过此模块将开发调试完成的源代码上传到GitLab指定目录中.也可根据情况查询、添加、修改或删除代码和文件.
为了便于计量系统软件对整个项目或重点分支、功能模块的源代码进行漏洞扫描测试,通过此模块在PostgreSQL数据库NK_SONAR中建立与GitLab完全一致的项目及项目分支.具体做法是用户只需在详情页面输入项目名称、项目唯一标识符等必填项,点击添加按钮后,新增的项目信息展示在页面下方项目列表中(如图2所示).项目管理默认展示所有已录入的项目信息.
图2 项目管理页面
计量系统运维人员通过此模块可以从数据库中获取,并上传软件的全部或部分代码,并由测试平台对其代码进行自动扫描,产生扫描结果,直接供系统运维人员和软件开发工程师们查看.
首先,在项目管理模块的项目名称一栏的下拉菜单中选择相应的项目或者项目分支名称,再点击“待扫描文件”一栏的“选择文件”标识符,则从GitLab版本控制系统获取要扫描的软件并上传,然后点击“开始扫描”按钮(如图3所示),系统将要扫描文件包发送给SonarQube进行安全漏洞扫描、测试、动态生成漏洞等级报告等.
图3 漏洞扫描页面
智能安全测试平台是基于Java,SonarQube,GitLab,Maven,PostgreSQL等技术集成搭建而成的、并在Tomcat上运行的自动测试系统,主要实现软件编码等文件的版本控制与智能化代码安全漏洞扫描及测试.
智能安全测试平台在开源工具SonarQube 8.6.1基础上2次开发,集成了数千种智能化自动检测扫描和分析规则,具有自学习和自动识别新型安全漏洞的AppSec功能,对计量系统静态代码从7个维度进行持续化安全漏洞检测,能够提前捕获和提示代码中的错误,在代码库的质量或安全受到威胁之前确保消除代码漏洞或缺陷,从多个方面提高了代码的安全性和可靠性.以下是SonarQube的配置文件sonar.property中与数据库相关的配置:
sonar.jdbc.username=postgres #数据库用户名
sonar.jdbc.password=*******#数据库密码
sonar.jdbc.url=jdbc:PostgreSQL://ip_addr:5432/NX_SONAR# 数据库连接URL
sonar.web.host=*.*.*.*#IP地址
sonar.web.port=****#端口号
GitLab是一个开放源代码的版本控制系统,用于多个人共同开发同一个项目,以共用资源为目的,经过在其开源接口程序基础上的Java 2次开发,直接通过智能安全测试平台就可将计量系统的源代码、配置文件等上传到GitLab的数据仓库中.PostgreSQL13.0数据库是用于存储与安全漏洞扫描、版本控制以及智能安全测试平台相关的数据表和记录.
Maven 3.6是1个软件项目管理工具,在Maven插件中拥有1组源代码分析器.该分析器使用数据库中存储的配置来完成统一开发规范以及管理jar包.通常SonarQube依赖Maven来运行分析,也能够分析非Maven项目.
以下是智能安全测试平台配置文件主要部分:
#*-----------------------------数据库连接配置-
db.url=jdbc:PostgreSQL://ip_addr:5432/NK_TEST
db.username=postgres
db.password=******
#*-----------------------------系统配置--------
app.config=classpath:/system/system-config.xml
#----GitLab配置-------------------------------
#登录GitLab的token,该token在GitLab上去生成
GitLab.token=*****************
#GitLab服务器地址
GitLab.url=http://ip_addr:port
#--------SonarQube配置----------------------
#SonarQube的登录用户
sonar.login=admin
#SonarQube的登录密码
sonar.password=******
#SonarQube的服务器地址
sonar.url=http://ip_addr:port
#-------Maven配置-------------------------------
#Maven的运行目录
Maven.home=/opt/Maven/
根据计量系统各功能模块的具体情况(新功能、关键应用程序、技术库等),在SonarQube中设置多个不同代码质量预警指标的阈值或配置文件,只有满足这些质量阈值检测条件才能进入下一个流程,例如,质量阈值可以强制要求所有新代码必须包含至少80%的测试覆盖率,或者不应该存在安全漏洞或缺陷等,质量阈值也可以自定义.SonarQube中针对每个项目或分支会通过Web页面展示详细的信息,给出整个项目或某分支当前的健康状态、不同级别漏洞的分类、明细等多维度的统计信息,便于进行问题的追踪和修复[15-16].
在预先为编程语言设定的标准或规则之上,可以自定义附加的规则或赋值标准,如可以给某些Java代码规则赋予特殊的权重值,以便提高代码安全质量;或通过启用或停用某些代码规则,以调整代码质量等级.也可以事先定义项目/配置文件的关联度等,以提高代码的安全系数.
SonarQube以插件形式集成了众多缺陷检测工具,伴随着检测工具的不断更新升级,测试平台对代码安全漏洞检测的质量将不断提高,并且工具的更新升级不会影响到平台代码安全检测的进程.
为了验证智能安全测试平台的功效,对计量系统的主要功能进行代码安全漏洞测试.被测对象主要包括智能计量主站系统中的远程抄表、电量统计、负载管理、线损统计、用电稽查、配电应用、电压合格率统计、客户停电时间统计以及计量装置远程巡检等业务.
首先,计量系统开发团队完成软件集成后,通过测试平台赋予的用户权限,登录智能安全测试平台的文件管理模块,将源代码和相关的配置文件上传到GitLab代码数据仓库中.
在计量系统版本更新升级前,为了确保新版本编码无安全漏洞,系统运维人员只需通过测试平台的漏洞扫描模块选择事先创建的项目或项目分支,再从Gitlab获取要进行安全漏洞扫描的代码,点击开始扫描,则通过测试工具SonarQube的开源接口,执行自动扫描测试任务的操作,具体步骤如下:
1) 基于漏洞扫描测试工具SonarQube的开源接口程序的Java技术2次开发,实现智能安全测试平台与SonarQube之间的通信,将漏洞扫描所需的程序代码等传递到测试服务器上;
2) 此时,智能安全测试平台的漏洞扫描页面的下方自动显示1条漏洞扫描记录,并且,其扫描状态为“正在扫描”;
3) 通过Java程序调取SonarQube的可运行指令,执行软件代码扫描测试命令,系统由事先定义的令牌代替用户名密码,自动登录SonarQube软件,实施代码安全漏洞全自动扫描测试任务;
4) 扫描测试成功后,漏洞扫描页面的下方漏洞扫描记录的状态改为“扫描完成”,同时,自动生成本次任务的代码安全漏洞等级测试报告;
5) 点击该记录的扫描状态,则弹出“扫描日志”标签;
6) 为查看安全漏洞扫描结果详情,点击漏洞扫描日志内容左上角的“查看扫描分析”,系统将自动连接并登录SonarQube软件,显示安全漏洞扫描的详细测试报告(如图4所示);
图4 自动测试报告显示
7) 系统运维人员根据测试报告给出的结果,判断软件是否需要进一步的改进:如果显示存在安全漏洞或缺陷,将通过电子邮件等方式告知软件开发团队,进行修改后提交到GitLab编码库中,系统运维人员只需重复上述步骤,进行回归测试,直到软件所有代码的安全测试都满足测试规则要求为止.
这样,当计量系统版本更新升级时,系统运维人员只需具备对测试工具的使用和操作的基本了解,就可随时登录智能安全测试平台,选择项目或项目分支,上传相应的源代码,就可完成对计量系统代码高效、全自动的安全漏洞扫描测试,从而有效地控制计量系统代码的安全漏洞和质量.
基于智能安全测试平台,计量系统运维人员无需具备专业软件测试技能,就可通过由GitLab开源接口的Java 2次开发程序,直接从其数据仓库中调取软件开发团队提交的代码,采用“一键式”方式,通过SonarQube开源接口的2次开发程序,将代码传递到SonarQube上,动态地生成测试指令,完成代码的自动漏洞扫描、测试,生成可视化的安全漏洞测试报告.基于测试报告分析,系统运维人员可以判断计量系统是否存在致命安全漏洞或缺陷,以决定是否允许计量系统进行版本的更新升级.这样既提高了计量系统代码安全漏洞及缺陷的质量控制,又减少人力测试和设备资源的开支,大大提高了电力企业管理水平和工作效率.