Syft:生成软件物料清单

FreeGuideOnline 最新 2026-07-04

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 install github.com/anchore/syft/cmd/syft@latest
    
    (需提前安装 Go 1.21+)

选项三:下载二进制文件
访问 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-packages
    
    可选范围值:all(默认)、o-s-packagespython-packagesruby-packages 等。

实战场景:扫描容器镜像并输出 CycloneDX

  1. 登录私有 Registry(如果需要):
    syft registry login -u myuser -p mytoken myregistry.com
    
  2. 扫描并生成 SBOM
    syft scan registry:myregistry.com/myteam/backend:v2.1.0 \
      -o cyclonedx-json \
      --file backend-sbom.cdx.json
    
  3. 查看摘要信息
    syft scan docker:backend:v2.1.0 -o table
    
    终端会展示类似如下表格:
    NAME                    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