极狐 GitLab 集成 sonarqube 实践指南
背景
场景
极狐 GitLab 旗舰版已经具备扫描能力,但是某些场景下扫描能力偏弱,所以希望集成第三方扫描工具作为补充。但是,单纯的通过 Runner 调用的方式,只是松散的集成,无法真正形成「深度集成」的体验。
若可以「在极狐 GitLab 的漏洞报告中展现第三方扫描工具的扫描结果」,那么,对于集成的体验则会提升很多。本文即针对此目的进行展开说明。
外部扫描器选型 SonarQube-CE
以非常流行的扫描工具 SonarQube 社区版为例加以说明。
快速入门
直接在.gitlab-ci.yml 文件中填入如下内容,触发扫描,即可在漏洞报告中查看结果。
以下仓库参考
Java: https://jihudemo.online/demo/standard-demo/hello-order/hairou-app-downsteam/-/security/vulnerability_report
cpp: https://jihudemo.online/demo/standard-demo/hello-order/cpp-example/-/security/vulnerability_report
Python: https://jihudemo.online/mumutech/dev-backend/bigdata/funny-toolkits/-/security/vulnerability_report
PHP: https://jihudemo.online/mumutech/dev-backend/dvwa/-/security/vulnerability_report
使用方法
参考 dvwa 仓库中的配置方法。
SonarQube-CE 部署
公网环境中已经部署好 SonarQube,可以忽略部署过程,继续往下。
若为私网环境,参考下文部署章节。
环境变量配置
在 project 级别中,settings
- CI/CD
- Variables
中添加如下 2 个变量指向 SonarQube 服务。
sonar_host_url
:http://1.13.160.207:9000
sonar_login
:333f3410ce3e575d559329e8f3d0a5d4ec8a499d
.gitlab-ci.yml
配置
在待扫描仓库中增加.gitlab-ci.yml
配置文件,如下,不建议直接把敏感信息如快速入门那样配置在 ci 文件中。
然后进行扫描即可得到扫描结果。
报告总览
特定 issue 展现 image
文件定位 image
SonarQube 说明
SonarQube 原理
docker 方式部署 SonarQube-CE 7.6
根据文章How to get the sonar-report.json file created with sonarqube?、How to get sonar-report.json file to display sonar issues at gerrit level itself中所言,从 7.7 版本开始,不支持在 scanner 端导出 json 格式的报告,因此部署支持的旧版本中的最后一个版本,即 7.6 版。
PgSql
参考Docker 安装SonarQube 步骤以及遇到的坑进行部署,
创建工作目录
创建网络
部署 pg
SonarQube
创建工作目录
修改系统参数
运行测试容器
拷贝必须文件到本地,并修改权限为777
删除容器
启动 SonarQube,其中SONARQUBE_JDBC_URL
的 IP 地址需要修改为实际 PgSql 数据库的 IP
生成 token
登录 SonarQube UI 地址( http://IP:9000 ),默认用户名密码为admin/admin
,在My Account
- Security
中生成 Token。
部署使用 sonar-scanner
参考SonarScanner下载最新版的扫描器。
解压后,进入bin
目录,执行如下命令即可完成扫描,扫描完成后可以去 SonarQube 中查看扫描结果。
如果想要在本地生成json
格式报告,则增加如下参数
扫描器制作
json 格式转换
基于以上内容,关键是把扫描结果转化为极狐 GitLab 旗舰版所识别的 json 格式。
json 样本
SonarQube 扫描结果 issue 样本
极狐 GitLab 报告展现 issue 样本
转换器 converter.py
转码程序采用 python,编写converter.py
文件,内容如下:
scan.sh
基于环境变量进行扫描
Dockerfile
基于
ubuntu:18.04
制作扫描器默认没有 python 环境,安装 python 环境
拷贝提前下载好的 sonar-scanner 到镜像内
设定默认工作目录
复制转换器
构建与推送
制作好的镜像已经推送到 DockerHub 中,采用前文使用方法
中所说的内容即可实现扫描。
Findbugs 支持
安装插件
Server 端安装 Findbugs 插件
到 SonarQube 的容器内部
在插件路径中下载 findbugs 的 jar 包
然后重启 sonar 即可
然后到 sonar 的 UI 上检查是否安装成功,出现如下画面即表示可以。
配置 Java 默认规则
在 sonar UI 上进行如下配置,这样 Java 的默认规则就是 Findbugs 了
Java maven 扫描器制作
因为扫描 Java 项目需要代码经过编译,所以需要对扫描器配置 maven 扫描能力。理论上,通过在 Dockerfile 中添加安装 maven 包即可,但是失败,因此直接在前述步骤构建出的镜像中操作完后 commit 出镜像。操作步骤如下:
安装软件包列表
commit 命令
此时,考虑到参数暴露的问题,仅仅把如下 4 个参数内置到扫描器内部,因此修改scan.sh
文件如下
sonar.host.url
SonarQube Server 地址sonar.login
tokensonar.report.export.path
本地 report.json 路径sonar.analysis.mode=preview
本地预览模式
再更新如上的scan.sh
文件,所以 Dockerfile 更新为
构建出最新镜像
使用
.gitlab-ci.yml
更新
为了支持 Findbug 的触发,需要使用如下配置
扫描结果
参考
问题与风险
从 SonarQube 7.7 版本开始不支持在 scanner 端直接生成 json 报告。
7.7 之前的版本的报告中也未包含特别详细的信息。
评论