Syft:生成软件物料清单
bash curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
安装完成后验证:
```bash
syft version
选项二:通过包管理器
- macOS (Homebrew):
brew tap anchore/syft brew install syft - Linux (可选 Go 安装):
(需提前安装 Go 1.21+)go install github.com/anchore/syft/cmd/syft@latest
选项三:下载二进制文件
访问 GitHub Releases,下载对应平台压缩包,解压后将 syft 移动到 PATH 路径下。
生成第一份 SBOM
扫描一个目录
假设你有一个 my-python-app 目录,包含 requirements.txt 和 Python 文件。
syft scan dir:my-python-app
输出会直接显示在终端,列出检测到的包、版本和类型。
扫描容器镜像
syft scan registry:python:3.11-slim
Syft 拉取镜像并分析其文件系统,无需启动容器。支持任何 Docker Registry 公开或私有镜像(需认证时可配合 --registry-* 参数)。
扫描本地已导入的镜像
syft scan docker:nginx:latest
前提是已经执行 docker pull nginx:latest。Syft 直接读取本地 Docker 存储。
输出格式与导出
Syft 支持多种 SBOM 标准格式,通过 -o 参数指定。常用格式包括:
| 格式 | 命令参数 | 说明 |
|---|---|---|
| Syft 自有 JSON | -o syft-json |
包含最丰富的信息,适合后续处理 |
| CycloneDX JSON | -o cyclonedx-json |
OWASP 标准,广泛用于安全工具 |
| CycloneDX XML | -o cyclonedx-xml |
适合企业合规场景 |
| SPDX JSON | -o spdx-json |
Linux 基金会标准 |
| SPDX 标签/值 | -o spdx-tag-value |
文本格式 |
| 表格输出 | -o table |
人类可读的控制台表格(默认) |
保存为文件
syft scan dir:my-app -o cyclonedx-json > sbom.cdx.json
或使用 --file 更直观:
syft scan docker:alpine:latest -o spdx-json --file alpine-sbom.spdx.json
生成不同范围的 SBOM
- 仅操作系统包:非常适合基础镜像追溯。
可选范围值:syft scan registry:ubuntu:22.04 -o table --scope o-s-packagesall(默认)、o-s-packages、python-packages、ruby-packages等。
实战场景:扫描容器镜像并输出 CycloneDX
- 登录私有 Registry(如果需要):
syft registry login -u myuser -p mytoken myregistry.com - 扫描并生成 SBOM:
syft scan registry:myregistry.com/myteam/backend:v2.1.0 \ -o cyclonedx-json \ --file backend-sbom.cdx.json - 查看摘要信息:
终端会展示类似如下表格:syft scan docker:backend:v2.1.0 -o tableNAME VERSION TYPE adduser 3.118 deb apt 1.8.2.3 deb ...
高级用法
从容器镜像中排除特定路径
为了减小 SBOM 体积或去除噪音,可使用 .syft.yaml 配置文件或在命令中指定排除模式:
命令方式:
syft scan dir:. --exclude ./node_modules --exclude ./vendor
配置文件(当前目录的 .syft.yaml):
exclude:
- "**/test/**"
- "**/node_modules/**"
然后执行 syft scan dir:. 会自动应用规则。
追踪二进制文件的成分
Syft 可以识别二进制文件中的静态编译依赖,对 Go、Rust 应用尤其有用。
syft scan file:./my-golang-binary
它会展示二进制内嵌的 Go 模块和版本。
转换为其他格式
Syft 自带转换功能,无需重新扫描:
syft convert my-sbom.syft.json -o cyclonedx-json > converted.cdx.json
支持的输入格式包括 Syft JSON、CycloneDX、SPDX。
集成到 CI/CD 与后续分析
与 Grype 漏洞扫描联动
Syft 生成的 SBOM 可直接喂给同家族的 Grype 进行漏洞检测:
# 一步到位:扫描镜像并直接用 Grype 检查漏洞
syft scan docker:my-app:latest -o json > sbom.json
grype sbom:sbom.json
甚至更简单(Grype 内部调用 Syft):
grype docker:my-app:latest
但显式生成 SBOM 可存档作为审计依据。
在 GitHub Actions 中自动化
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:${{ github.sha }}
format: cyclonedx-json
output-file: sbom.cdx.json
常见问题与排错
1. 扫描镜像时提示权限不足
确保当前用户在 docker 组中,或使用 sudo 执行(并不推荐长期使用)。也可通过 podman 扫描:
syft scan podman-image:myimage:latest