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 密钥存储安全策略
私钥存储是供应链安全中最薄弱的环节。以下策略按安全等级从低到高排列:
- 本地文件加密存储:私钥文件使用强密码加密,存储在安全目录(如
~/.cosign/),仅限签名操作时临时解密。 - 密钥管理服务(KMS):私钥由云厂商 KMS 托管,Cosign 通过 API 调用签名,私钥材料永不离开 KMS 边界。
- 硬件安全模块(HSM):私钥存储在 FIPS 140-2 Level 3 认证的 HSM 中,适用于金融、政务等高安全场景。
- 短期凭证 + 临时密钥:使用 OIDC 令牌从 KMS 获取临时签名密钥,密钥有效期仅数分钟,过期自动销毁。
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 销毁操作 |
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 仓库分发,确保分发通道可信
- 所有密钥操作记录审计日志,便于事后追溯