我们写的程序的安全,除掉代码本身的安全之外,还包括我们代码所依赖的三方jar包的安全,所以我们在日常的质量保障中, 也需要把此纳入检查范围。下面我们主要介绍下使用OWASP Dependency-check进行三方依赖安全检查的基本方法。
与Maven集成
Dependency check与Maven的集成比较简单,我们直接修改pom,增加如下配置:
......org.owasp dependency-check-maven 5.2.1check6......org.owasp dependency-check-maven 5.2.1aggregate
然后直接调用如下命令
mvn dependency-check:check
执行完成之后,会在target目录生成html格式的报告。
注意我们有如下的配置:
6
意思是如果发现的CVS错误有6个或者以上时,构建的结果即为失败。
与Jenkins的集成
- 首先安装OWASP Dependency Check插件:
- 然后在“全局工具管理”里面新增一个Dependency-check的实例:
- 新建一个自由类型的项目
- 构建里面先调用Maven进行打包:
- 然后构建里面选择“invoke dependency-check”:
- 新增构建后操作
- 点击Risk Gate Thresholds可以设定在整体缺陷个数或者新增缺陷个数是多少的情况下,把构建结果设置为Unstable或者Fail。比如:
对于issue总数来说,Critcal的达到2个,或者High的达到2个,就Unstable;Critical的达到10个,或者High的达到10个,就Fail;对于新增issue来说,Critical的达到1个,或者High的达到1个,就Unstable;Critical的达到5个,或者High的达到5个,就Fail。
- 保存后,点击立即构建。然后就是漫长的构建过程。构建完成之后,我们可以在jenkins的结果页查看其趋势:
- 点击某次具体构建之后可以查看此次构建的Dependency check结果详情:
- 点开后可以查看具体的违规原因:
与Sonar的集成
与sonar的集成主要是依靠插件:https://github.com/dependency-check/dependency-check-sonar-plugin,这里需要特别说明下,本插件并不做Dependency-check的分析,而是依赖已经生成的Dependency-check的结果,然后在sonar上进行展示。
- 首先我们从https://github.com/dependency-check/dependency-check-sonar-plugin/releases下载最新的jar包,然后上传到sonar的extensions目录下。对应DevOPS | 代码静态扫描工具SonarQube的安装和初步使用 的目录为/sonar/extensions/plugins,并重启sonarqube
- 然后根据上文的介绍配置运行Dependency-check插件进行检查和输出报告,我们需设置输出所有格式的报告:
- 然后根据基于Gitlab、Sonarqube和jenkins的代码静态扫描 介绍的步骤配置进行代码进行代码扫描,并添加如下配置信息:
sonar.dependencyCheck.reportPath=${WORKSPACE}/dependency-check-report.xmlsonar.dependencyCheck.htmlReportPath=${WORKSPACE}/dependency-check-report.htmlsonar.dependencyCheck.summarize=true
- 构建完成之后,我们即可在sonar里面查到到Dependency-check查出来的问题:
- 同时sonar里面也增加了对Dependency-check报告的链接:
加速CVE数据下载
上面我们提到,在使用Dependency check进行检查的时候,首先需要花费一定的时间从NVD(NATIONAL VULNERABILITY DATABASE)中下载CVE数据。一个可以优化的方案就是在本地建立NVD的镜像,然后从此镜像下载。
- 首先我们从https://github.com/stevespringett/nist-data-mirror下载最新的jar
- 然后上传到服务器,使用如下命令进行镜像:
java -jar nist-data-mirror.jar
- 为了保证本地镜像数据库的及时性,可以使用crontab添加一个镜像任务
- 镜像完成之后记得使用apache或者nginx开通web服务以提供http访问镜像功能
- 然后在jenkins的构建里面指定如下参数即可:
--cveUrlModified http://192.168.10.32:81/nvdcve-1.0-modified.json.gz--cveUrlBase http://192.168.10.32:81/nvdcve-1.0-%d.json.gz