GitHub Actions artifact attestations 怎样在工作流中生成 SBOM 证明
来源:17golang原创
时间:2026-10-29 02:16:20 497浏览 收藏
如果工作流已经能构建出二进制或容器,还想把依赖清单一起交给发布链路,推荐使用 GitHub 当前的 actions/attest@v4。它把指定产物和 SPDX 或 CycloneDX JSON 格式的 SBOM 绑定起来,生成带签名的 SBOM 证明;证明生成后,消费方仍需使用 GitHub CLI 或自己的治理流程进行验证。
官方地址:https://github.com/actions/attest
subject-path指向要证明的构建产物,sbom-path指向 SPDX 或 CycloneDX JSON。- 最小权限通常是
id-token: write与attestations: write;关联 linked artifacts page 时再考虑artifact-metadata: write。 - 旧的
actions/attest-sbom已进入弃用迁移路径,新工作流优先写actions/attest@v4。
SBOM 证明到底绑定了哪些对象
这里容易把三件事混成一件事:构建产物是被描述的对象,SBOM 是对依赖组成的声明,attestation 则是把二者关联起来并附带签名的证明记录。actions/attest 不负责替你生成完整 SBOM,工作流要先通过现有工具得到 SPDX 或 CycloneDX JSON,再把文件路径传给 sbom-path。

因此,SBOM 文件存在并不等于它已经被证明;只有它和明确的 subject 绑定后,消费方才有机会核对“这份依赖清单描述的是哪个产物”。
权限和输入参数要成对配置
| 配置 | 作用 | 常见遗漏 |
|---|---|---|
id-token: write | 让动作获取用于签名的 OIDC 身份凭据 | 只给 contents 权限,导致签名阶段失败 |
attestations: write | 把证明写入 GitHub Attestations API | 动作执行了,但没有权限持久化证明 |
subject-path | 指定被证明的文件或匹配路径 | 路径指向构建前目录或文件名不一致 |
sbom-path | 指定 SPDX/CycloneDX JSON 文件 | 把文本报告或非 JSON 文件当作 SBOM |
可把最小片段放在“构建产物”和“生成 SBOM”之后。示例中的路径只是工作流约定,需替换成仓库实际输出位置:
permissions:
# 允许动作用 OIDC 身份申请短期签名凭据
id-token: write
# 允许把 attestation 写入 GitHub 的证明存储
attestations: write
contents: read
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 构建产物
run: make release
- name: 生成 SPDX SBOM
run: syft . -o spdx-json > sbom.spdx.json
- name: 生成 SBOM 证明
uses: actions/attest@v4
with:
# subject-path 必须指向已经生成的真实产物
subject-path: ./dist/my-app
# sbom-path 必须是 SPDX 或 CycloneDX JSON
sbom-path: ./sbom.spdx.json

支持范围与旧 action 的迁移边界
当前写法优先使用 actions/attest@v4。它根据输入进入 SBOM 模式;不提供 sbom-path 时,动作可以处理默认的构建来源证明。旧的 actions/attest-sbom 并不是另一个长期演进的实现,而是兼容包装层,官方仓库已经提示迁移到 actions/attest。
仓库可见性也会影响可用范围:公开仓库可使用 artifact attestations;私有或内部仓库要按当前 GitHub 计划和文档确认支持条件,GitHub Enterprise Server 不在该 action 的支持范围内。不要只因为 YAML 能解析,就把证明能力当作所有仓库都可用。
如果还希望把资产写入 linked artifacts page,需要单独考虑 artifact-metadata: write,并按官方说明配置 push-to-registry 与 subject 标识。这个开关不是生成普通 SBOM 证明的必选项,最好不要为了“看起来完整”而默认打开。
生成之后,消费方还要做验证
证明生成成功只说明工作流创建了一个签名关联记录,不代表部署系统已经拒绝未证明的构建,也不代表 SBOM 内容自动经过人工审查。发布团队应把验证动作放在消费侧,例如用 GitHub CLI 的 attestation 命令核对产物与 SBOM 的关联,再把结果接入发布门禁。
排查时按三层看:先确认 subject-path 在证明步骤之前已经产生,再确认 sbom-path 是可读的 SPDX/CycloneDX JSON,最后确认权限和仓库计划允许写入证明。这样能把“文件没生成”“输入不是 SBOM”和“API 没权限”分开处理。
相关问题
只上传 SBOM 文件,能替代 SBOM attestation 吗?
不能完全替代。上传文件解决的是分发,attestation 解决的是把 SBOM 与指定 subject 建立可验证关联;两者可以同时存在。
actions/attest-sbom 还能不能继续用?
它目前仍可作为兼容包装层工作,但官方已建议迁移到 actions/attest。新工作流直接采用新 action,后续升级成本更低。
生成证明后就能阻止未签名镜像部署吗?
不能自动得到这个结果。还需要在消费方执行验证,并把验证结果接入发布或集群准入策略。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
123 收藏
-
125 收藏
-
170 收藏
-
331 收藏
-
307 收藏
-
161 收藏
-
344 收藏
-
130 收藏
-
416 收藏
-
257 收藏
-
284 收藏
-
123 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习