前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CI/CD中SBOM的实用方法第二部分—部署Dependency-Track

CI/CD中SBOM的实用方法第二部分—部署Dependency-Track

作者头像
云云众生s
发布2024-03-28 13:59:12
6580
发布2024-03-28 13:59:12
举报
文章被收录于专栏:云云众生s

本文介绍如何利用OWASP的Dependency-Track存储和分析软件清单,以识别开源组件中的安全漏洞。它指导如何在生产环境中部署Dependency-Track,并总结这个平台的优缺点。

译自 A Practical Approach to SBOM in CI/CD Part II — Deploying Dependency-Track

什么是 Dependency-Track?

Dependency-Track是一个由OWASP支持的开源持续SBOM分析平台。它的官方描述如下:

Dependency-Track是一个智能组件分析平台,允许组织识别和降低软件供应链中的风险。Dependency-Track采用了一种独特且非常有益的方法,那就是利用软件清单(SBOM)的功能。这种方法可以实现传统的软件组成分析(SCA)解决方案无法实现的功能。

从实际角度来看,Dependency-Track根据上传的SBOM跟踪项目及其关联组件。该平台由以下部分组成:

  • API服务器
  • 托管UI静态文件前端服务器

此外,该平台利用数据库存储其数据。默认情况下使用内嵌的H2数据库,但在生产环境中,建议使用PostgreSQL或Microsoft SQL Server。

可以通过web应用程序UI或公开的API上传SBOM。就API而言,它可以在CI/CD阶段自动更新项目和上传SBOM。下面是一个根据提供的SBOM识别漏洞的项目表示:

在Dependency-Track UI中审核项目漏洞视图

此外,Dependency-Track使用漏洞预测评分系统(EPSS),用于估计软件漏洞被利用的可能性(概率)。EPSS可用于优先进行补救工作排定。

Dependency-Track默认配置使用的漏洞源包括:

  • 国家漏洞数据库(National Vulnerability Database),
  • GitHub Advisories,
  • Google OSV Advisories(Beta)

漏洞数据库定期更新,默认每24小时一次。

此外,Dependency-Track支持基于漏洞和许可信息设置安全策略并通知违规情况。例如,可以制定只允许特定许可证的策略,示例如下:

最后,Dependency-Track集成众多功能,从漏洞管理流程实现的角度非常有价值。

Dependency-Track 集成

使用Docker Compose在开发/本地环境部署Dependency-Track

了解Dependency-Track基本信息后,在本地测试一下是个好主意!

实际上,可以用文档提供的Docker Compose轻松部署该平台。但考虑到H2不适合生产,我调整了Compose,改为添加PostgreSQL数据库,也建议开发/本地环境使用PostgreSQL,使环境一致。

我准备了下列Docker Compose内容,可以保存到docker-compose.yaml中:

代码语言:javascript
复制
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文件中本地保存以下变量:

代码语言:javascript
复制
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的一篇文章

现在,可以通过在同一目录下执行以下命令启动该平台:

代码语言:javascript
复制
docker compose --env-file .env up

几分钟后,应用程序就可以在 http://localhost:8080/ 上访问了。默认的用户名和密码是 admin:admin。

Login Panel — Dependency-Track

在Kubernetes中部署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插件。 相关命令如下:

代码语言:javascript
复制
minikube start --cpus=4
minikube addons enable ingress

在本地启动Minikube

准备好K8s环境后,需要安装Helm。Helm是Kubernetes的包管理器。各个系统的安装过程在官方文档中都有描述。

由于我们已经安装了所有先决条件,我们可以通过执行以下命令开始实际部署Dependency-Track:

代码语言:javascript
复制
# 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中找到。

执行命令后,您应该会看到类似下面的输出:

代码语言:javascript
复制
NAME: dependency-track
LAST DEPLOYED: Sat Sep 23 13:54:11 2023
NAMESPACE: dependency-track
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:

现在,让我们通过运行几条命令来验证资源是否已在K8s中部署:

代码语言:javascript
复制
$ 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的日志:

代码语言:javascript
复制
# 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中的机密存储来安全管理敏感信息。 但是,这些调整非常具体,取决于您的环境和选择的方法。 我的主要目的是向您提供执行部署的基本概念。

让我们总结下该平台的优缺点:

优点:

  • 免费开源,
  • 可以通过UI和API上传SBOM,
  • API丰富且文档完善,
  • EPSS用于优先确定补救措施,
  • 社区支持许多集成,
  • 与其他类似解决方案相比,UI显得更加现代。

...以及官方文档中还描述了许多其他功能。

缺点:

  • 仅支持CycloneDX SBOM格式,
  • 需要一定的部署和配置工作。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-212,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Dependency-Track?
  • 使用Docker Compose在开发/本地环境部署Dependency-Track
  • 在Kubernetes中部署Dependency-Track
  • 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档