前文讲到了利用DependencyTrack对代码进行SCA分析,但是当时是通过手动上传BOM并在UI上进行展示查阅,对于安全左移DevSecOps来说,必然需要在应用编码、构建阶段就对其进行安全分析,如果发现安全风险则禁止构建和部署。编码阶段可以使用类似IDEA插件来实现,本文将通过CI流水线来实现SCA分析。
本文不去讲解如何搭建Gitlab和对应的CI,只讲如何实现SCA的流水线。Gitlab的CI流水线可以在项目中创建一个.gitlab-ci.yml的文件,在里面控制好相应的步骤,如build、deploy,然后分别设置每个步骤都所需步骤。通过dependencies可以设置流水线所需要的前置步骤,来完成必要的顺序执行。其中详细步骤中,script可以使用shell代码,当不想流水线继续时,可以使用exit 1返回非0的状态码,这样流水线就会结束且不会往后执行。
根据https://docs.dependencytrack.org/usage/cicd/文档,可以在上传bom时自动创建项目,省去创建项目的前置步骤。笔者没有发现DependencyTrack有手动分析bom的API接口,看起来是上传bom后自动分析的,因此需要在流水线中上传bom后等待一点时间,给其分析的时间,bom越大分析时间越长,使用DependencyTrack API时,需要注意赋予BOM_UPLOAD、PROJECT_CREATION_UPLOAD、VULNERABILITY_ANALYSIS权限。
测试
首先以python项目为例,使用cyclonedx-bom完成bom的生成。然后在requirements.txt存放一个不存在漏洞的软件包:
这时候触发gitlab流水线是没问题的:
但是如果存放存在漏洞的软件包时,流水线停在了sca,不再往build执行:
这样可以杜绝漏洞风险包上线。
附 流水线
stages:
- sbom
- sca
- build
variables:
DT_API_KEY: keykeykeyjjjjjjj
DT_SERVER_URL: http://www.chinabaiker.com:8081
# 生成 SBOM 的阶段
generate_sbom:
stage: sbom
image: python:3.9
before_script:
- pip install cyclonedx-bom -i https://pypi.tuna.tsinghua.edu.cn/simple/
script:
- cyclonedx-py requirements -o bom.xml
artifacts:
paths:
- bom.xml
# 进行 SCA 扫描的阶段
sca_scan:
stage: sca
image: ubuntu:latest
dependencies:
- generate_sbom
script:
- apt-get update -y
- apt-get install jq curl -y
- echo 111111
- echo ${DT_SERVER_URL}
- >
UPLOAD_RESPONSE=$(curl -s -X POST "${DT_SERVER_URL}/api/v1/bom" \
-H "Content-Type: multipart/form-data" \
-H "X-Api-Key: ${DT_API_KEY}" \
-F "projectName=${CI_PROJECT_NAME}" \
-F "projectVersion=${CI_COMMIT_REF_NAME}" \
-F "bom=@bom.xml"\
-F "autoCreate=true")
- echo 111111
- echo ${DT_SERVER_URL}
- echo ${UPLOAD_RESPONSE}
- >
PROJECT_ID=$(curl "${DT_SERVER_URL}/api/v1/project/lookup?name=${CI_PROJECT_NAME}&version=${CI_COMMIT_REF_NAME}" \
-H "Content-Type: application/json" \
-H "X-Api-Key: ${DT_API_KEY}" | jq -r '.uuid')
- echo ${PROJECT_ID}
- sleep 30 # 等待扫描结果生成
- |
RESULT=$(curl "${DT_SERVER_URL}/api/v1/finding/project/${PROJECT_ID}" -H "Content-Type: application/json" -H "X-Api-Key: ${DT_API_KEY}")
HIGH_CRITICAL_RESULT=$(echo $RESULT | jq '[.[] | select(.vulnerability.severity == "HIGH" or .vulnerability.severity == "CRITICAL")]')
echo ${HIGH_CRITICAL_RESULT}
HIGH_CRITICAL_COUNT=$(echo $RESULT | jq '[.[] | select(.vulnerability.severity == "HIGH" or .vulnerability.severity == "CRITICAL")] | length')
if [ "$HIGH_CRITICAL_COUNT" -gt 0 ]; then
echo "High severity vulnerabilities found: $HIGH_COUNT"
exit 1
else
echo "No high severity vulnerabilities found."
fi
allow_failure: false
only:
- branches
# 构建阶段
build:
stage: build
script:
- echo "Building project..."
dependencies:
- sca_scan
only:
- branches
本文讲解了利用DependencyTrack完成Devsecops中的SCA分析,保证了代码安全。