SBOM 与构建来源证明怎样走向协同
来源:17golang原创
时间:2026-10-15 03:11:16 252浏览 收藏
我在梳理软件供应链资料时,最容易混淆的一组概念就是 SBOM 和构建来源证明:它们都会出现在发布附件或制品仓库附近,却回答着两类不同的问题。SBOM 主要说明“这个制品包含哪些组件、版本和依赖”,构建来源证明(provenance)则说明“这些输入由什么构建系统、以什么身份和参数生成了这个制品”。真正有用的方向不是二选一,而是把两份事实绑定到同一个交付对象上。
官方资料入口:https://tag-security.cncf.io/community/working-groups/supply-chain-security/supply-chain-security-paper-v2/sscbpv2/
SBOM 负责描述组成,provenance 负责描述来路。协同的最小单位不是“仓库里有两份文件”,而是“同一个制品摘要能够找到对应的组件清单、构建声明、签名身份和策略判断”。
SBOM 和 provenance 先要分工清楚
CNCF 供应链安全社区把 SBOM 生成、格式、存储和消费,与来源证明、SLSA、in-toto 和策略执行分别列为关注点。这种划分很实用:SBOM 是组成视图,provenance 是构建事实视图。一个能回答“有没有某个依赖”的清单,不能单独回答“它是不是由允许的构建器生成”;一份构建声明,也不能替代依赖清单去说明最终制品的内容。
| 问题 | 主要证据 | 不能单独替代的内容 |
|---|---|---|
| 制品里有什么 | SBOM、组件标识、版本、依赖关系 | 构建环境和执行身份 |
| 制品怎样产生 | provenance、输入摘要、构建器、参数 | 完整组件清单 |
| 这两份证据是否属于同一个交付物 | 制品摘要、关联关系、签名和时间戳 | 脱离对象的文件名猜测 |
| 现在是否允许消费 | 策略检查、签名验证、漏洞与 VEX 结果 | 单份静态清单 |

为什么两份元数据要绑定到制品摘要
我会先把“关联对象”固定下来,再讨论格式。一个版本号或文件名可能在不同构建中重复出现,制品摘要则更适合作为元数据关联锚点。CNCF Secure Software Factory 资料把 SBOM、测试报告和漏洞报告视为某次构建的快照,并建议让这些元数据链接到最终交付制品;同一条原则也适用于 provenance。
因此,发布物至少应能沿着下面的关系回溯:制品摘要找到 SBOM,SBOM 说明组件与版本;制品摘要找到 provenance,provenance 说明源代码输入、构建器身份、构建参数和输出;签名与身份再为这些声明提供可验证的信任边界。不要把“同目录下有两个 JSON 文件”当成关联,因为文件名、上传时间或目录层级都不够稳定。
标准各自提供接口,不等于工具自动完成协同
SBOM 侧常见的是 SPDX 和 CycloneDX,它们解决组件清单的表达与交换;来源证明侧常见的是 SLSA provenance 和 in-toto 相关证明模型,它们关注构建输入、构建过程与可验证声明。它们可以组合,但并不意味着任意工具生成的两份文档天然兼容。真正的接口是稳定的制品标识、明确的字段语义、可验证的签名以及可被消费端找到的存储位置。
这也是我不建议一开始就追求“所有工具都接入”的原因。先确定团队要保护的制品类型,再决定清单格式、证明格式、签名和分发方式。格式转换可以解决表示差异,却不能补回生成阶段没有记录的输入、身份或时间信息。CNCF TAG Security 的资料也强调,构建时生成的 SBOM 因为能够看到实际依赖和构建上下文,通常比事后扫描更接近该次构建的事实。

