本指南将逐步介绍如何配置 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:material、command-run、
product、environment,以及可选的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 捕获的
网络调用来源信息。
