3、SBOM生成工具:Syft、Trivy、SPDX Tools等工具的安装与使用
说到SBOM生成,市面上工具不少。但我个人最常用的,就是Syft、Trivy和SPDX Tools这三款。它们各有侧重,配合起来基本能覆盖我工作中遇到的所有场景。
今天我就把它们的安装、核心用法,以及我在项目中踩过的坑,一次性说清楚。
3.1 工具选型:谁适合什么场景?
先给个直观的对比。你想想看,选工具就像选螺丝刀——没有万能的,只有最合适的。
| 工具 | 核心能力 | 输出格式 | 我最常用的场景 |
|---|---|---|---|
| Syft | 从容器镜像、文件系统生成SBOM | SPDX、CycloneDX、Syft自用格式 | CI/CD流水线中快速生成SBOM |
| Trivy | 漏洞扫描 + SBOM生成 | SPDX、CycloneDX、Sarif | 生成SBOM后直接做漏洞匹配 |
| SPDX Tools | SPDX文档的验证、转换、编辑 | SPDX 2.2/2.3、RDF/XML、JSON | 合规审计时做格式校验和转换 |
3.2 Syft:轻量级SBOM生成器
Syft是Anchore家的开源项目。我第一次用的时候,感觉就一个字:快。一个几百MB的镜像,十几秒就能吐出完整的SBOM。
3.2.1 安装Syft
安装方式很灵活。我个人习惯用一键脚本,省事:
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
macOS用户也可以用Homebrew:
brew install syft
验证安装:
syft version
3.2.2 核心用法
生成SBOM的基本命令就一行:
syft nginx:latest -o spdx-json > nginx-sbom.spdx.json
这里我解释一下参数:
nginx:latest—— 目标镜像,也可以是目录路径-o spdx-json—— 输出格式,我推荐用SPDX JSON,兼容性最好> nginx-sbom.spdx.json—— 重定向到文件
如果你要扫描本地文件系统:
syft dir:/path/to/project -o cyclonedx-json > project-sbom.cdx.json
--exclude 参数排除掉:syft dir:. --exclude './node_modules/**' -o spdx-json
3.2.3 我在项目中遇到的坑
有一次,我用Syft扫描一个基于Alpine的镜像,生成的SBOM里居然没有libc的版本信息。查了半天才发现,Alpine用的musl libc,而Syft默认的包管理器列表里没有musl的解析器。后来我加上了 --catalogers 参数手动指定:
syft alpine:latest --catalogers 'alpm,dpkg,rpm,apk' -o spdx-json
嗯,这里要注意:不同基础镜像的包管理器不一样,Debian用dpkg,RedHat用rpm,Alpine用apk。Syft虽然会自动检测,但偶尔会漏。手动指定更保险。
3.3 Trivy:SBOM生成 + 漏洞扫描二合一
Trivy是Aqua Security家的明星产品。它不仅能生成SBOM,还能直接基于SBOM做漏洞匹配。说白了,就是一条命令搞定两件事。
3.3.1 安装Trivy
安装同样简单。我推荐用rpm/deb包,方便后续升级:
# Ubuntu/Debian
sudo apt-get install trivy
# CentOS/RHEL
sudo yum install trivy
# macOS
brew install trivy
验证安装:
trivy --version
3.3.2 生成SBOM
Trivy生成SBOM的命令和Syft类似:
trivy image --format spdx-json --output trivy-sbom.spdx.json nginx:latest
如果你只想生成SBOM,不做漏洞扫描,可以加上 --scanners sbom:
trivy image --scanners sbom --format spdx-json -o sbom-only.json nginx:latest
3.3.3 从SBOM到漏洞匹配
这才是Trivy的杀手锏。你可以先生成SBOM,然后基于这个SBOM做漏洞扫描:
# 第一步:生成SBOM
trivy image --format cyclonedx-json -o myapp.cdx.json myapp:latest
# 第二步:基于SBOM扫描漏洞
trivy sbom myapp.cdx.json
为什么会这样设计?因为SBOM是静态的,漏洞库是动态的。你今天生成的SBOM,明天可能就有新的漏洞匹配上。所以,我建议把SBOM存起来,定期用Trivy重新扫描一遍。
3.4 SPDX Tools:合规交付的守门员
SPDX Tools是Linux基金会维护的官方工具集。它不直接生成SBOM,而是用来验证、转换、合并SPDX格式的文档。
我记得有一次客户审计,对方要求SBOM必须是SPDX 2.3格式,而且必须通过官方验证。当时我生成的SBOM用Syft直接输出,结果验证时发现缺少几个必填字段。还好有SPDX Tools,帮我快速定位并修复了问题。
3.4.1 安装SPDX Tools
SPDX Tools有Java版本和Go版本。我推荐用Go版本,部署简单:
# 安装SPDX Tools Go版
go install github.com/spdx/tools-golang/tools/spdx-json-tools@latest
Java版需要JDK 11+:
# 下载jar包
wget https://github.com/spdx/tools-java/releases/download/v1.1.5/spdx-tools-java-1.1.5-jar-with-dependencies.jar
3.4.2 核心用法
验证SBOM是否合规:
# Go版
spdx-json-tools validate my-sbom.spdx.json
# Java版
java -jar spdx-tools-java-1.1.5-jar-with-dependencies.jar Validate my-sbom.spdx.json
格式转换(比如从JSON转成RDF/XML):
java -jar spdx-tools-java-1.1.5-jar-with-dependencies.jar Convert my-sbom.spdx.json my-sbom.rdf.xml
creationInfo 字段的 created 时间戳格式不对。SPDX规范要求是UTC时间,但Syft某个版本输出的是本地时间。用SPDX Tools验证时直接报错。解决办法是在生成时加上 --timestamp 参数强制指定UTC。
3.5 工具协同:一条完整的SBOM生产流水线
在实际项目中,我不会只用单一工具。而是把它们串起来,形成一条流水线。下面这张图就是我在团队里推的标准流程:
3.6 我的工具链推荐配置
最后,分享一套我目前在生产环境用的配置。你可以直接拿去用:
| 环节 | 工具 | 命令/参数 |
|---|---|---|
| 容器镜像SBOM生成 | Syft | syft <image> -o spdx-json --catalogers 'all' |
| 文件系统SBOM生成 | Syft | syft dir:<path> --exclude '**/node_modules/**' -o spdx-json |
| SBOM + 漏洞扫描 | Trivy | trivy image --format spdx-json -o sbom.json <image> && trivy sbom sbom.json |
| 格式验证 | SPDX Tools | spdx-json-tools validate <file> |
| 格式转换 | SPDX Tools | java -jar spdx-tools.jar Convert <input> <output> |
sbom-tools 镜像,里面集成了Syft、Trivy和SPDX Tools,拉下来就能用。