本文介绍如何利用OWASP的Dependency-Track存储和分析软件清单,以识别开源组件中的安全漏洞。它指导如何在生产环境中部署Dependency-Track,并总结这个平台的优缺点。
译自 A Practical Approach to SBOM in CI/CD Part II — Deploying Dependency-Track 。
Dependency-Track是一个由OWASP支持的开源持续SBOM分析平台。它的官方描述如下:
Dependency-Track是一个智能组件分析平台,允许组织识别和降低软件供应链中的风险。Dependency-Track采用了一种独特且非常有益的方法,那就是利用软件清单(SBOM)的功能。这种方法可以实现传统的软件组成分析(SCA)解决方案无法实现的功能。
从实际角度来看,Dependency-Track根据上传的SBOM跟踪项目及其关联组件。该平台由以下部分组成:
此外,该平台利用数据库存储其数据。默认情况下使用内嵌的H2数据库,但在生产环境中,建议使用PostgreSQL或Microsoft SQL Server。
可以通过web应用程序UI或公开的API上传SBOM。就API而言,它可以在CI/CD阶段自动更新项目和上传SBOM。下面是一个根据提供的SBOM识别漏洞的项目表示:
在Dependency-Track UI中审核项目漏洞视图
此外,Dependency-Track使用漏洞预测评分系统(EPSS),用于估计软件漏洞被利用的可能性(概率)。EPSS可用于优先进行补救工作排定。
Dependency-Track默认配置使用的漏洞源包括:
漏洞数据库定期更新,默认每24小时一次。
此外,Dependency-Track支持基于漏洞和许可信息设置安全策略并通知违规情况。例如,可以制定只允许特定许可证的策略,示例如下:
最后,Dependency-Track集成众多功能,从漏洞管理流程实现的角度非常有价值。
Dependency-Track 集成
了解Dependency-Track基本信息后,在本地测试一下是个好主意!
实际上,可以用文档提供的Docker Compose轻松部署该平台。但考虑到H2不适合生产,我调整了Compose,改为添加PostgreSQL数据库,也建议开发/本地环境使用PostgreSQL,使环境一致。
我准备了下列Docker Compose内容,可以保存到docker-compose.yaml中:
version: '3.7'
#####################################################
# This Docker Compose file contains three services
# Dependency-Track API Server 4.8.2
# Dependency-Track FrontEnd 4.8.1
# PostgreSQL 16.0
#####################################################
services:
dtrack-apiserver:
image: dependencytrack/apiserver:4.8.2
depends_on:
- postgres-db
environment:
- ALPINE_DATABASE_MODE=external
- ALPINE_DATABASE_URL=jdbc:postgresql://postgres-db:5432/${POSTGRES_DB}
- ALPINE_DATABASE_DRIVER=org.postgresql.Driver
- ALPINE_DATABASE_USERNAME=${POSTGRES_USERNAME}
- ALPINE_DATABASE_PASSWORD=${POSTGRES_PASSWORD}
- ALPINE_CORS_ENABLED=true
- ALPINE_CORS_ALLOW_ORIGIN=${CORS_ALLOW_ORIGIN}
- ALPINE_CORS_ALLOW_METHODS=GET, POST, PUT, DELETE, OPTIONS
- ALPINE_CORS_ALLOW_HEADERS=Origin, Content-Type, Authorization, X-Requested-With, Content-Length, Accept, Origin, X-Api-Key, X-Total-Count, *
- ALPINE_CORS_EXPOSE_HEADERS=Origin, Content-Type, Authorization, X-Requested-With, Content-Length, Accept, Origin, X-Api-Key, X-Total-Count
- ALPINE_CORS_ALLOW_CREDENTIALS=true
- ALPINE_CORS_MAX_AGE=3600
deploy:
resources:
limits:
memory: 12288m
reservations:
memory: 8192m
restart_policy:
condition: on-failure
ports:
- '8081:8080'
volumes:
- 'dependency-track:/data'
restart: unless-stopped
dtrack-frontend:
image: dependencytrack/frontend:4.8.1
depends_on:
- dtrack-apiserver
environment:
- API_BASE_URL=http://localhost:8081
ports:
- "8080:8080"
restart: unless-stopped
postgres-db:
image: postgres:16.0
restart: always
user: postgres
environment:
POSTGRES_USER: ${POSTGRES_USERNAME}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -d ${POSTGRES_DB} -U ${POSTGRES_USERNAME}"]
interval: 1s
timeout: 5s
retries: 10
ports:
- 5432:5432
volumes:
pgdata:
driver: local
dependency-track:
driver: local
另外需要在.env文件中本地保存以下变量:
POSTGRES_USERNAME=dtrack
POSTGRES_PASSWORD=dtrack
POSTGRES_DB=dtrack
CORS_ALLOW_ORIGIN=*
需要注意的是,无论在开发还是生产环境中,都要调整证书变量并安全地存储。此外,CORS_ALLOW_ORIGIN
变量应该设定为与托管Dependency-Track的域名相匹配,因为它会用于“Access-Control-Allow-Origin” HTTP头。在生产环境中,不建议为这个HTTP头使用通配符(*)。有关CORS的更多信息,可以参考PortSwigger的一篇文章。
现在,可以通过在同一目录下执行以下命令启动该平台:
docker compose --env-file .env up
几分钟后,应用程序就可以在 http://localhost:8080/ 上访问了。默认的用户名和密码是 admin:admin。
Login Panel — Dependency-Track
可以使用社区管理的Helm Chart在K8s上部署该平台。 在写这篇文章时,Helm Chart使用了最新版本的Dependency-Track容器镜像,并使用了版本为10.10的PostgreSQL。
为了演示的目的,我决定在本地的Minikube上部署该平台。这对生产环境来说并不推荐,但足以展示如何将Dependency-Track部署到K8s。由于我的私人开发环境基于WSL2,我按照下面的文章在本地配置了Minikube:
在WSL2上通过Minikube搭建Kubernetes [2023]
按照文章中的一系列命令后,我成功地在本地部署了Minikube。 在我的情况下,我需要使用Minikube CLI配置4个CPU来创建集群。 此外,我还需要启用NGINX Ingress插件。 相关命令如下:
minikube start --cpus=4
minikube addons enable ingress
在本地启动Minikube
准备好K8s环境后,需要安装Helm。Helm是Kubernetes的包管理器。各个系统的安装过程在官方文档中都有描述。
由于我们已经安装了所有先决条件,我们可以通过执行以下命令开始实际部署Dependency-Track:
# add Helm repository with chart for Dependency-Track
# Helm chart is available at:
# https://github.com/evryfs/helm-charts/tree/master/charts/dependency-track
helm repo add evryfs-oss https://evryfs.github.io/helm-charts/
# deploy Dependency-Track in a namespace named dependency-track
helm install dependency-track evryfs-oss/dependency-track \
--namespace dependency-track \
--create-namespace \
--set ingress.enabled=true \
--set ingress.tls.enabled=true \
--set ingress.host=kubernetes.docker.internal # adjust the host
# I recommend to override below credentials used by PostgreSQL db in prod
# --set postgresql.postgresqlUsername=
# --set postgresql.postgresqlPassword=
可以注意到,我通过Helm install命令中的--set参数设置了一些图表变量。这些变量可以在values.yaml中找到。
执行命令后,您应该会看到类似下面的输出:
NAME: dependency-track
LAST DEPLOYED: Sat Sep 23 13:54:11 2023
NAMESPACE: dependency-track
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
现在,让我们通过运行几条命令来验证资源是否已在K8s中部署:
$ kubectl get namespaces
NAME STATUS AGE
default Active 19m
dependency-track Active 2m42s
kube-node-lease Active 19m
kube-public Active 19m
kube-system Active 19m
kubectl get pods --namespace=dependency-track
NAME READY STATUS RESTARTS AGE
dependency-track-apiserver-6b9c86776-djwx8 1/1 Running 2 (2m20s ago) 2m38s
dependency-track-frontend-55c79cdb4c-69rjl 1/1 Running 0 2m38s
dependency-track-frontend-55c79cdb4c-z4t8n 1/1 Running 0 2m38s
dependency-track-postgresql-0 1/1 Running 0 2m38s
部署可能需要几分钟时间,所以要耐心等待。 如果状态列中显示任何错误,为了调试,我建议使用以下命令获取pod的日志:
# get logs for the ${POD_NAME}
kubectl logs ${POD_NAME} --namespace=dependency-track
# get pod details with events shown at the bottom of output
# events section is useful when debugging pod start issues
kubectl describe pod ${POD_NAME} --namespace=dependency-track
当所有的pod都启动并运行后,您就可以通过指定的主机和Web浏览器访问Dependency-Track了。 在我的情况下,由于我在Minikube上运行它,所以我需要通过minikube tunnel
命令将流量隧道传输到暴露的Ingress控制器。完成这些步骤后,我在浏览器中打开了该Web应用程序,使用默认凭据登录,并看到了以下 Dashboard:
Dashboard — Dependency-Track
在这篇文章中,我介绍了Dependency-Track平台,重点概述了它的功能,以及使用Docker Compose和Kubernetes环境中的Helm Chart进行潜在部署的方法。 在生产环境中部署这些方法时,必须考虑进行额外的调整。 例如,您可能需要为Kubernetes Ingress获取有效的HTTPS证书,或者通过文件或CLI中的机密存储来安全管理敏感信息。 但是,这些调整非常具体,取决于您的环境和选择的方法。 我的主要目的是向您提供执行部署的基本概念。
让我们总结下该平台的优缺点:
优点:
...以及官方文档中还描述了许多其他功能。
缺点: