3、SBOM生成工具:FOSSology、Syft、Trivy 与选型建议

说到 SBOM 生成工具,市面上其实不少。但我今天只聊三款我真正在项目里用过的:FOSSology、Syft 和 Trivy。它们各有脾气,也各有绝活。

我个人习惯是,先搞清楚场景再选工具。你是要扫描一个跑着的容器?还是要审计一批嵌入式固件的源码?需求不同,工具链完全不同。

SBOM 生成工具选型逻辑 源码 / 二进制 / 容器 FOSSology Syft Trivy SPDX / CSV SPDX / CycloneDX CycloneDX / SARIF

3.1 FOSSology:许可证审计的老牌选手

FOSSology 是 Linux 基金会下的开源项目,主打许可证合规扫描。说白了,它最擅长帮你搞清楚:你代码里那些第三方组件,到底用了什么许可证?GPL、MIT、Apache 2.0 还是什么奇怪的协议?

我记得有一次帮客户审计一个嵌入式 Linux 发行版,里面混杂了上百个开源包。用 FOSSology 跑一轮,直接揪出三个 GPL 传染性组件被静态链接进了闭源模块。嗯,那场面,法务部门直接拉响了红色警报。

核心能力: 基于文件级别的许可证扫描,支持 SPDX 标准输出。

安装很简单,但要注意它依赖数据库(PostgreSQL)。我个人习惯用 Docker 部署:

# 拉取镜像并启动
docker pull fossology/fossology
docker run -d -p 8081:80 fossology/fossology

启动后浏览器访问 http://localhost:8081,上传源码包或 Git 仓库,FOSSology 就会开始扫描。它会生成一份详细的许可证报告,包含每个文件匹配到的许可证模板。

小技巧: 扫描大型项目时,建议先做一次 nomos 扫描(快速),再用 monk 扫描(深度)。我一般先用 nomos 过一遍,只对可疑文件跑 monk,能省不少时间。

输出 SBOM 的命令:

# 在 FOSSology Web UI 中,选择 "SPDX 2.2" 格式导出
# 或者通过 REST API
curl -X GET "http://localhost:8081/repo/api/v1/report?id=123&format=spdx2" -o sbom.spdx

注意: FOSSology 对二进制文件的支持有限。如果你要扫描的是编译好的 .so 或 .elf 文件,它基本无能为力。这时候得请出 Syft 或 Trivy。

3.2 Syft:容器和文件系统的快速扫描器

Syft 是 Anchore 公司开源的,专为容器镜像和文件系统设计。它生成 SBOM 的速度非常快,而且支持多种输出格式:SPDX、CycloneDX、JSON 表格等。

你想想看,一个容器镜像几百 MB,用传统工具扫描可能要几分钟。Syft 呢?几秒钟就出结果。我曾在 CI/CD 流水线里集成 Syft,每次构建完镜像自动生成 SBOM,然后归档到 OSS 平台。效果非常好。

安装方式:

# macOS
brew install syft

# Linux (脚本安装)
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin

基本用法:

# 扫描本地 Docker 镜像
syft nginx:latest -o spdx-json > nginx-sbom.spdx.json

# 扫描本地文件系统
syft dir:/path/to/rootfs -o cyclonedx-json > rootfs-sbom.cdx.json

# 扫描容器镜像并直接输出到标准输出
syft alpine:3.18 -o table

Syft 的包管理器识别能力很强。它能识别 apt、apk、yum、pip、npm、gem 等几十种包管理器。我在项目中遇到过一个问题:一个嵌入式系统用了 Buildroot 构建,根文件系统里没有包管理器元数据。Syft 默认扫描会漏掉很多组件。后来我改用 syft dir: --source=filesystem 模式,配合自定义的包目录路径,才把问题解决。

关键特性: Syft 支持“目录扫描”模式,适合分析嵌入式设备的根文件系统。你只需要把设备上的 / 目录打包或挂载出来,Syft 就能生成 SBOM。

3.3 Trivy:漏洞扫描 + SBOM 生成二合一

Trivy 是 Aqua Security 的产品。它本来是个漏洞扫描器,后来也加入了 SBOM 生成功能。我个人觉得,Trivy 最大的优势是“一站式”——你生成 SBOM 的同时,还能直接看到每个组件有哪些已知漏洞。

举个例子,你扫描一个容器镜像,Trivy 不仅告诉你里面装了 OpenSSL 3.0.8,还告诉你这个版本有 CVE-2023-3817,严重程度是 HIGH。这比先跑 Syft 生成 SBOM,再导入漏洞库去查,要高效得多。

安装:

# macOS
brew install trivy

# Linux
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh

生成 SBOM 的命令:

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

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

# 同时扫描漏洞并生成 SBOM
trivy image --format spdx-json --output result.spdx.json --severity HIGH,CRITICAL nginx:latest

避坑指南: 我曾经在 CI 里直接用 trivy image --format spdx-json 输出到文件,结果发现文件里只有漏洞信息,没有完整的组件列表。后来看了文档才明白,Trivy 的 SBOM 输出默认只包含“有漏洞的组件”。要生成完整的 SBOM,需要加 --scanners vuln,license 参数。

Trivy 还支持扫描本地文件系统和 Git 仓库:

# 扫描本地目录
trivy fs --format cyclonedx --output fs-sbom.cdx.json /path/to/project

# 扫描 Git 仓库
trivy repo --format spdx-json https://github.com/example/project.git

3.4 工具选型建议

三款工具各有侧重。我整理了一张对比表,方便你快速决策:

维度 FOSSology Syft Trivy
主要场景 源码许可证审计 容器/文件系统快速 SBOM 漏洞扫描 + SBOM 二合一
输入类型 源码包、Git 仓库 容器镜像、目录、文件系统 容器镜像、目录、Git 仓库
输出格式 SPDX、CSV SPDX、CycloneDX、JSON CycloneDX、SPDX、SARIF
扫描速度 较慢(深度扫描) 极快(秒级) 快(分钟级)
许可证分析 ★★★★★(最强) ★★☆☆☆(基础) ★★★☆☆(中等)
漏洞检测 不支持 不支持 ★★★★★(内置)
嵌入式适用性 适合源码审计 适合根文件系统 适合容器化嵌入式系统

我的个人建议是:

  • 如果你在做合规审计,特别是许可证风险排查,首选 FOSSology。它虽然慢,但准。我见过太多项目因为许可证问题被法务叫停,FOSSology 能帮你提前排雷。
  • 如果你在 CI/CD 里需要快速生成 SBOM,Syft 是最佳选择。它轻量、快速、输出格式标准。我习惯在构建流水线里用 Syft 生成 SBOM,然后归档到 OSS 平台。
  • 如果你既要 SBOM 又要漏洞信息,直接用 Trivy。它一步到位,省去后续对接漏洞库的麻烦。特别是对于容器化部署的嵌入式系统,Trivy 的镜像扫描能力非常成熟。

重要提醒: 没有一把工具能解决所有问题。我在实际项目中,经常是 FOSSology + Syft 组合使用:FOSSology 做源码级许可证审计,Syft 做二进制/容器级 SBOM 生成。两者互补,覆盖全生命周期。