3、SBOM生成工具:FOSSology、Syft、Trivy 与选型建议
说到 SBOM 生成工具,市面上其实不少。但我今天只聊三款我真正在项目里用过的:FOSSology、Syft 和 Trivy。它们各有脾气,也各有绝活。
我个人习惯是,先搞清楚场景再选工具。你是要扫描一个跑着的容器?还是要审计一批嵌入式固件的源码?需求不同,工具链完全不同。
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 生成。两者互补,覆盖全生命周期。