Skip to content

SonarQube集成DependencyCheck

环境概述:

SonarQube:7.7
SonarScanner:3.10.0

安装插件

SonarQube Dependency-Check插件项目地址

下载要注意版本,目前Github上支持6.x版本与7.x,版本我这里下载的是:

sonar-dependency-check-plugin-1.2.3.jar

下载好后放置在SonarQube的插件目录,再重启即可。

sonarqube-5

网上有几篇文章都提到了这里需要配置Paths,但是实际上可以不用配置,我们使用SonarScanner给SonarQube传输即可。(参考资料见文末)

执行扫描:解决SonarQube找不到报告

INFO: Dependency-Check HTML report does not exists

这个坑真的是踩了很久,后来也与GitHub作者进行了沟通,对方提醒我需要先生成报告。

生成报告工具:DependencyCheck

# 下载工具
bash bin/dependency-check.sh -h

# 测试,我这里是结合SonarScanner + Gitlab-CI进行分析
# 配置Gitlab-CI文件
stages:
  - sast
sast:
  stage: sast
  script:
    - mvn package -DskipTests # 编译项目
    - mkdir $PWD/reports # 创建报告目录
    - /home/gitlab-runner/dependency-check/bin/dependency-check.sh -s $PWD/ -f XML -o $PWD/reports/dependency-check-report.xml # 生成报告
    - /home/gitlab-runner/dependency-check/bin/dependency-check.sh -s $PWD/ -f HTML -o $PWD/reports/dependency-check-report.html # 生成报告
    - sonar-scanner -Dsonar.host.url=http://10.10.10.12:9000 -Dsonar.login=token -Dsonar.projectKey=$CI_PROJECT_NAME:$CI_COMMIT_REF_NAME -Dsonar.java.binaries=$PWD -Dsonar.dependencyCheck.reportPath=$PWD/reports/dependency-check-report.xml -Dsonar.dependencyCheck.htmlReportPath=$PWD/reports/dependency-check-report.html # 执行SonarScanner扫描,并将DependencyCheck的结果传输给SonarQube
  tags:
    - sec1

sonarqube-6

sonarqube-7

SonarQube 结果:

sonarqube-8

sonarqube-9

思考

在什么环节执行第三方依赖扫描

由于扫描第三方依赖的工具是扫描jar包,所以需要在项目编译之后才能进行扫描,否则会没有效果。测试方法如下:

# 在Gitlab-CI中去掉编译项目这一步
# 扫描结果如图

sonarqube-10

所以如果在代码提交阶段(本文中的形式)将会形成资源重复使用的问题,因为项目在发版的时候也会编译,就形成了重复编译。所以建议操作是放在Jenkins打包的时候触发pipelines动作。这个时候代码打包一般都是发布到测试环境(QA)我们发现安全问题,可以安排进行修复。

扫描发现的漏洞如何形成闭环

依赖包可能会扫描出很多漏洞,如何对这些漏洞形成闭环,要思考几个方面的问题:

  • 漏洞是否都需要修复?:严重、高危需要修复。漏洞的修复成本
  • 需要修复的漏洞如何形成自动化的跟踪流程?:手动提交到漏洞管理平台,或者使用SonarQube API写脚本自动提交。关于漏洞生命周期管理

漏洞的准确性

扫描出来的漏洞可能存在很多误报,或者漏洞并不能利用成功这个时候我们再去手工验证漏洞耗时。所以思考如何来解决漏洞准确性就成了下一个要解决的问题。

参考资料

linuxea:gitlab-ci/cd Dependency依赖扫描两种方式 (五)