构建来源证明是什么
构建来源证明(Artifact Attestation)为每个制品生成一份签名的「出生证明」:说明它来自哪个仓库、哪个提交、由哪条工作流在什么环境下构建。签名基于 Sigstore 生态:CI 平台用 OIDC 发放短期证书,签名写入透明日志,验证方即可核对。它的用途不是保护构建过程本身,而是让部署侧在放行前能回答一个问题——手上这个制品,真的是受信仓库的受信流水线产出的吗。GitHub 提供 actions/attest-build-provenance 生成证明、gh attestation verify 校验。
基本信息
| 平台 | GitHub Actions(actions/attest-build-provenance) |
|---|---|
| 校验工具 | gh attestation verify |
| 绑定内容 | 构建仓库、提交、工作流与制品摘要 |
| 信任基础 | OIDC 短期证书 + Sigstore 签名 + 透明日志 |
| 用途 | 发布前验证、准入控制、审计取证 |
典型使用场景
- 发布门禁:部署作业先校验来源证明,来源不符直接拒绝放行。
- 供应链审计:回溯制品由哪次提交、哪条工作流产出,缩短取证时间。
- 准入控制:策略要求「无证明的制品不得部署」,从入口拦截被替换的产物。
- 多团队制品交换:跨团队使用对方制品前核对来源,替代口头约定。
- 安全事件响应:确认某版本是否由官方流水线构建,排查被篡改的制品。
GitHub Actions 生成
GitHub Actions 生成
permissions:
id-token: write
attestations: write
steps:
- run: sha256sum dist/app.tar.gz
- uses: actions/attest-build-provenance@v2
with:
subject-path: dist/app.tar.gz部署侧校验
部署侧校验
gh attestation verify dist/app.tar.gz --repo org/repo
# 校验通过 = 制品摘要与签名绑定, 来源为指定仓库
# 失败要当作门禁拦截, 而不是记一条警告验证点读法
| 验证项 | 含义 | 失败信号 |
|---|---|---|
| 签名者身份 | 构建者仓库与工作流 | 签名者不是受信仓库 |
| 提交信息 | 产出的提交与分支 | 提交不在允许范围 |
| 制品摘要 | subject 的哈希绑定 | 文件与签名不匹配(被替换) |
| 透明日志 | 签名收录记录 | 无收录记录,链不完整 |
证明的价值在于「验证」环节:没有校验的证明只是附件,放进仓库不产生任何安全性。
来源证明解决「谁构建的」,不解决「构建内容是否安全」:仍需配合依赖与漏洞扫描、SBOM 使用。