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
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
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——整个过程清晰且可审计。
3.6 实战:一条命令完成全流程
最后,分享一个我常用的实战命令。它能把扫描、格式转换和压缩一步完成:
syft nginx:latest -o cyclonedx-json | jq '.' > sbom.json && gzip sbom.json
这条命令做了三件事:
- 扫描Nginx镜像并生成CycloneDX格式的SBOM
- 用
jq格式化JSON(方便人工审查) - 压缩成gzip,节省存储空间