3、SBOM生成工具:Syft与Trivy实战
好,咱们进入实操环节。前面聊了那么多SBOM的理论和标准,今天直接上手干活。我个人习惯,选工具就两条标准:一是社区活跃度,二是能不能融入现有CI/CD流水线。Syft和Trivy,恰好都满足。
Syft是Anchore家的,专攻SBOM生成,速度快,支持格式多。Trivy呢,来自Aqua Security,本来是做漏洞扫描的,后来也把SBOM生成功能集成进来了。你想想看,一个工具能生成SBOM还能顺便扫漏洞,多省事。
核心观点:Syft专精生成,Trivy兼顾扫描。生产环境我建议两个都装,各取所长。
3.1 Syft工具安装与使用
Syft的安装方式很友好。官方提供了多种途径,我挑最常用的两种说。
3.1.1 安装Syft
方式一:一键脚本(推荐)
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
这条命令会把Syft二进制丢到/usr/local/bin。嗯,这里要注意,如果你的环境没有curl,先装一下。
方式二:Homebrew(macOS用户)
brew install syft
我个人习惯用第一种,因为Linux服务器上很少装Homebrew。安装完验证一下:
syft version
看到版本号输出,就说明装好了。我曾经在客户的离线环境里折腾过,那才叫麻烦——得先在有网的机器上下载好二进制,再传过去。所以,能在线装就在线装。
3.1.2 Syft基本用法
Syft的使用逻辑很简单:指定一个镜像或文件系统,它帮你分析出所有组件,然后输出成SBOM。
最基本的命令:
syft nginx:latest
这条命令会分析nginx最新镜像,默认输出到终端,格式是Syft自己的表格式。但我们要的是标准SBOM,所以得指定格式:
syft nginx:latest -o cyclonedx-json > nginx-sbom.json
这里-o cyclonedx-json指定输出为CycloneDX格式的JSON。我个人偏爱CycloneDX,因为它对组件依赖关系的描述更细致。当然,你也用-o spdx-json输出SPDX格式。
小技巧:如果你不确定镜像里有什么,先不加-o跑一遍,看看终端输出的组件列表,确认没问题再生成正式SBOM。
3.2 Trivy工具安装与使用
Trivy这几年火得不行。为什么?因为它一个工具能搞定漏洞扫描、配置检查、SBOM生成三件事。说白了,就是「瑞士军刀」型选手。
3.2.1 安装Trivy
方式一:官方脚本
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
方式二:apt/yum(Linux发行版)
# Ubuntu/Debian
sudo apt-get install trivy
# RHEL/CentOS
sudo yum install trivy
安装完同样验证:
trivy --version
3.2.2 Trivy生成SBOM
Trivy生成SBOM的命令和Syft类似,但参数略有不同:
trivy image --format cyclonedx --output trivy-sbom.json nginx:latest
这里--format cyclonedx指定格式,--output指定输出文件。注意,Trivy默认会同时进行漏洞扫描,如果你只想生成SBOM不扫描,加个--scanners sbom参数:
trivy image --scanners sbom --format cyclonedx --output trivy-sbom.json nginx:latest
为什么会这样?因为Trivy的设计理念是「安全左移」,它默认认为你生成SBOM就是为了后续做安全分析。但我遇到过不少场景,比如只想先收集资产清单,那就把扫描关掉,跑得快一些。
3.3 生成第一个SBOM文件
好,理论讲完,咱们动手生成第一个真正的SBOM文件。我选一个实际项目里常用的镜像——node:18-alpine。
3.3.1 使用Syft生成
# 1. 拉取镜像(如果本地没有)
docker pull node:18-alpine
# 2. 生成SBOM
syft node:18-alpine -o cyclonedx-json > node18-syft-sbom.json
# 3. 查看文件大小和行数
wc -l node18-syft-sbom.json
你会得到一个JSON文件。打开看看,里面包含了操作系统层(Alpine的apk包)和Node.js层(npm包)的所有组件信息。
3.3.2 使用Trivy生成
# 只生成SBOM,不扫描漏洞
trivy image --scanners sbom --format cyclonedx --output node18-trivy-sbom.json node:18-alpine
# 对比两个文件
diff <(jq . node18-syft-sbom.json) <(jq . node18-trivy-sbom.json)
你会发现,两个工具生成的SBOM在组件数量上可能略有差异。为什么?因为解析策略不同。Syft更激进一些,会把一些隐藏的依赖也挖出来;Trivy则偏向保守,只收录明确可识别的包。
避坑指南:我曾经在生成一个Java应用的SBOM时,Syft和Trivy给出的组件数差了30%。后来发现是Syft把Maven的传递依赖全列了,而Trivy只列了直接依赖。所以,生成SBOM前,先明确你要的是「直接依赖」还是「全量依赖」,然后选对工具和参数。
3.4 Syft vs Trivy:怎么选?
我把两个工具的核心差异整理成了一张表,方便你决策:
| 对比维度 | Syft | Trivy |
|---|---|---|
| 核心定位 | SBOM生成专用工具 | 全能安全扫描器(含SBOM) |
| 生成速度 | 快(轻量级) | 中等(含扫描逻辑) |
| 格式支持 | CycloneDX、SPDX、Syft格式 | CycloneDX、SPDX |
| 依赖解析深度 | 深(含传递依赖) | 适中(默认直接依赖) |
| 额外功能 | 无 | 漏洞扫描、IaC扫描、密钥检测 |
| CI/CD集成 | 简单(单一输出) | 丰富(多场景支持) |
我的建议是:如果你只需要生成SBOM,用Syft,快且准。如果你既要SBOM又要漏洞扫描,用Trivy,一个工具搞定。 当然,两个都装也不冲突,我自己的流水线里就是Syft生成SBOM,Trivy做扫描,各司其职。
3.5 本章知识体系
下面这张图帮你梳理了本章的核心逻辑:
3.6 本章小结
今天咱们干了三件事:装了Syft和Trivy,跑了第一个SBOM生成命令,还对比了两个工具的差异。你想想看,从零到拿到一份标准的CycloneDX格式SBOM,其实就几步命令的事。
最后提醒一句:生成的SBOM文件一定要妥善保管。我见过有团队把SBOM生成完就扔在构建目录里,结果版本迭代后根本找不到对应关系。建议每次构建都归档到制品仓库,和镜像、二进制文件一起保存。
课后动手:找一个你自己项目里的镜像(比如python:3.11-slim),分别用Syft和Trivy生成SBOM,对比一下组件列表的差异。你会发现,实践才是最好的老师。