用DependencyTrack管理第三方组件安全(二)

上一篇文章里我介绍了用来做第三方组件安全管理的新工具OWASP DependencyTrack的特点,它的典型使用场景等等,这篇文章里我将重点介绍OWASP DependencyTrack的搭建和基本使用。


安装

OWASP DependencyTrack(下文简称DT)提供了3种安装方式,分别是容器化部署、自运行安装包,以及可以直接在Tomcat里运行的WebApp包。我觉得最方便的还是容器化部署运行DT,只需3条命令即可:

# 下载DependencyTrack镜像docker pull owasp/dependency-track

# 创建并使用宿主机上的存储以避免数据丢失docker volume create --name dependency-track

# 在8080端口上运行DependencyTrackdocker run -d -m 8192m -p 8080:8080 --name dependency-track -v dependency-track:/data owasp/dependency-track

片刻之后(取决于你的网速),DependencyTrack就成功运行在本地8080端口了。不过首次运行DT的时候,还会有一些后台任务在运行,主要是DT需要把网上的漏洞数据库同步到本地,所以此时可以稍微等一会儿再用DT,否则可能出现检测不出安全问题的情况。话虽如此,但我发现同步数据的速度也还是挺快的,所以首次运行这个你略微注意一下就好,不是问题。

基本使用

打开DependencyTrack之后你会发现里面空空如也(配置除外),啥都没有,当然这也很合理嘛,毕竟我们还没有往DT发送任何数据。那怎么用DT检测第三方组件的安全性呢?别急,我得先讲讲DT的基本原理。

DependencyTrack是第三方组件安全检测和管理平台,它接收调用者提供的Software BOM(软件物料清单),然后检查物料清单中的各个组件(以及当前清单中的版本)在漏洞数据库中是否存在已知安全漏洞的记录,并通过Dashboard展示出来。

所以要把DT用起来,你需要先准备好一份SBOM清单,然后发送给DT,等待DT完成扫描检测之后,在DT的管理界面上查看结果。

你可能会问,SBOM是什么东西?SBOM(Software Bill of Material)中文名叫软件物料清单,如果你构建了一个应用程序,使用到了一些第三方组件,那么这个SBOM清单里就有你的应用程序所依赖的所有第三方组件的信息(当然还有第三方组件的第三方组件),其中最重要的就是组件的标识符(group、name、version)以及PURL数据。有了这些数据,DT才能到漏洞数据库里做搜索。

有很多工具可以帮我们生成SBOM。我用Gradle做构建工具,所以用的cyclonedx-gradle-plugin,如果你用maven,可以用CycloneDX Maven Plugin。其他构建工具支持,可去CycloneDX的官网上查找。

以Gradle构建工具为例,你需要在build.gradle文件里引入cyclonedx-gradle-plugin:

buildscript {
  repositories {
    mavenCentral()
    maven {
      url "https://jitpack.io"
    }
  }
  dependencies {
    classpath "com.cyclonedx:cyclonedx-gradle-plugin:1.2.0"
  }
}

apply plugin: "org.cyclonedx.bom"

注意,引入cyclonedx-gradle-plugin插件有巨坑,你需要额外指定cyclonedx-gradle-plugin插件的仓库地址(详见上面例子里的配置),否则安装会报错。

然后就可以在命令行里运行以下命令来生成你的应用对应的SBOM了:

./gradlew cyclonedxBom

生成的SBOM会默认放在项目根目录下的build/reports目录下,名字为bom.json或xml。我们接下来需要做的就是把这个bom文件传递给DT,让它对立面的组件进行安全检查。

不过这里又会遇到另一个巨坑。DT官方推荐使用DependencyTrack Jenkins插件来完成bom清单的推送,当然也非常含糊的说可以通过命令行的方式(例如通过curl)直接把bom文件提交给DT。但实践下来后发现,目前(3.8版本)只有通过Jenkins插件的方式能正常把bom文件提交给DT,并且只能上传xml格式的SBOM。我用命令行方式尝试了很多次都没成功上传,最后不得已放弃了。

如果你本来就用Jenkins来做CI/CD,那么这就不是问题,但如果你用GoCD或者别的CI工具,那就有点难办了。如果你解决了这个问题,也请告诉我一下。同时也希望DT能尽快解决掉这个问题。

Jenkins的配置可以参考如下:

生成bom的gradle命令
发送bom到DT

到这里,我们成功生成了SBOM,并且也上传给了DT,接下来你只要去DT的管理界面上,就能看到对应的分析结果。你可以看到DT检查了哪些第三方组件、发现了哪些问题、有哪些License等等。

在DT管理界面里查看第三方组件的安全问题

以上就是关于DependencyTrack的基本使用了,在下篇文章里,我将介绍DT的一些特色功能。