3、SBOM生成工具(上):使用Syft生成容器镜像和文件系统的SBOM

聊到SBOM生成,Syft是我个人最常用的工具之一。它轻量、快速,而且对容器镜像的支持特别好。说白了,Syft就是一把瑞士军刀——能扫描容器镜像、文件系统,甚至还能直接分析OCI格式的镜像层。我最早接触它是在一个K8s集群的供应链审计项目里,当时需要快速生成上百个镜像的SBOM,Syft的表现让我印象深刻。

3.1 Syft的安装与验证

安装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
小提示: 我建议把Syft集成到CI/CD流水线里。比如在GitHub Actions中,直接用 anchore/sbom-action 就能自动生成SBOM,省去手动安装的麻烦。

3.2 核心命令:生成容器镜像的SBOM

Syft最核心的能力就是扫描容器镜像。命令格式非常直观:

syft <image>

举个例子,扫描一个Nginx镜像:

syft nginx:latest

输出结果会列出所有软件包——包括操作系统层的deb/rpm包,以及应用层的npm、pip、jar等依赖。我记得有一次,客户反馈他们的镜像里有个高危漏洞,但官方镜像明明已经修复了。我用Syft一查,发现是他们在构建时多装了一个旧版本的curl包。嗯,这种问题用Syft一眼就能揪出来。

3.2.1 扫描文件系统

除了镜像,Syft也能直接扫描本地目录。这在分析构建产物或解压后的文件系统时特别有用:

syft dir:/path/to/your/project

比如,你有一个Node.js项目,想看看依赖里有没有已知漏洞:

syft dir:./my-node-app

它会自动识别 package-lock.json、yarn.lock 等文件,并提取出所有依赖信息。我个人觉得,这个功能在开发阶段做快速检查非常实用——不用等镜像构建完,直接在源码目录就能生成SBOM。

3.3 输出格式配置

Syft支持多种输出格式。默认是表格形式,但真正用于供应链管控时,我们需要标准化的格式。下面这张表列出了我最常用的几种:

格式 命令参数 适用场景
CycloneDX JSON -o cyclonedx-json 主流SBOM交换格式,支持VEX
CycloneDX XML -o cyclonedx-xml 需要XML Schema验证的场景
SPDX JSON -o spdx-json 开源合规审计,与FOSSology集成
SPDX Tag-Value -o spdx-tag-value 传统SPDX工具链
Syft Table -o table 本地调试,快速查看

举个例子,生成CycloneDX格式的SBOM:

syft nginx:latest -o cyclonedx-json > sbom.cyclonedx.json
注意: 我曾经遇到过一个问题——生成的SBOM文件巨大,导致后续的漏洞扫描工具直接OOM。后来发现是镜像里包含了大量重复的依赖。建议在生成SBOM前,先用 syft packages 命令预览一下包的数量,如果超过5000个,考虑用 --exclude 参数过滤掉不必要的路径。

3.4 高级用法:按需过滤与定制

Syft还支持按包类型、名称或路径过滤。比如,我只想看Python相关的依赖:

syft nginx:latest -o cyclonedx-json --select-catalogers "python-package-cataloger"

或者排除测试文件:

syft dir:./my-app -o spdx-json --exclude "./tests/**"

这个功能在大型项目里特别有用。我记得有一次,一个Java微服务项目生成了近2万行的SBOM,里面一半是测试依赖。用 --exclude 过滤后,SBOM体积直接缩小了60%,后续的漏洞扫描也快了很多。

3.5 Syft工作流程全景

下面这张图展示了Syft从输入到输出的完整工作流。你想想看,从容器镜像或文件系统开始,经过包解析、依赖提取,最终生成标准格式的SBOM——整个过程清晰且可审计。

Syft SBOM生成工作流程 容器镜像 docker://nginx:latest 文件系统 dir:/path/to/project Syft解析引擎 包目录器 依赖提取器 版本解析器 许可证检测 CycloneDX JSON / XML SPDX JSON / Tag-Value 关键说明: • 输入支持:Docker/OCI镜像、本地目录、归档文件(tar/zip) • 解析引擎自动识别包管理器锁文件(package-lock.json、go.sum、Gemfile.lock等) • 输出格式可通过 -o 参数灵活切换,支持管道组合多个格式

3.6 实战:一条命令完成全流程

最后,分享一个我常用的实战命令。它能把扫描、格式转换和压缩一步完成:

syft nginx:latest -o cyclonedx-json | jq '.' > sbom.json && gzip sbom.json

这条命令做了三件事:

  • 扫描Nginx镜像并生成CycloneDX格式的SBOM
  • 用 jq 格式化JSON(方便人工审查)
  • 压缩成gzip,节省存储空间
核心要点: Syft生成SBOM的关键在于选择合适的输出格式。对于供应链管控,我强烈推荐CycloneDX JSON——它被OWASP、OpenSSF等主流组织推荐,且支持VEX(漏洞可交换说明),能直接对接后续的漏洞管理和策略引擎。