本指南将逐步介绍如何配置 Witness 来对 您的构建进行监控,然后使用 SBOMit 从生成的 attestation 文件中生成一个增强版的 SBOM 文件。


先决条件


第一部分:Witness

Witness 封装您的构建流程,并记录已签名的attestations,即加密审计日志。

1. 安装Witness

bash <(curl -s https://raw.githubusercontent.com/in-toto/witness/main/install-witness.sh)

或者从 Witness 发布页面 下载二进制文件。

2. 创建签名密钥对

Witness 使用私钥对每个attestation进行签名。若要进行快速本地测试:

openssl genpkey -algorithm ed25519 -outform PEM -out testkey.pem
openssl pkey -in testkey.pem -pubout > testpub.pem

> 提示: Witness 还支持通过 SPIRE/SPIFFE 和 > Sigstore Fulcio 进行无密钥签名,适用于 CI/CD 环境。

3. 配置Witness

在项目根目录下创建一个名为 .Witness.yaml 的文件。该文件通常会与您的 公钥一起提交:

# .witness.yaml
run:
    signer-file-key-path: testkey.pem
    trace: false
verify:
    attestations:
        - "attestation.json"
    policy: policy-signed.json
    publickey: testpub.pem

命令行参数会覆盖配置文件中的值。运行 Witness help 可查看所有选项。

4. 打包您的构建

在构建命令前加上 Witness run,即可生成一个 attestation 文件:

witness run --step build -o attestation.json -- <your-build-command>

Go 项目:

witness run --step build -o attestation.json -- go build -o myapp .

Python 项目:

witness run --step build -o attestation.json -- pip install -r requirements.txt

Witness 始终运行一组基础 验证器——完整列表请参见 Witness attestors list

> 提示: 对于会生成大量文件的构建(例如 node_modules),请使用 > --dirhash-glob node_modules/* 来对目录内容进行哈希计算,而不是对每个单独的文件进行哈希计算。

5. 检查attestation

attestation文件是一个已签名的DSSE信封。 要查看有效载荷:

cat attestation.json | jq -r .payload | base64 -d | jq

您将看到一个名为attestation的集合,其中包含类型化的attestations:materialcommand-runproductenvironment,以及可选的network-trace。这是SBOMit所使用的数据。


第2部分:SBOMit

基于attestation文件,SBOMit 通过在观察到的构建数据 Witness 上运行特定语言的 包解析器,生成一个增强版的 SBOM。

1. 安装SBOMit

go install github.com/sbomit/sbomit@latest

2. 生成一个经过增强的SBOM

# SPDX 2.3 (default)
sbomit generate attestation.json

# SPDX 2.2
sbomit generate attestation.json -f spdx22

# CycloneDX 1.5
sbomit generate attestation.json -f cdx15

# CycloneDX 1.4
sbomit generate attestation.json -f cdx14

3. (可选)使用 –catalog 选项捕获依赖关系树

SBOMit 可以将 Syft 作为额外的目录来源调用,并将它的输出与attestation生成的 数据合并:

sbomit generate attestation.json --catalog syft --project-dir /path/to/project

SBOMit(目前)会生成一个 扁平列表 来列出依赖项,它知道哪些组件已被安装和使用,但不会重建完整的依赖树。 对于能够解析 树结构的生态系统(例如 Go 模块、npm),Syft 会在其输出中保留这种父子关系。

通过传递 --catalog syft 参数,SBOMit 会以 Syft 的依赖树为基础, 并补充 Syft 无法检测到的所有内容:构建时实际安装的版本、 原生库、未被任何包管理器追踪的文件,以及由 Witness 捕获的 网络调用来源信息。