暂无简介
企业开发过程中难免会使用到大量开源组件,然而近期fastjosn、log4j、spring等多个常用组件频频爆出严重漏洞,甲方安全工作人员不是在应急就是跑在应急的路上,排查影响范围、版本升级、组件替换搞的大家心力交瘁。为了快速、全面、准确的排查出企业内哪些应用使用了漏洞组件,解决软件供应链安全问题,SCA技术近日成了热点。本文将介绍SCA的基本概念以及通过开源工具实现SCA的方式。
SCA介绍
什么是SCA ?
SCA(Software Composition Analysis)即软件成分分析,通过分析源码提取项目依赖的第三方组件及其版本、许可证等信息,生成软件物料清单(SBOM,Software Bill-of-Materials),根据SBOM分析项目是否使用了存在已知漏洞的组件,后期其它组件爆出漏洞时也可根据SBOM快速排查受影响项目。
SCA实现思路
首先为了能够尽量覆盖所有的项目实现软件成分分析,一定要适应现在多语言开发的情况,企业往往是用了很多种语言进行各种项目的开发,所以SCA工具一定要能支持多种语言,最起码比如Java、GO、Python、NodeJs等主流语言要覆盖到。
对于以上三种语言,可以通过分析pom.xml
、go.mod
、requirements.txt
、yarn.lock
等文件中的关键字段,提取项目依赖的第三方组件的名称、版本等信息,从而实现软件成分分析。此处难点在于开发语言较多,所以需要较大的开发量实现语言种类的覆盖。
其次为了方便的嵌入现有的DevOps流程实现DevSecOps,就要求SCA工具使用上要简单,可以柔和地接入现有DevOps工具链,减少对现有DevOps流程的影响,这也是DevSecOps提倡的原则。
最后是漏洞库来源,为了能够尽可能多的识别项目中的已知漏洞,我们需要增加漏洞来源,可以通过定期爬取OSSIndex、NVD、Npm、Cpe等网站,解析漏洞信息,实现扩充漏洞数据库。
通过开源工具实现SCA
CycloneDx是OWASP基金会下的一款轻量级软件物料清单标准,用于实现程序安全上下文和供应链安全分析。CycloneDx项目提供了一系列工具及lib库,用于生成JSON或XML格式的软件成分清单,该项目支持大部分常见语言,使用简单,非常满足我们的需求。
Dependency-Track也是OWASP基金会下的一款工具,Dependency-Track通过接收软件成分清单,自动分析项目存在的风险。而且Dependency-Track支持下载漏洞库、API丰富,可以非常简单的嵌入CI/CD流程。
环境搭建
Dependency-Track部署
Dependency-Track支持Docker、WAR包等多种部署方式,这里参考官方说明文档,通过Docker的方式进行部署,使用postgres数据库。
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:
# Database Properties
- 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:
# 此处需要注意,修改URL为dtrack-apiserver地址
- API_BASE_URL=http://10.1.1.70:8288
ports:
- "8188:8080"
restart: unless-stopped
运行成功后访问http://your-ip:8188 ,使用admin/admin
登录即可,初次运行尽量不要打断,因为Dependency-Track需要下载漏洞库。
至此,Dependency-Track已经可以使用了。
进行软件成分时,使用CycloneDX工具生成SBOM文件,然后在Dependency-Track的【Projects】中新建项目,最后上传SBOM文件即可自动完成分析。
分析Java程序示例
CycloneDX工具: https://github.com/CycloneDX/cyclonedx-maven-plugin
下载待分析项目源码:https://github.com/sohutv/cachecloud
,然后使用cyclonedx-maven-plugin生成SBOM文件:mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom
,如下所示:
生成的SBOM文件如下,可以看到包含了组件的名称、版本、purl、描述、licenses等信息:
接着在Dependency-Track的【Projects】中新建一个名为cachecloud
的项目,
项目创建完成后,进入项目,选择【Components】标签,最后上传BOM文件即可
稍候即可看到Dependency-Track根据上传的BOM文件,分析出了项目组件及其漏洞信息:
分析Go程序示例
CycloneDX工具: https://github.com/CycloneDX/cyclonedx-gomod
使用如下命令安装即可:
go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest
下载待分析项目源码:https://github.com/zhenorzz/goploy
,然后使用cyclonedx-gomod生成SBOM文件:cyclonedx-gomod mod -json -output goploy.bom.json goploy
将生成的goploy.bom.json上传到Dependency-Track的Project下,即可自动分析goploy项目的软件成分及存在的漏洞。
分析Python程序示例
CycloneDX工具: https://github.com/CycloneDX/cyclonedx-python
使用以下命令安装即可:pip install cyclonedx-bom
下载待分析项目源码:https://github.com/MobSF/Mobile-Security-Framework-MobSF
,然后使用cyclonedx-bom生成SBOM文件:cyclonedx-bom -r -i requirements.txt --format=json -o mobsf.bom.json
将SCA嵌入DevOps流程
DevSecOps的一大原则就是安全自动化,将上述过程嵌入现有的DevOps流程,保证每次CI/CD过程自动化的生成项目的SBOM并发送给Dependency-Track完成分析,如此可大大减少安全人员工作量。
Dependency-Track对API的支持良好,所以可通过脚本串联整个过程,然后加入CI/CD流程中。当然,Dependency-Track也有Jenkins插件可以协助我们完成这个过程。
Jenkins安装DTrack插件
插件地址:https://plugins.jenkins.io/dependency-track/
首先在Dependency-Track中点击【Administration】-> 【Access Management】->【Teams】,创建一个Team并记录其API Key。
然后在Jenkins中点击【Manager Jenkins】->【Manage Plugins】,搜索"Dependency-Track"并安装插件。
配置Dependency-Track插件,点击【Manager Jenkins】->【Configure System】,找到Dependency-Track,在“Dependency-Track Backend URL”填写Dependency-Track的URL及对应的API Key(点击Add,Kind选择“Secret text”,在Secret处填入API Key即可)。
Cyclonedx + DTrack插件自动化SCA
在Jenkins中新建项目,进入项目点击【Configure】
- 在【Source Code Management】处选择“Git”,然后填入Repository URL
- 在【Build】处选择“Execute Shell”,然后输入构建语句,并添加
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom
生成sbom文件 - 在【Post-build Actions】处选择“Publish BOM to Dependency-Track”,填写project name 和 project version,在“Artifact”处输入
${WORKSPACE}/target/bom.json
- 点击【Save】,返回后点击【Build Now】既可。
查看构建结果可以可以看到,已经成功生成软件成分清单并上传至Dependency-Track,
Jenkins的Pipeline脚本完成自动化SCA
在Jenkins新建Pipeline项目,在项目的Configure下Pipeline标签选择Pipeline Script,写入以下内容:
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
}
}
}
}
}
Dependency-Track Jenkins Pipeline参数: https://www.jenkins.io/doc/pipeline/steps/dependency-track/
构建结果:
最终效果
参照上述介绍的思路,笔者基于 CycloneDX + Dependency-Track 实现了软件成分分析,最终在企业内部实现了落地。初步实现了分析项目中第三方组件漏洞的效果,后续某组件爆出漏洞后,也可以快速定位受影响范围,推动业务线进行漏洞修复。
- 本文作者: myc
- 本文来源: 先知社区
- 原文链接: https://xz.aliyun.com/t/11492
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!