如今的软件开发几乎都会用到各种开源组件,我统计过公司一个不算大的项目,使用的开源组件数量就有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,可以跟踪每次构建的漏洞数量趋势
构建结果漏洞分析结果概要
构建结果漏洞详情