4. 生成密钥对:Cosign 生成公私钥、密钥存储安全策略、密钥生命周期管理

密钥是镜像签名的信任锚点。Cosign 使用公私钥对进行签名与验证:私钥用于对镜像摘要签名,公钥分发给验证方。本章聚焦密钥对的生成、安全存储与全生命周期管理,帮助你在生产环境中建立可靠的密钥治理基线。

4.1 Cosign 密钥对生成

Cosign 支持两种密钥生成方式:原生密钥对(默认使用 ECDSA P-256 曲线)和 KMS 托管密钥。以下为原生密钥对生成命令:

# 生成 Cosign 密钥对(默认 ECDSA P-256)
cosign generate-key-pair

# 指定输出文件名前缀
cosign generate-key-pair --output-key-prefix myapp

# 查看生成的密钥文件
ls -la
# 输出示例:
# -rw-------  1 user user  227 Mar 15 10:00 cosign.key
# -rw-r--r--  1 user user  178 Mar 15 10:00 cosign.pub

生成过程中会提示输入私钥加密密码。该密码用于对磁盘上的私钥文件进行 AES-256-GCM 加密,防止私钥明文泄露。

密钥文件 权限建议 内容格式 用途
cosign.key 600(仅所有者可读写) 加密的 PEM 格式 签名操作
cosign.pub 644(可读,不可写) 明文 PEM 格式 验证操作
生产建议:不要在 CI/CD 流水线中直接使用 cosign generate-key-pair 生成密钥。应使用 KMS(如 AWS KMS、GCP Cloud KMS、Azure Key Vault)或硬件安全模块(HSM)托管私钥,避免私钥文件在构建环境中落地。

4.2 密钥存储安全策略

私钥存储是供应链安全中最薄弱的环节。以下策略按安全等级从低到高排列:

  1. 本地文件加密存储:私钥文件使用强密码加密,存储在安全目录(如 ~/.cosign/),仅限签名操作时临时解密。
  2. 密钥管理服务(KMS):私钥由云厂商 KMS 托管,Cosign 通过 API 调用签名,私钥材料永不离开 KMS 边界。
  3. 硬件安全模块(HSM):私钥存储在 FIPS 140-2 Level 3 认证的 HSM 中,适用于金融、政务等高安全场景。
  4. 短期凭证 + 临时密钥:使用 OIDC 令牌从 KMS 获取临时签名密钥,密钥有效期仅数分钟,过期自动销毁。
密钥存储安全策略对比 本地文件加密 密码加密 PEM KMS 托管 API 签名,密钥不落地 HSM 硬件模块 FIPS 140-2 Level 3 临时密钥 OIDC + 短期凭证 安全等级递增 → ⚠ 风险提示 本地文件加密存储存在密码泄露、文件被窃、备份泄露等风险。生产环境应优先使用 KMS 或 HSM。 密钥访问控制原则 • 最小权限:签名操作仅授权给 CI/CD 服务账号,验证操作公开可读 • 审计日志:所有密钥使用操作记录到审计系统(如 AWS CloudTrail) • 多因素保护:KMS 操作要求 IAM 权限 + 资源策略双重校验 • 密钥轮换:定期轮换密钥,旧密钥仅保留验证能力

4.3 密钥生命周期管理

密钥生命周期包括生成、分发、使用、轮换、吊销和销毁六个阶段。每个阶段都需要明确的策略和自动化工具支持。

阶段 操作 安全要求 自动化工具
生成 创建密钥对 使用 KMS 或 HSM,避免本地生成 Cosign + KMS 插件
分发 公钥分发给验证方 通过可信渠道(如 Git 仓库、OIDC 发现端点) cosign public-key、TUF 仓库
使用 签名镜像 私钥仅用于签名,不用于加密或认证 cosign sign --key
轮换 生成新密钥对,旧密钥保留验证能力 轮换周期建议 90 天,保留旧公钥至所有镜像重新签名 cosign rotate、自定义脚本
吊销 标记密钥为已吊销 通过 CRL 或 TUF 仓库发布吊销信息 Fulcio、Rekor、TUF
销毁 彻底删除私钥材料 确认所有使用该密钥签名的镜像已重新签名或过期 KMS 删除 API、HSM 销毁操作
密钥生命周期管理流程 ① 生成 ② 分发 ③ 使用 ④ 轮换 ⑤ 吊销 ⑥ 销毁 轮换和吊销是密钥生命周期中最容易被忽视的环节。建议使用 TUF(The Update Framework)管理公钥分发和吊销状态。

4.4 密钥轮换实战

密钥轮换是防止密钥泄露后影响范围扩大的关键措施。以下为 Cosign 密钥轮换的标准流程:

# 1. 生成新密钥对
cosign generate-key-pair --output-key-prefix myapp-v2

# 2. 使用新私钥重新签名所有镜像
cosign sign --key myapp-v2.key <镜像引用>

# 3. 将新公钥添加到验证方信任列表
cosign public-key --key myapp-v2.key >> trusted-keys.pub

# 4. 保留旧公钥用于验证已签名的镜像
# 旧公钥保留在信任列表中,直到所有镜像完成重新签名

# 5. 确认所有镜像已使用新密钥签名后,移除旧公钥
# 从 trusted-keys.pub 中删除旧公钥条目
轮换陷阱:不要立即删除旧公钥。如果仍有镜像使用旧密钥签名,验证会失败。建议设置 30 天过渡期,期间新旧公钥同时有效。使用 cosign verify 的 --check-claims=false 选项可以临时绕过签名验证,但仅用于紧急故障排查。

4.5 密钥吊销与失效处理

当密钥泄露或怀疑泄露时,需要立即吊销密钥。Cosign 本身不提供吊销列表(CRL)功能,需要结合外部基础设施实现:

  • 使用 Rekor 透明日志:吊销信息记录在 Rekor 中,验证方查询 Rekor 确认密钥状态。
  • 使用 TUF 仓库:在 TUF 元数据中标记密钥为已吊销,客户端自动获取最新信任状态。
  • 使用 OIDC 身份绑定:通过 Fulcio 签发的短期证书,证书过期即自动失效,无需手动吊销。
  • 手动吊销脚本:在内部密钥管理系统中标记密钥状态,验证流水线查询该状态。
# 示例:在 Rekor 中记录密钥吊销事件
cosign verify --key revoked-key.pub <镜像引用>
# 如果密钥已吊销,验证会失败并返回吊销信息

# 使用 Fulcio 短期证书(推荐)
# 证书有效期通常为 10 分钟,过期后自动失效
cosign sign --fulcio-url https://fulcio.sigstore.dev <镜像引用>
最佳实践总结:
  • 生产环境使用 KMS 托管私钥,避免私钥文件落地
  • 密钥轮换周期不超过 90 天
  • 使用 Fulcio + OIDC 实现短期证书签名,消除密钥吊销需求
  • 公钥通过 TUF 仓库或 Git 仓库分发,确保分发通道可信
  • 所有密钥操作记录审计日志,便于事后追溯