把协同关系落到一次制品交付
如果只看标准名词,协同容易停留在架构图上。我会把一次发布拆成几个必须留证的对象:源代码提交、依赖解析结果、构建制品、SBOM 文档、Provenance 证明和签名身份。它们不要求存放在同一个系统里,但必须能通过制品摘要或其他稳定关联查到彼此。
- 构建阶段:尽量在构建上下文中生成 SBOM,同时采集输入、输出、构建器身份和时间等 provenance 字段。
- 签名阶段:让声明和交付对象都落在明确的身份边界内,消费端能知道谁签署、签署了什么以及签名如何验证。
- 分发阶段:把制品、SBOM 和来源证明放到消费者可访问的仓库或元数据存储中,并保持版本、时间戳和不可变记录。
- 消费阶段:把“组件是否符合要求”和“构建是否来自允许的来源”拆成两个条件,再用同一制品摘要汇合策略结果。
这个拆分还有一个好处:当新的漏洞信息出现时,SBOM 可以帮助定位受影响组件;当构建器或发布身份发生异常时,provenance 可以帮助回溯来源。两条复查路径最终都回到制品对象,而不是在脱离上下文的文档集合里猜测。
安全策略要同时看内容、来源和身份
单纯要求“必须有 SBOM”还不够,因为有清单不代表清单完整、来源可信或当前制品未被替换。更稳妥的策略可以分成三层:先检查 SBOM 是否与制品摘要关联,再检查 provenance 的构建器、输入和输出是否符合组织要求,最后验证签名身份和存储记录是否可追溯。
策略也不应该把所有失败都归为同一种风险。例如缺少 SBOM 可能是可见性问题,构建器不在允许列表可能是来源问题,签名无法验证则是信任链问题。不同证据缺失要映射到不同处置动作,才不会为了“门禁通过”而把元数据补成形式文件。
需要特别注意的是,SBOM 是某次构建的快照,漏洞信息还会随时间变化;来源证明能说明构建事实,也不等于证明代码本身没有漏洞。CNCF TAG Security 将 SBOM、attestation、VEX、签名和策略放在同一套供应链安全语境中,原因就在于它们解决的是相互连接但不相同的风险。
我会留下的审计记录和复查边界
最后我会把以下记录作为发布包的一部分:制品摘要、SBOM 格式与生成时间、provenance 格式与生成时间、签名身份、元数据存储位置、策略版本以及后续复查结果。记录时间不是装饰字段,它能帮助区分“这份清单对应哪次构建”和“后来发现的漏洞是否需要重新判断”。
从标准和基金会资料的共同方向看,SBOM 与 provenance 的协同并不是再创建一份更大的万能文档,而是让不同类型的事实围绕同一个制品形成可验证的关系。对于团队来说,最小可行路径是先选定制品标识和元数据存储,再逐步补齐构建身份、签名、策略和持续复查。
SBOM 能不能代替构建来源证明?
不能。SBOM 主要描述组件组成,不能单独证明源代码从哪里来、由哪个构建器生成,或构建参数是否符合策略。
provenance 能不能代替 SBOM?
也不能。来源证明可以说明输入、构建和输出关系,但不一定包含足够细的组件清单,不能代替依赖查询和漏洞影响分析。
两份文档一定要使用同一种格式吗?
不一定。更重要的是制品摘要、字段语义、签名身份和分发位置能够稳定关联;格式统一可以降低工具适配成本,但不能替代生成阶段的事实采集。
事后扫描生成的 SBOM 还有价值吗?
有价值,尤其适合遗留制品和消费侧复查,但它可能看不到构建工具链、手工安装内容或构建上下文。能在构建阶段采集时,应优先保留构建时证据,再用扫描作为补充。
官方资料:https://contribute.cncf.io/community/tcgs/software-supply-chain-security/;https://slsa.dev/spec/v1.0/provenance;https://in-toto.io/。
-
335 收藏
-
214 收藏
-
科技周边 · 业界新闻 | 4个月前 | 安全 · CI/CD · gitHub actions · 业界新闻 · 开发者工具 · 代码审查 供应链安全 业界新闻 GitHub Actions 机器人PR CI安全473 收藏
-
科技周边 · 业界新闻 | 4个月前 | github · gitHub actions · 业界新闻 · GitHub AI代理 GitHub Actions Agentic Workflows CI分析 Issue分流 工程自动化354 收藏
-
科技周边 · 业界新闻 | 4个月前 | devops · CI/CD · gitHub actions · 业界新闻 · DevOps CI/CD GitHub Actions self-hosted runner Runner升级431 收藏
-
340 收藏
-
112 收藏
-
298 收藏
-
325 收藏
-
493 收藏
-
404 收藏
-
科技周边 · 业界新闻 | 1小时前 | 云原生 · 可观测性 · 可观测性 pprof eBPF OpenTelemetry Profiles Profiles Alpha OpenTelemetry Collector486 收藏
-
285 收藏
-
362 收藏
-
267 收藏
-
284 收藏
-
108 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习