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 本章知识体系

下面这张图帮你梳理了本章的核心逻辑:

SBOM生成工具知识体系 SBOM生成工具知识体系 SBOM生成 Syft Trivy 安装:脚本/brew 用法:syft [镜像] 输出:cyclonedx/spdx 安装:脚本/apt 用法:trivy image 输出:cyclonedx/spdx 选择建议:纯生成用Syft,全流程用Trivy 生产环境建议两个工具配合使用

3.6 本章小结

今天咱们干了三件事:装了Syft和Trivy,跑了第一个SBOM生成命令,还对比了两个工具的差异。你想想看,从零到拿到一份标准的CycloneDX格式SBOM,其实就几步命令的事。

最后提醒一句:生成的SBOM文件一定要妥善保管。我见过有团队把SBOM生成完就扔在构建目录里,结果版本迭代后根本找不到对应关系。建议每次构建都归档到制品仓库,和镜像、二进制文件一起保存。

课后动手:找一个你自己项目里的镜像(比如python:3.11-slim),分别用Syft和Trivy生成SBOM,对比一下组件列表的差异。你会发现,实践才是最好的老师。