4. SBOM生成工具(二):使用Trivy生成SBOM并进行基础漏洞扫描

上一章我们聊了Syft,今天来聊聊Trivy。说实话,Trivy是我个人非常喜欢的一个工具。它最初以容器镜像漏洞扫描出名,后来逐渐发展成一个全能型的安全扫描器。我最早接触Trivy是在2020年,当时用它扫描一个Java应用的镜像,结果挖出了好几个严重漏洞。嗯,从那以后,它就进了我的工具链。

Trivy能生成SBOM吗?能。但它更擅长的是:把SBOM和漏洞数据关联起来。你想想看,光有SBOM其实不够,你得知道里面每个组件有没有漏洞。Trivy正好把这两件事合在一起做了。

4.1 Trivy的核心能力

Trivy支持多种数据源,包括容器镜像、文件系统、Git仓库等。它内置了多个漏洞数据库,比如NVD、Red Hat、Debian、Alpine等。我个人习惯用Trivy做快速扫描,因为它不需要额外配置,开箱即用。

功能 说明 我的评价
SBOM生成 支持CycloneDX和SPDX格式 够用,但不如Syft精细
漏洞扫描 基于SBOM或直接扫描 强项,速度快
多语言支持 Java、Python、Go、Node.js等 覆盖主流语言
输出格式 JSON、Table、SARIF等 CI/CD友好

4.2 安装Trivy

安装方式很多,我推荐用官方脚本或者包管理器。在Linux上,我一般这么装:

# 使用官方安装脚本
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh

# 或者用Homebrew(macOS)
brew install trivy

# 用Docker跑也行
docker pull aquasec/trivy:latest

装完之后,验证一下:

trivy --version

看到版本号就说明装好了。我记得有一次在客户的离线环境里装Trivy,没有网络,只能手动下载二进制包。嗯,那会儿折腾了半小时,后来发现Trivy官方提供了离线包,直接解压就能用。

4.3 生成SBOM

Trivy生成SBOM的命令很直观。比如扫描一个容器镜像:

# 生成CycloneDX格式的SBOM
trivy image --format cyclonedx --output result.cdx.json alpine:latest

# 生成SPDX格式的SBOM
trivy image --format spdx-json --output result.spdx.json alpine:latest

这里有个小细节:--format参数指定输出格式,--output指定文件路径。我个人习惯用CycloneDX,因为它在工具链里兼容性更好。

扫描文件系统也是一样的逻辑:

trivy filesystem --format cyclonedx --output fs-sbom.cdx.json ./my-project
小提示:Trivy默认会下载漏洞数据库,第一次运行可能比较慢。你可以用--skip-db-update跳过更新,但建议定期更新。

4.4 基础漏洞扫描

这才是Trivy的看家本领。生成SBOM的同时,直接做漏洞扫描:

# 扫描镜像并输出漏洞结果
trivy image --severity HIGH,CRITICAL alpine:latest

# 输出为表格格式
trivy image --format table alpine:latest

# 输出为JSON,方便后续处理
trivy image --format json --output vulns.json alpine:latest

你可能会问:为什么不直接用trivy image扫描,还要先生成SBOM?

原因很简单:SBOM是结构化数据,可以复用。比如你生成了一个SBOM,后续可以用它做策略检查、许可证合规、供应链溯源。而直接扫描的结果是一次性的。

我建议的工作流是这样的:

  1. 先生成SBOM
  2. 基于SBOM做漏洞扫描
  3. 把SBOM归档到仓库

这样既拿到了漏洞报告,又保留了SBOM资产。

4.5 基于已有SBOM做漏洞扫描

Trivy支持直接读取SBOM文件进行漏洞匹配。这个功能很实用:

# 先用Trivy生成SBOM
trivy image --format cyclonedx --output sbom.cdx.json nginx:1.21

# 再用SBOM做漏洞扫描
trivy sbom sbom.cdx.json

为什么这么做?我在项目中遇到过这样的情况:SBOM是开发阶段生成的,但漏洞数据库是持续更新的。你可以在CI/CD里把SBOM存起来,每次发布前重新扫描一次,看看有没有新漏洞。说白了,就是一次生成,多次扫描。

核心逻辑:SBOM + 漏洞数据库 = 实时漏洞关联。SBOM是静态的,漏洞库是动态的,两者结合才能发挥最大价值。

4.6 实战:从SBOM到漏洞报告

我们来走一个完整的流程。假设你有一个Node.js项目:

# 1. 生成SBOM
trivy filesystem --format cyclonedx --output app-sbom.cdx.json ./node-app

# 2. 基于SBOM扫描漏洞
trivy sbom app-sbom.cdx.json --severity HIGH,CRITICAL --format table

# 3. 输出JSON格式,方便集成
trivy sbom app-sbom.cdx.json --format json --output app-vulns.json

输出结果里,你会看到每个组件的漏洞详情,包括CVE编号、严重等级、修复版本等。嗯,这里要注意:不是所有漏洞都有修复版本。有些漏洞可能还没出补丁,这时候你就得评估风险了。

我曾经遇到一个情况:扫描出来一个CRITICAL级别的漏洞,但官方还没修复。后来我们通过WAF规则临时拦截了攻击路径,等补丁出来再升级。这就是DevSecOps的日常——不是所有问题都能立刻解决,但你必须知道问题在哪。

4.7 Trivy的漏洞数据库

Trivy内置了多个漏洞源,覆盖主流操作系统和语言生态:

数据源 覆盖范围 更新频率
NVD 通用漏洞 每日
Red Hat RHEL/CentOS 实时
Debian Debian/Ubuntu 实时
Alpine Alpine Linux 实时
GitHub Advisory 多种语言 实时

Trivy默认会缓存这些数据,所以第二次扫描会快很多。我建议在CI/CD里设置定时任务,每天更新一次漏洞库。

4.8 避坑指南

用Trivy这几年,我踩过一些坑,分享给你:

  • 漏洞库版本问题:Trivy的漏洞库是独立更新的,和Trivy本身版本无关。如果你发现扫描结果和预期不符,先检查漏洞库是不是最新的。
  • SBOM格式兼容性:不同工具生成的SBOM可能有细微差异。我曾经遇到过Trivy生成的SBOM被另一个工具解析失败的情况。解决办法是统一格式标准,比如都用CycloneDX 1.4。
  • 扫描速度:扫描大镜像时,Trivy可能会比较慢。我建议先做分层扫描,或者只扫描关键层。
  • 误报处理:Trivy偶尔会有误报。比如某个漏洞虽然存在,但实际不可利用。这时候需要人工确认,或者用--ignore-unfixed参数过滤掉未修复的漏洞。
警告:不要完全依赖自动化工具。Trivy扫描出来的漏洞列表,一定要人工复核。尤其是CRITICAL级别的漏洞,需要确认是否真的影响你的业务。

4.9 本章小结

Trivy是一个很实用的工具,既能生成SBOM,又能做漏洞扫描。我个人觉得它的最大优势是一体化——你不需要在多个工具之间切换。但也要注意,Trivy的SBOM生成能力不如Syft精细,如果你的场景对SBOM质量要求很高,建议两者结合使用。

最后,送你一句话:工具是死的,流程是活的。Trivy再强,也得配合好的DevSecOps流程才能发挥价值。

Trivy SBOM生成与漏洞扫描流程 输入目标 trivy image trivy filesystem trivy repo 生成SBOM CycloneDX SPDX JSON/Table 漏洞关联分析 支持多种输入源 一次生成,多次复用 实时漏洞匹配