OCI 镜像签名进入构建链后如何划分验证责任
把 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 必须同时部署吗?
不一定。前者适合集群准入策略,后者更靠近容器启动边界;是否叠加取决于旁路风险、运行时支持和故障恢复能力。
Go maps.DeleteFunc 如何按条件清理 map
- 上一篇
- Go maps.DeleteFunc 如何按条件清理 map
- 下一篇
- 创业团队选墨刀AI前怎么做小样测试?用一条需求检查协作与交付
-
- 科技周边 · 业界新闻 | 2小时前 | 云原生 · kubernetes · 网关路由 · Kubernetes ingress Gateway API HTTPRoute
- Kubernetes Gateway API 替换 Ingress 时要核对哪些路由
- 311浏览 收藏
-
- 科技周边 · 业界新闻 | 3小时前 | 日志 · trace · opentelemetry · 可观测性 OpenTelemetry trace_id 日志关联
- OpenTelemetry 日志信号进入生产后如何和 trace_id 对齐
- 400浏览 收藏
-
- 科技周边 · 业界新闻 | 4小时前 | gitHub actions · 持续集成 · 构建验证 · GitHub Actions runner images 构建矩阵
- GitHub Actions Runner Images 更新时如何验证构建矩阵
- 344浏览 收藏
-
- 科技周边 · 业界新闻 | 6小时前 |
- OpenTelemetry GenAI 语义约定变化后如何整理追踪字段
- 272浏览 收藏
-
- 科技周边 · 业界新闻 | 7小时前 |
- PHP 8.5 新语法发布后旧项目如何安排兼容性扫描
- 430浏览 收藏
-
- 科技周边 · 业界新闻 | 9小时前 |
- Python 3.14 free-threaded 构建如何确认解释器模式
- 446浏览 收藏
-
- 科技周边 · 业界新闻 | 11小时前 |
- Go 1.27.1 的 encoding/json 和 net/http 修复如何纳入回归测试
- 226浏览 收藏
-
- 科技周边 · 业界新闻 | 12小时前 |
- Go 1.27.1 修复 cgo 和编译器问题后如何安排升级验证
- 241浏览 收藏
-
- 科技周边 · 业界新闻 | 14小时前 |
- etcd v3.7 RangeStream 用于大列表时如何估算客户端改造量
- 146浏览 收藏
-
- 科技周边 · 业界新闻 | 15小时前 | 云原生 · 调度器 · kubernetes · 资源调节 · Kubernetes v1.37 调度器抢占 InPlacePodVerticalScaling Pod resize
- Kubernetes v1.37 InPlacePodVerticalScaling 如何检查原地调节条件
- 122浏览 收藏
-
- 科技周边 · 业界新闻 | 16小时前 | kubernetes · Gateway API · TCPRoute · 云原生网络 · 入口迁移 · Gateway API v1.6 TCPRoute v1迁移 Gateway入口规则评估
- Gateway API v1.6 TCPRoute 标准化后如何评估现有入口规则
- 219浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 28次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 131次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 67次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 23次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 11次使用
-
- Go 项目用 GitHub Actions 自托管 runner:版本强制执行前该怎么整理 CI
- 2026-07-09 340浏览
-
- AI 编程代理进入工程主流程:从官方动态看团队落地的三个信号
- 2026-06-13 214浏览
-
- 机器人 PR 运行 CI/CD 需要审批:GitHub Actions 新变化给团队的安全提醒
- 2026-06-13 473浏览
-
- GitHub Agentic Workflows 公测:AI 代理开始进入 Actions 自动化流水线
- 2026-06-13 354浏览
-
- GitHub Actions 自托管 Runner 强制升级时间线:CI 团队该提前查什么
- 2026-06-13 431浏览

