如今的软件开发几乎都会用到各种开源组件,我统计过公司一个不算大的项目,使用的开源组件数量就有300个之多,开源组件的安全问题越来越受到重视。dependency track是OWASP组织个一个开源项目,它可以实时分析依赖组件并识别漏洞,降低团队软件组件供应链的使用风险。dependency track的原理是分析生成的SBOM软件物料清单,依据同步的漏洞数据库识别出组件漏洞信息,本文介绍如何安装和使用dependency track工具。
安装
使用docker-compose安装时,需要确保Docker环境已搭建完成(参见windows系统下docker开发环境搭建)。如果你通过Docker Desktop for windows安装了Docker,就不用担心,因为默认会安装好docker-compose。
curl -LO https://dependencytrack.org/docker-compose.yml
# 启动容器之前如果需要修改数据库配置,则参考下面的步骤修改docker-compose.yml文件
docker-compose up -d
默认情况下使用的是内置数据库,但官方不建议在生产环境用此数据库,因此以PostgreSQL数据库为例(可参考使用 Docker 安装 PostgreSQL 数据库进行环境搭建),在docker-compose.yml文件中修改dtrack-apiserver数据库部分的配置,具体参数根据实际情况进行定制。
version: '3.7'
#####################################################
# This Docker Compose file contains two services
# Dependency-Track API Server
# Dependency-Track FrontEnd
#####################################################
volumes:
dependency-track:
services:
dtrack-apiserver:
image: dependencytrack/apiserver
environment:
# The Dependency-Track container can be configured using any of the
# available configuration properties defined in:
# https://docs.dependencytrack.org/getting-started/configuration/
# All properties are upper case with periods replaced by underscores.
#
# Database Properties
- ALPINE_DATABASE_MODE=external
- ALPINE_DATABASE_URL=jdbc:postgresql://192.168.19.103:5432/dtrack
- ALPINE_DATABASE_DRIVER=org.postgresql.Driver
- ALPINE_DATABASE_USERNAME=dtrack
- ALPINE_DATABASE_PASSWORD=changeme
- ALPINE_DATABASE_POOL_ENABLED=true
- ALPINE_DATABASE_POOL_MAX_SIZE=20
- ALPINE_DATABASE_POOL_MIN_IDLE=10
- ALPINE_DATABASE_POOL_IDLE_TIMEOUT=300000
- ALPINE_DATABASE_POOL_MAX_LIFETIME=600000
#
# Optional LDAP Properties
# - ALPINE_LDAP_ENABLED=true
# - ALPINE_LDAP_SERVER_URL=ldap://ldap.example.com:389
# - ALPINE_LDAP_BASEDN=dc=example,dc=com
# - ALPINE_LDAP_SECURITY_AUTH=simple
# - ALPINE_LDAP_BIND_USERNAME=
# - ALPINE_LDAP_BIND_PASSWORD=
# - ALPINE_LDAP_AUTH_USERNAME_FORMAT=%s@example.com
# - ALPINE_LDAP_ATTRIBUTE_NAME=userPrincipalName
# - ALPINE_LDAP_ATTRIBUTE_MAIL=mail
# - ALPINE_LDAP_GROUPS_FILTER=(&(objectClass=group)(objectCategory=Group))
# - ALPINE_LDAP_USER_GROUPS_FILTER=(member:1.2.840.113556.1.4.1941:={USER_DN})
# - ALPINE_LDAP_GROUPS_SEARCH_FILTER=(&(objectClass=group)(objectCategory=Group)(cn=*{SEARCH_TERM}*))
# - ALPINE_LDAP_USERS_SEARCH_FILTER=(&(objectClass=user)(objectCategory=Person)(cn=*{SEARCH_TERM}*))
# - ALPINE_LDAP_USER_PROVISIONING=false
# - ALPINE_LDAP_TEAM_SYNCHRONIZATION=false
#
# Optional OpenID Connect (OIDC) Properties
# - ALPINE_OIDC_ENABLED=true
# - ALPINE_OIDC_ISSUER=https://auth.example.com/auth/realms/example
# - ALPINE_OIDC_CLIENT_ID=
# - ALPINE_OIDC_USERNAME_CLAIM=preferred_username
# - ALPINE_OIDC_TEAMS_CLAIM=groups
# - ALPINE_OIDC_USER_PROVISIONING=true
# - ALPINE_OIDC_TEAM_SYNCHRONIZATION=true
#
# Optional HTTP Proxy Settings
# - ALPINE_HTTP_PROXY_ADDRESS=proxy.example.com
# - ALPINE_HTTP_PROXY_PORT=8888
# - ALPINE_HTTP_PROXY_USERNAME=
# - ALPINE_HTTP_PROXY_PASSWORD=
# - ALPINE_NO_PROXY=
#
# Optional HTTP Outbound Connection Timeout Settings. All values are in seconds.
# - ALPINE_HTTP_TIMEOUT_CONNECTION=30
# - ALPINE_HTTP_TIMEOUT_SOCKET=30
# - ALPINE_HTTP_TIMEOUT_POOL=60
#
# Optional Cross-Origin Resource Sharing (CORS) Headers
# - ALPINE_CORS_ENABLED=true
# - ALPINE_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
#
# Optional metrics properties
# - ALPINE_METRICS_ENABLED=true
# - ALPINE_METRICS_AUTH_USERNAME=
# - ALPINE_METRICS_AUTH_PASSWORD=
#
# Optional environmental variables to enable default notification publisher templates override and set the base directory to search for templates
# - DEFAULT_TEMPLATES_OVERRIDE_ENABLED=false
# - DEFAULT_TEMPLATES_OVERRIDE_BASE_DIRECTORY=/data
#
# Optional configuration for the Snyk analyzer
# - SNYK_THREAD_BATCH_SIZE=10
#
# Optional environmental variables to provide more JVM arguments to the API Server JVM, i.e. "-XX:ActiveProcessorCount=8"
# - EXTRA_JAVA_OPTIONS=
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
depends_on:
- dtrack-apiserver
environment:
# The base URL of the API server.
# NOTE:
# * This URL must be reachable by the browsers of your users.
# * The frontend container itself does NOT communicate with the API server directly, it just serves static files.
# * When deploying to dedicated servers, please use the external IP or domain of the API server.
- API_BASE_URL=http://localhost:8081
# - "OIDC_ISSUER="
# - "OIDC_CLIENT_ID="
# - "OIDC_SCOPE="
# - "OIDC_FLOW="
# - "OIDC_LOGIN_BUTTON_TEXT="
# volumes:
# - "/host/path/to/config.json:/app/static/config.json"
ports:
- "8080:8080"
restart: unless-stopped
初次启动
docker-compose up -d命令执行成功后,访问8080端口使用admin/admin默认账户登录,根据提示修改密码,注意点击Change password按钮之后响应稍慢,请耐心等待一会,之后跳转到登录页面,输入新密码之后就可以正常登录了。
创建项目及团队
首先创建一个项目,Classifier支持应用、容器、操作系统、框架等多种类型,示例选择Application。
Access Management选项创建团队,dependency track的定位是为组织的安全团队使用,为团队增加BOM_UPLOAD、POLICY_VIOLATION_ANALYSIS、PROJECT_CREATION_UPLOAD、VIEW_PORTFOLIO、VIEW_VULNERABILITY、VULNERABILITY_ANALYSIS权限,复制API Keys作为后续认证令牌。
生成SBOM
为了为Dependency Track提供SBOM以进行漏洞分析,使用jenkins作为CI/CD的话建议使用Dependency-Track插件。一旦插件安装成功且生效后,就可以在系统配置中看到Dependency-Track的配置项,输入后端URL地址和上面团队的API Keys,如果连接测试成功,就会显示出如下成功信息。
创建jenkins项目,构建步骤执行打包和生成SBOM执行
mvn -Pprod clean -DskipTests=true install
mvn org.cyclonedx:cyclonedx-maven-plugin:makeBom
构建后操作选择”Publish BOM to Dependency-Track“,配置相关项
Dependency-Track project可以直接下拉进行选择
Artifact为生成bom.xml文件路径
Enable synchronous publishing mode:
如果不勾选,项目构建完成后,直接访问dependency track前端查看分析结果;如果勾选,项目构建完成后,会等待dependency track分析完成后,调用api读取分析结果,并可以在jenkins构建信息中查看。同时,可以设置各级别等级漏洞的门限值,以此判定构建是否成功。
勾选Enable synchronous publishing mode,可以跟踪每次构建的漏洞数量趋势
构建结果漏洞分析结果概要
构建结果漏洞详情
参考文献
Introduction | Dependency-Track (dependencytrack.org)