mathiasconradt/sonarqube-cdx-sunshine-plugin
GitHub: mathiasconradt/sonarqube-cdx-sunshine-plugin
一个 SonarQube 社区插件,将 CycloneDX Sunshine SBOM 交互式可视化(旭日图、组件表、漏洞表)直接集成到 SonarQube 项目页面中。
Stars: 1 | Forks: 0
# SonarQube SBOM 可视化插件
 [](https://sonarcloud.io/summary/new_code?id=mathiasconradt_sonarqube-sbom-visualization-plugin)
一个 SonarQube 插件,将 [CycloneDX Sunshine](https://github.com/CycloneDX/Sunshine) SBOM 可视化功能直接集成到 SonarQube 的各个项目中。
对于每个项目,它会从 SonarQube 的 SCA API 获取 CycloneDX SBOM 和依赖风险(CVE)数据,将漏洞数据合并到 SBOM 中,并在 SonarQube 内渲染完整的 Sunshine 交互式可视化内容——包括旭日图依赖图表、组件表和漏洞表。
## 免责声明
这是一个社区插件。它不是由 Sonar 提供的官方插件,也不受 Sonar 支持。它已经过 SonarQube Server 2026.1 及更高版本的测试。
此插件仅适用于启用了 Sonar Advanced Security 的 SonarQube Server 企业版实例。它依赖 Sonar 的 SCA API 来获取 CycloneDX SBOM 和依赖风险数据,因此项目必须使用可用的软件成分分析进行分析。
## 截图


## 要求
- SonarQube 2026.x(使用插件 API 12.x)
- 已启用 SonarQube SCA(软件成分分析)并完成项目分析
- Java 17+(构建)
- Maven 3.8+(构建)
## 工作原理
1. 通过插件的管理页面存储一次 SonarQube token。
2. 当用户在项目上打开 **SBOM Visualization** 标签页时,插件会列出可用的分支并预选默认分支。对于选定的分支,它会调用:
- `GET /api/v2/sca/sbom-reports?component={key}&type=cyclonedx&branch={branch}` — CycloneDX SBOM
- `GET /api/v2/sca/risk-reports?component={key}&branch={branch}` — 依赖漏洞风险
- `GET /api/project_analyses/search?project={key}&branch={branch}&ps=1` — 上次扫描时间戳(用于缓存验证)
3. Java 后端通过匹配 `packageUrl` (purl) 将 CVE/风险数据合并到 SBOM 中,然后将结果缓存在服务器文件系统上。只要没有运行新的扫描,后续对同一项目/分支的加载将从缓存中提供。
4. 富化的 CycloneDX JSON 被传递给 Sunshine 可视化引擎的 JavaScript 移植版本,该引擎会渲染:
- 一个分支选择器下拉菜单(预选默认分支)
- 一个 **↺ Refresh** 按钮,用于绕过缓存并强制重新生成
- 一个所有依赖项的交互式旭日图,根据最高漏洞严重程度进行颜色编码
- 一个仅显示易受攻击组件的切换开关
- 上次扫描和可视化生成的时间戳(以浏览器本地时区显示)
- 一个可搜索、分页的组件表,包含依赖关系、直接/传递漏洞和许可证
- 一个可搜索、分页的漏洞表,包含受影响的组件
## 构建
```
mvn package
```
插件 JAR 将被写入 `target/sonarqube-cdx-sunshine-plugin-.jar`。
## 部署
### 标准
将 JAR 复制到 SonarQube 的插件目录并重启:
```
cp target/sonarqube-cdx-sunshine-plugin-*.jar $SONARQUBE_HOME/extensions/plugins/
# 重启 SonarQube
```
### Docker
如果 SonarQube 在带有名为 `sonarqube_extensions` 卷的 Docker 中运行:
```
mvn package
docker cp target/sonarqube-cdx-sunshine-plugin-*.jar \
sonarqube:/opt/sonarqube/extensions/plugins/
docker restart sonarqube
```
`/opt/sonarqube/extensions/plugins/` 位于名为 `sonarqube_extensions` 的卷上,因此即使容器以 `read_only: true` 运行,它也保持可写状态。
要移除插件:
```
docker exec sonarqube rm /opt/sonarqube/extensions/plugins/sonarqube-cdx-sunshine-plugin-*.jar
docker restart sonarqube
```
## 配置
1. 以管理员身份登录 SonarQube。
2. 转到 **Administration → Configuration → SBOM Visualization**。
3. 配置用于读取项目 SBOM 和 SCA 数据的 SonarQube token。
4. 可选择调整大型项目限制,当依赖图过大导致浏览器无法渲染时,这些限制会将项目页面切换为仅表格模式。
5. 点击 **Save**。
插件设置作为全局 SonarQube 设置存储。
## 页面
| 页面 | 在 SonarQube 中的位置 |
|------|-----------------------|
| 插件管理 | Administration → Configuration → SBOM Visualization |
| 单个项目可视化 | Project → Analysis → SBOM Visualization |
## 许可证
根据 **Apache License, Version 2.0** 授权 — 详见 [LICENSE](LICENSE)。
### 第三方组件
**可视化逻辑** — [`src/main/resources/static/project.js`](src/main/resources/static/project.js) 是 [CycloneDX Sunshine](https://github.com/CycloneDX/Sunshine) Python 实现的 JavaScript 移植版:
**图表库** — [`src/main/resources/static/echarts.min.js`](src/main/resources/static/echarts.min.js) 是 [Apache ECharts](https://echarts.apache.org/):
标签:CVE, CycloneDX, DevSecOps, JS文件枚举, Maven, Mutation, SBOM, SonarQube, WebSocket, 上游代理, 交互式图表, 企业安全, 企业版, 依赖分析, 可视化, 安全合规, 插件, 数字签名, 数据可视化, 旭日图, 漏洞验证, 硬件无关, 组件安全, 网络代理, 网络安全, 网络资产管理, 自定义脚本, 请求拦截, 跌倒检测, 软件物料清单, 隐私保护