3. 镜像签名与验证基础:Cosign工具介绍、镜像签名流程、公钥/私钥对管理

在云原生安全体系中,镜像签名是确保容器镜像从构建到部署全链路可信的关键环节。本章节将深入介绍 Cosign 这一主流签名工具,详细拆解镜像签名的完整流程,并系统讲解公钥/私钥对的生命周期管理方法。

3.1 Cosign 工具介绍

Cosign 是 Sigstore 项目下的核心组件之一,旨在简化容器镜像的签名与验证过程。它无需复杂的 PKI 基础设施,支持多种签名模式,并深度集成 OCI 标准。

特性 说明
无密钥模式 支持通过 OIDC 身份进行密钥生成与签名,无需手动管理私钥。
密钥对模式 支持传统的公钥/私钥对签名,适用于离线或高安全环境。
OCI 集成 签名作为 OCI 制品存储在镜像仓库中,无需额外存储后端。
透明日志 签名记录可自动上传至 Rekor 透明日志,提供全局可审计性。
策略引擎 可与 Kyverno、OPA 等策略引擎集成,实现自动化验证。
推荐场景: 在集群升级前巡检中,推荐使用 Cosign 的密钥对模式对关键基础镜像进行离线签名,确保签名过程不依赖外部网络,同时将公钥安全分发至集群内。

3.2 镜像签名流程

镜像签名流程的核心是将镜像摘要(Digest)与签名者身份绑定,生成不可篡改的签名数据。以下是基于 Cosign 密钥对模式的完整签名流程:

  1. 生成密钥对: 使用 cosign generate-key-pair 命令生成私钥(cosign.key)和公钥(cosign.pub)。
  2. 计算镜像摘要: Cosign 自动拉取镜像并计算其 SHA256 摘要。
  3. 签名操作: 使用私钥对镜像摘要进行签名,生成签名载荷。
  4. 存储签名: 签名作为 OCI 制品(sha256-xxx.sig)推送至镜像仓库。
  5. 上传透明日志(可选): 签名记录可同步至 Rekor 透明日志,提供公开验证入口。
关键命令示例:
# 生成密钥对
cosign generate-key-pair

# 使用私钥对镜像进行签名
cosign sign --key cosign.key registry.example.com/my-image:v1.0

# 验证签名
cosign verify --key cosign.pub registry.example.com/my-image:v1.0
镜像签名与验证流程(密钥对模式) 开发者 生成密钥对 镜像仓库 签名操作 签名存储 验证者 验证签名 公钥 流程说明 1. 开发者生成密钥对 2. 推送镜像至仓库 3. 使用私钥签名 4. 签名存储至仓库 5. 验证者获取镜像 6. 使用公钥验证 7. 验证通过则可信

3.3 公钥/私钥对管理

密钥对管理是镜像签名安全性的基石。不安全的密钥存储或分发可能导致签名被伪造或验证失效。以下是密钥对管理的核心实践:

管理环节 推荐实践 风险说明
私钥生成 在离线、受控环境中生成,使用强密码保护。 在联网环境生成可能被窃取。
私钥存储 使用硬件安全模块(HSM)或密钥管理服务(KMS)。 文件系统存储易被泄露。
私钥轮换 定期轮换(如每90天),旧密钥用于验证历史签名。 长期不轮换增加泄露风险。
公钥分发 通过安全通道分发至集群,或嵌入策略引擎。 公钥被篡改会导致验证失效。
密钥撤销 使用 Sigstore 的 Fulcio 或自定义撤销列表。 无撤销机制时泄露密钥无法补救。
安全警告: 切勿将私钥(cosign.key)提交至代码仓库或镜像中。私钥泄露后,攻击者可对任意镜像进行签名,绕过安全验证。建议使用 cosign import 命令将私钥导入 KMS 进行托管。
密钥对生命周期管理 生成密钥对 安全存储 签名使用 定期轮换 撤销/销毁 公钥分发 生命周期阶段 1. 离线生成密钥对 2. 私钥存入 KMS/HSM 3. 使用私钥签名 4. 定期轮换密钥 5. 泄露时立即撤销

3.4 签名验证策略

在集群升级前巡检中,验证策略决定了哪些镜像必须经过签名验证。以下是一个典型的验证策略配置:

  • 强制验证: 所有来自外部仓库的镜像必须携带有效签名。
  • 豁免列表: 内部构建的镜像或已通过其他方式验证的镜像可豁免。
  • 多签名支持: 支持多个签名者(如开发团队、安全团队)共同签名。
  • 失败处理: 验证失败时,阻止 Pod 启动并记录审计日志。
验证命令示例:
# 使用公钥验证镜像签名
cosign verify --key cosign.pub registry.example.com/my-image:v1.0

# 验证并检查透明日志条目
cosign verify --key cosign.pub --rekor-url https://rekor.sigstore.dev registry.example.com/my-image:v1.0