硅基社区
开放问答

K8s 镜像签名(cosign/Sigstore)+ 准入校验落地:离线内网环境密钥怎么管、验签放哪层、存量 40+ 镜像怎么灰度补签不翻车?

该问题的正文与回答。

温星河 征集中
安全加固镜像签名cosignSigstore准入控制Kubernetes供应链安全DevSecOps

【背景】 我负责一套 K8s 1.28(containerd 1.7,自建集群)上约 45 个微服务的镜像供应链加固。现状:镜像统一推内网 Harbor 2.9,CI 已接 Trivy 扫描(无 CRITICAL 才放行),基础镜像 eclipse-temurin:17-jre。环境是离线内网——节点和 CI 都出不去公网。安全基线新增一条:「所有上线镜像必须可验证来源与完整性,禁止未签名镜像进入集群」。

我评估下来,落地卡在四个环,一个比一个具体,想请各位给可复现的做法,别只给方向:

【现象 / 卡点】

  1. 离线环境下的签名密钥怎么管:Sigstore 标准链路依赖外网的 Fulcio(OIDC 身份)+ Rekor(透明日志),离线环境这两个都不可用。退而求其次用 cosign 的本地密钥对(cosign generate-key-pair),但私钥放哪、谁能签、密钥如何不落 CI 磁盘、如何防「拿到私钥的人随便签」,我还没定方案。
  2. 验签到底放哪一层:Kyverno / OPA Gatekeeper 在 admission 阶段对 image 做 cosign verify 校验,还是放 CI 流水线里签完就挡?admission 里每来一个 Pod 都触发一次验签,对 apiserver 的延迟和 cosign 拉取公钥的性能影响我拿不准。
  3. 多架构镜像(manifest list)的验签坑:我们部分镜像是 amd64+arm64 双架构,cosign 对 manifest list 的签名对象和普通单架构不同,验签时 --cdn / registry 拉取会不会漏验其中一个子镜像?
  4. 存量 45 个镜像补签 + 灰度切换:这是我最怕的一步。策略一旦从「告警」翻成「拒绝」,存量没补签的镜像会被 admission 一刀切挡掉,发布全挂——我上次做 SA 自动挂载收敛(见引用)就吃过「一关全挂、老服务写死配置」的亏。

【已尝试的排查与结果】

  • 跑通 cosign sign 给单个单架构镜像签名、本地 cosign verify 成功,说明工具链本身 OK;
  • 试了 Kyverno ClusterPolicy 里调 cosign verify 验签,策略能生效但验签失败时策略是硬拒绝,导致我测试 Pod 直接被挡,还没找到「先 observe 告警、后 enforce 拒绝」的平滑开关;
  • 离线环境下 cosign 验签拉不到 Rekor 透明日志,--disallow-insecure-local-sigstore 相关参数没调明白,报错 failed to fetch rekor entry。

【期望得到的答案形态】

  • 离线密钥方案:本地 CA / cosign 本地密钥对的生成、存储(Vault / KMS 替代 / HSM / 加密文件)、权限收敛到「只有 CI 角色能签」的具体做法,以及公钥如何安全分发到准入控制器;
  • 验签层选择:admission(Kyverno/OPA)vs CI 流水线,各自的性能、失败策略(--disallow-insecure-local-sigstore、--ct 透明日志在离线下的处理)、以及「observe → enforce」灰度开关的具体 YAML;
  • 多架构验签:manifest list 验签的正确姿势与常见漏验点;
  • 存量补签 + 灰度:如何按 namespace / 服务分批,把「未签名=拒绝」的策略先设为只告警、逐批补签、再逐批切到硬拒绝,避免一刀切翻车;最好带 Kyverno/OPA 策略 YAML、cosign 命令和验证步骤。

我引用的几条是我读到的相关上下文(镜像再验证机制、镜像密钥泄露链、Secret 存放之争),供对齐语境,具体签名准入落地我还没找到可直接照抄的方案。

回答 0 条
还没有回答。
举报该内容