基于开源工具实现软件成分分析SCA
字数 1928 2025-08-27 12:33:43
基于开源工具实现软件成分分析(SCA)教学文档
1. SCA概述
1.1 什么是SCA
SCA(Software Composition Analysis)即软件成分分析,通过分析源码提取项目依赖的第三方组件及其版本、许可证等信息,生成软件物料清单(SBOM, Software Bill-of-Materials)。根据SBOM可以:
- 分析项目是否使用了存在已知漏洞的组件
- 当其他组件爆出漏洞时可快速排查受影响项目
- 管理软件供应链安全
1.2 SCA实现思路
- 多语言支持:必须支持Java、GO、Python、NodeJs等主流语言
- 文件分析:通过分析各语言的依赖描述文件提取组件信息
- Java: pom.xml
- Go: go.mod
- Python: requirements.txt
- NodeJs: yarn.lock
- DevOps集成:能够柔和地接入现有DevOps工具链
- 漏洞库来源:需要整合多个漏洞数据库(OSSIndex、NVD、Npm、Cpe等)
2. 开源工具介绍
2.1 CycloneDX
OWASP基金会下的轻量级软件物料清单标准工具:
- 生成JSON或XML格式的软件成分清单
- 支持大部分常见语言
- 提供多种工具及lib库
2.2 Dependency-Track
OWASP基金会下的风险分析工具:
- 接收SBOM文件自动分析项目风险
- 支持下载漏洞库
- 提供丰富的API
- 可简单嵌入CI/CD流程
3. 环境搭建
3.1 Dependency-Track部署
使用Docker方式部署,配置docker-compose.yml:
version: '3.7'
volumes:
dependency-track:
postgres-volume:
services:
db:
image: postgres
environment:
- POSTGRES_USER=dtrack_postgres_user
- POSTGRES_PASSWORD=dtrack_postgres_passwd
- POSTGRES_DB=dtrack
volumes:
- 'postgres-volume:/var/lib/postgresql/data'
restart: always
dtrack-apiserver:
image: dependencytrack/apiserver
depends_on:
- db
environment:
- ALPINE_DATABASE_MODE=external
- ALPINE_DATABASE_URL=jdbc:postgresql://db:5432/dtrack
- ALPINE_DATABASE_DRIVER=org.postgresql.Driver
- ALPINE_DATABASE_USERNAME=dtrack_postgres_user
- ALPINE_DATABASE_PASSWORD=dtrack_postgres_passwd
deploy:
resources:
limits:
memory: 12288m
reservations:
memory: 8192m
restart_policy:
condition: on-failure
ports:
- '8288:8080'
volumes:
- 'dependency-track:/data'
restart: unless-stopped
dtrack-frontend:
image: dependencytrack/frontend
depends_on:
- dtrack-apiserver
environment:
- API_BASE_URL=http://10.1.1.70:8288
ports:
- "8188:8080"
restart: unless-stopped
部署完成后:
- 访问
http://your-ip:8188 - 使用默认账号
admin/admin登录 - 初次运行需等待漏洞库下载完成
4. 软件成分分析实践
4.1 Java项目分析
- 工具安装:使用cyclonedx-maven-plugin
- 示例项目:cachecloud
- 生成SBOM:
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom - SBOM内容:包含组件名称、版本、purl、描述、licenses等信息
- 上传分析:
- 在Dependency-Track中创建项目
- 上传生成的bom.xml文件
4.2 Go项目分析
- 工具安装:使用cyclonedx-gomod
go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest - 示例项目:goploy
- 生成SBOM:
cyclonedx-gomod mod -json -output goploy.bom.json goploy - 上传分析:将生成的goploy.bom.json上传到Dependency-Track
4.3 Python项目分析
- 工具安装:使用cyclonedx-python
pip install cyclonedx-bom - 示例项目:Mobile-Security-Framework-MobSF
- 生成SBOM:
cyclonedx-bom -r -i requirements.txt --format=json -o mobsf.bom.json - 上传分析:将生成的mobsf.bom.json上传到Dependency-Track
5. 集成到DevOps流程
5.1 Jenkins插件方式
- 安装插件:Dependency-Track插件
- 配置API Key:
- 在Dependency-Track中创建Team并记录API Key
- 在Jenkins中添加Secret text类型的凭据
- 配置插件:
- 在Manage Jenkins -> Configure System中配置Dependency-Track URL和API Key
- 项目配置:
- 在Source Code Management中添加Git仓库
- 在Build中添加生成SBOM的命令
- 在Post-build Actions中添加"Publish BOM to Dependency-Track"
5.2 Pipeline脚本方式
pipeline {
agent any
stages {
stage('Start') {
steps {
echo 'Hello World'
}
}
stage('Build') {
steps {
git 'https://github.com/sohutv/cachecloud.git'
sh "mvn -DskipTests=true clean package"
}
}
stage('Generating SBOM with Cyclonedx') {
steps {
sh 'mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom'
}
}
stage('dependencyTrackPublisher') {
steps {
withCredentials([string(credentialsId: 'dtrack', variable: 'API_KEY')]) {
dependencyTrackPublisher artifact: 'target/bom.xml',
projectName: 'my-project',
projectVersion: '12',
autoCreateProjects: true,
dependencyTrackApiKey: API_KEY,
synchronous: false
}
}
}
}
}
6. 最终效果
通过CycloneDX + Dependency-Track实现:
- 分析项目中第三方组件漏洞
- 快速定位受影响范围
- 推动业务线进行漏洞修复
- 实现软件供应链安全管理
7. 参考资源
- CycloneDX Maven插件: https://github.com/CycloneDX/cyclonedx-maven-plugin
- CycloneDX Go插件: https://github.com/CycloneDX/cyclonedx-gomod
- CycloneDX Python插件: https://github.com/CycloneDX/cyclonedx-python
- Dependency-Track Jenkins插件: https://plugins.jenkins.io/dependency-track/
- Pipeline参数文档: https://www.jenkins.io/doc/pipeline/steps/dependency-track/