容器化部署的普及让镜像成为软件交付的核心载体,但镜像在构建、推送、拉取链路中面临被替换或注入后门的风险。Kubernetes默认只负责调度和运行,并不关心镜像是否来自可信构建流程。镜像签名正是用来解决信任问题的手段,它通过对镜像摘要用非对称密钥签名,在运行时验证签名有效性,从而阻断未授权镜像进入集群。

镜像签名的基本原理与Sigstore Cosign实践
镜像签名本质上是对镜像的哈希摘要进行数字签名。容器镜像由多层tar包和配置文件组成,注册表会为完整镜像计算出一个内容寻址的摘要值,例如sha256:abc123...。签名工具使用私钥对该摘要加密生成签名文件,并将签名推送到注册表或透明日志中。验证方用对应的公钥解密并比对摘要,一致则说明镜像自签名后未被修改。
Sigstore旗下的Cosign是目前最轻量的签名工具,它不需要复杂的后台服务,可直接与OCI注册表交互。下面示例展示在CI中使用Cosign生成密钥对并对本地构建出的镜像签名:
# 生成密钥对,私钥cosign.key需妥善保存,公钥cosign.pub分发到集群 cosign generate-key-pair # 对镜像进行签名,密码从环境变量读取避免交互 export COSIGN_PASSWORD=my_secret cosign sign --key cosign.key registry.ipipp.com/apps/myimage:1.0.0 # 验证签名 cosign verify --key cosign.pub registry.ipipp.com/apps/myimage:1.0.0
这种方式的优势在于密钥完全自管,适合已经具备KMS或密码库的企业。缺点是私钥保护依赖人工流程,若私钥泄露则签名信任体系崩溃。为此Cosign也支持基于OIDC的身份短时证书,结合Fulcio证书颁发与Rekor透明日志,实现无长期私钥的签名模式。
在Kubernetes中强制验签的准入控制方案
仅有签名动作还不够,必须让集群在创建负载时拒绝无签名或验签失败的镜像。Kubernetes的准入控制器是最合适的拦截点。传统方案是部署Notary的trust钩子,而当前更流行用Connaisseur或Kyverno这类策略引擎。它们以Mutating或Validating Webhook形式运行,监听Pod创建请求并调用Cosign完成验签。
以Kyverno为例,我们可以通过ClusterPolicy定义规则:当Pod引用的镜像不在白名单且无法通过公钥验证时,直接返回拒绝。下面给出简化的策略片段,其中cosign.verifyImages字段指定了公钥所属密钥库:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-image-sign
spec:
validationFailureAction: enforce
rules:
- name: verify-myimage
match:
resources:
kinds:
- Pod
verifyImages:
- image: "registry.ipipp.com/apps/*"
key: |-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
-----END PUBLIC KEY-----
该方案把安全左移到了部署边界,即使开发人员误配了外部镜像,控制面也会拦截。但要注意Webhook本身需高可用,否则验签服务宕机可能导致全集群无法发布。建议在独立命名空间部署多副本,并配置失败开放或关闭的明确策略,避免雪崩。
Notary与Cosign的对比及密钥管理要点
提到镜像签名,老牌的Notary(v2)和新兴的Cosign常被拿来比较。Notary依托TUF框架,提供完整的信任根轮换和角色委派,适合大型多租户注册表;但它需要独立的notary-server与数据库,运维重。Cosign紧贴OCI标准,签名作为附加manifest存放,几乎零外部依赖,更适配GitOps与CI流水线。
在密钥管理上,无论选哪种工具,都必须避免把私钥写进代码仓库。推荐接驳云厂商KMS或HashiCorp Vault,CI中通过临时令牌拉取私钥。公钥则可以固化进准入策略或挂在集群Secret中。另外,引入透明日志(如Rekor)能审计所有签名事件,当密钥作废时可快速定位受影响镜像范围。
# 使用Vault获取Cosign私钥签名的示例逻辑 vault kv get -field=cosign_key secret/ci/cosign > cosign.key cosign sign --key cosign.key registry.ipipp.com/apps/myimage:1.1.0 rm -f cosign.key
综合来看,供应链安全不是单点工具能覆盖的,镜像签名只是其中一环。团队应结合SBOM生成、漏洞扫描与运行时监控,形成从代码提交到线上运行的闭环。只有当签名、验签、审计三者联动,Kubernetes工作负载才真正具备抗篡改能力。
Kubernetes镜像签名供应链安全修改时间:2026-08-13 23:21:29