OCI 镜像签名进入构建链后如何划分验证责任
来源:17golang原创
时间:2026-09-15 05:08:43 202浏览 收藏
把 OCI 镜像签名塞进构建流水线,最容易犯的错是把 cosign sign 当成“安全已经完成”。更稳的划分是:构建系统负责产出可追溯的镜像,受保护的发布步骤负责签名,仓库负责保存按 digest 关联的证据,部署准入负责按策略放行,运行时再守住最后一道边界。签名证明“这个内容由某个可信身份签过”,并不自动证明内容没有漏洞、构建过程没有越权,也不代表任何环境都能兼容。
- 签名对象应是 OCI manifest digest;tag 只能作为查找入口,不能作为稳定身份。
- 签名、attestation、漏洞扫描和部署策略是不同证据,分别由不同环节消费。
- 先以观察或告警模式接入,再逐步收紧准入;旧仓库、多架构和离线环境要单独设计。
官方资料:https://docs.sigstore.dev/cosign/
先固定签名对象,再谈谁来签
OCI Image Specification 把镜像组织成 manifest、config、layers 和 descriptor,并用 digest 做内容寻址。一个发布链如果只在 tag 上签名,tag 被重新指向后,读者很难判断签名对应的是哪份内容。工程上应让构建器先推送镜像、记录最终 manifest digest,再让受保护的发布身份对这个 digest 签名。
这里有三个不同问题:构建器是否使用了允许的源代码和依赖,签名身份是否确实代表发布主体,最终拉取的 digest 是否就是被签过的对象。前两个问题可以由构建记录和签名证书回答,最后一个问题要由消费方在验证时重新比对 digest。

一个简化的发布片段可以这样表达责任边界:
# 先固定最终 digest,再由受保护的发布身份签名
IMAGE="registry.example.com/team/service@sha256:..."
cosign sign --yes "$IMAGE"
# attestation 描述构建事实,不能替代镜像签名
cosign attest --yes --predicate sbom.spdx.json --type spdxjson "$IMAGE"
上面的命令是文章中的配置示意,不表示本机已经执行。真正的门禁还要限制谁能触发发布、哪些流水线能拿到短期身份,以及签名失败时是否阻止晋级。
验证责任要分成仓库、准入和运行时三层
签名写入 registry 后,仓库只是在保存镜像和关联证据,它不应替业务决定“谁可以在生产运行”。晋级门禁适合检查签名身份、构建来源、SBOM 或漏洞阈值,并把合格的 digest 推进到下一环境;Kubernetes admission 则根据命名空间和镜像匹配规则决定请求能否创建。
Sigstore Policy Controller 的思路很适合说明这种分工:策略先匹配镜像,再要求至少一个 authority 验证通过;多个匹配策略通常要同时满足。换句话说,签名验证回答“证据是否有效”,策略回答“这份证据是否满足本环境的要求”。不要把这两个问题揉成一个布尔开关。
更靠近节点的 runtime hook 可以弥补 admission 的空档,例如静态 Pod、直接的 kubelet 路径、Webhook 网络故障或已经预拉取的镜像。它仍然不能替代集群策略,也不能拯救已经被完全攻破的节点。职责越靠后,覆盖面越强,但对运行时可用性和故障恢复的要求也越高。

| 环节 | 主要回答 | 不应独自承担 |
|---|---|---|
| 构建器 | 输入、依赖和产物如何关联 | 生产环境最终放行 |
| 签名发布步骤 | 哪个受信身份认可了哪个 digest | 证明镜像没有漏洞 |
| Registry | 镜像与签名/attestation 是否可取 | 按业务环境做授权决策 |
| 准入策略 | 当前命名空间是否接受该证据 | 替代构建来源记录 |
| Runtime hook | 容器真正启动前是否再次满足策略 | 修复被攻破的节点 |
兼容性决定了门禁收紧的速度
新链路通常不是“签名开启或关闭”二选一。先盘点 registry 是否支持 OCI referrer、旧客户端是否能拉取带关联对象的镜像、多架构镜像究竟签 index 还是签选中的 platform manifest,再决定验证点。对离线集群,还要明确证书链、透明日志或 bundle 能否在本地验证,不能把公网可达当成默认前提。
推荐采用三段式迁移:第一阶段记录缺失签名、身份不匹配和 digest 漂移,但不阻断;第二阶段只对新环境或高风险命名空间拒绝;第三阶段才把生产基线设为强制,并保留明确的回滚镜像和策略版本。这样失败时能判断是证据不存在、策略不匹配,还是仓库/网络不可用。
# 策略示意:注释说明决策,不是可直接套用的集群清单
no-match-policy: warn
# 灰度完成后再切换为 deny,并先准备可验证的回滚 digest+promotion-image: registry.example.com/team/service@sha256:...
落地前用五个问题检查责任是否清楚
- 签名绑定的是最终 manifest digest,还是仍在依赖可变 tag?
- 构建身份、签名身份和部署审批身份是否分离,泄露一个凭据会不会越过全部环节?
- 签名与 attestation 的保存位置、保留周期和离线验证方式是否明确?
- Policy Controller、其他 admission webhook 和 runtime hook 失败时,谁负责告警、重试和回滚?
- 多架构、旧 registry、预拉取镜像和静态 Pod 是否有单独的验证路径?
常见问题
镜像签名能代替漏洞扫描吗?
不能。签名确认内容与身份的关联,扫描关注已知风险;两者应作为不同门禁条件组合。
为什么不能只在 CI 构建完成时验证一次?
因为镜像可能在仓库、晋级或运行前被换成另一个 digest。消费端至少要在实际使用的 digest 上重新验证。
应该签 tag 还是签 digest?
以 digest 作为签名对象,tag 只用于人类查找和发布编排;部署清单也应尽量固定 digest。
Policy Controller 和 runtime hook 必须同时部署吗?
不一定。前者适合集群准入策略,后者更靠近容器启动边界;是否叠加取决于旁路风险、运行时支持和故障恢复能力。
-
Golang · Go教程 | 2个月前 | CI/CD · gitHub actions · Go教程 · 自托管 Runner · 持续集成 · Go 持续集成 CI Go test GitHub Actions self-hosted runner 自托管 runner340 收藏
-
214 收藏
-
科技周边 · 业界新闻 | 3个月前 | 安全 · CI/CD · gitHub actions · 业界新闻 · 开发者工具 · 代码审查 供应链安全 业界新闻 GitHub Actions 机器人PR CI安全473 收藏
-
科技周边 · 业界新闻 | 3个月前 | github · gitHub actions · 业界新闻 · AI代理 · GitHub AI代理 GitHub Actions Agentic Workflows CI分析 Issue分流 工程自动化354 收藏
-
科技周边 · 业界新闻 | 3个月前 | devops · CI/CD · gitHub actions · 业界新闻 · 自托管Runner · DevOps CI/CD GitHub Actions self-hosted runner Runner升级431 收藏
-
311 收藏
-
400 收藏
-
344 收藏
-
272 收藏
-
430 收藏
-
493 收藏
-
446 收藏
-
226 收藏
-
241 收藏
-
146 收藏
-
科技周边 · 业界新闻 | 15小时前 | 云原生 · 调度器 · kubernetes · 资源调节 · Kubernetes v1.37 调度器抢占 InPlacePodVerticalScaling Pod resize122 收藏
-
科技周边 · 业界新闻 | 16小时前 | kubernetes · Gateway API · TCPRoute · 云原生网络 · 入口迁移 · Gateway API v1.6 TCPRoute v1迁移 Gateway入口规则评估219 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习