3. 密钥管理基础:非对称加密原理、公钥/私钥对生成与存储安全策略

在 Cosign 驱动的镜像供应链信任体系中,密钥管理是信任边界的基石。Cosign 使用非对称加密对镜像进行签名和验证,私钥用于签名,公钥用于验证。本章将深入讲解非对称加密原理、密钥对生成、存储安全策略以及环境变量与文件系统的实践。

3.1 非对称加密原理与 Cosign 签名流程

非对称加密使用一对密钥:私钥(Private Key)和公钥(Public Key)。私钥必须严格保密,公钥可以公开分发。Cosign 的签名流程如下:

  1. 签名者使用自己的私钥对镜像摘要(Digest)进行签名,生成签名文件。
  2. 验证者获取签名者的公钥,对签名进行解密,并与镜像摘要比对。
  3. 若解密后的摘要与镜像摘要一致,则证明镜像未被篡改且确实由私钥持有者签名。
核心概念:Cosign 不直接签名镜像层数据,而是签名镜像的 SHA256 摘要,确保签名体积小且验证高效。
非对称加密签名与验证流程 签名者(私钥) 镜像 SHA256 摘要 签名文件 验证者(公钥) 解密摘要 比对结果 私钥签名 → 公钥验证:只有私钥持有者才能生成有效签名,公钥可公开分发

3.2 使用 Cosign 生成密钥对

Cosign 提供 cosign generate-key-pair 命令一键生成密钥对。生成的密钥文件默认保存在当前目录:

  • 私钥文件:cosign.key(加密存储,需密码保护)
  • 公钥文件:cosign.pub(明文存储,可公开)
# 生成密钥对(交互式输入密码)
cosign generate-key-pair

# 输出示例:
Enter password for private key: 
Enter password for private key again: 
Private key written to cosign.key
Public key written to cosign.pub
最佳实践:生成密钥对时,密码强度至少 16 位,包含大小写字母、数字和特殊字符。Cosign 使用 RSA 或 ECDSA 算法,默认使用 ECDSA P-256。

3.3 密钥存储安全策略

私钥是信任链的核心资产,必须采用分层安全策略。以下表格对比了不同存储方式的安全等级与适用场景:

存储方式 安全等级 适用场景 风险点
本地文件系统 低 开发测试环境 文件泄露、未加密存储
环境变量 中 CI/CD 临时使用 日志泄露、进程内存转储
密钥管理服务(KMS) 高 生产环境、合规要求 网络依赖、成本较高
硬件安全模块(HSM) 极高 金融、政府等高安全场景 部署复杂、成本高
安全警告:切勿将私钥文件提交到 Git 仓库、存储在公开的云存储桶或未加密的共享目录中。私钥泄露意味着信任链完全失效。

3.4 环境变量与文件系统实践

Cosign 支持通过环境变量传递私钥密码,避免交互式输入,适合自动化流水线。常用环境变量包括:

  • COSIGN_PASSWORD:私钥解密密码
  • COSIGN_KEY:私钥文件路径(默认 cosign.key)
  • COSIGN_PUBLIC_KEY:公钥文件路径(默认 cosign.pub)
# 使用环境变量签名镜像
export COSIGN_PASSWORD="your-strong-password"
cosign sign --key cosign.key your-registry/your-image:tag

# 使用环境变量验证镜像
cosign verify --key cosign.pub your-registry/your-image:tag
文件系统安全建议:
  • 私钥文件权限设置为 600(仅所有者可读写)
  • 公钥文件权限设置为 644(所有者读写,其他人只读)
  • 使用 chmod 600 cosign.key 和 chmod 644 cosign.pub 设置权限
  • 在 CI/CD 中,私钥密码通过 Secret 变量注入,避免明文写入配置文件
密钥存储安全策略架构 Cosign 密钥对 文件系统 环境变量 KMS HSM 权限 600 Secret 注入 自动轮转 物理隔离

3.5 密钥轮转与吊销

密钥应定期轮转,以降低长期泄露风险。Cosign 支持以下密钥管理操作:

操作 命令/方法 说明
生成新密钥对 cosign generate-key-pair 生成新密钥,旧密钥需手动废弃
公钥分发 上传至公开密钥服务器或嵌入 CI/CD 配置 确保验证者获取最新公钥
密钥吊销 通过 Rekor 透明日志记录吊销声明 吊销后旧签名仍可验证,但信任度降低
轮转建议:生产环境密钥每 90 天轮转一次;开发环境每 180 天轮转一次。轮转后,旧公钥应保留一段时间以验证历史签名。

3.6 本章小结