首页/开发/CI/CD 与发布速查/构建来源证明(Artifact Attestation)
流水线设计54 条

构建来源证明(Artifact Attestation)

为制品生成签名的构建来源证明:说明「谁在什么环境用什么源码构建」,部署侧可校验后放行。

CI/CD 与发布速查开发更新于 2026-10-13

构建来源证明是什么

构建来源证明(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 使用。

易错点

  • 证明生成但无人验证:供应链攻击场景下无法拦住被替换的制品,把 verify 做成部署门禁。
  • 校验环境时钟与信任根未维护:验证链断裂被误判为失败,为验证侧配置时间同步与信任材料更新。
  • 只给镜像签证明、归档与二进制不签:发布覆盖面不全,遗漏通道仍可被替换,制品清单要一张不漏。
  • 校验失败降级为警告:门禁不拦截等于没做,失败即拒绝部署并通知负责人。
  • 把来源证明当 SBOM 用:来源与成分是两件事,审计依赖清单需要单独生成 SBOM。

数据来源与参考

  • GitHub Docs《Artifact attestations》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