本文档正在积极开发中,尚未最终定稿。
Skip to content

4.2 密钥管理

密钥管理

加密密钥的安全管理对于签名流程的完整性至关重要。

密钥类型

密钥类型存储位置用途
Cosign 私钥Ed25519 / ECDSA P-256GitHub Secrets制品签名
Cosign 密码密码GitHub Secrets保护私钥
Cosign 公钥Ed25519 / ECDSA P-256仓库 (cosign.pub)用户验证

密钥生成

bash
# 生成新的密钥对
cosign generate-key-pair

# 结果:
# cosign.key  → 私钥(密码保护)
# cosign.pub  → 公钥

密钥存储

私钥

私钥 存储在 GitHub Secrets 中:

  • Secret 名称: COSIGN_PRIVATE_KEY
  • 访问权限: 仅限 GitHub Actions 工作流
  • 保护方式: GitHub Secrets 加密(Libsodium sealed box)
  • 可见性: 永不出现在日志中,永不出现在代码中

密码

  • Secret 名称: COSIGN_PASSWORD
  • 访问权限: 仅与 COSIGN_PRIVATE_KEY 配合使用

公钥

  • 存储位置: 仓库根目录 (cosign.pub)
  • 可用性: 公开
  • 用途: 供用户和系统进行验证

密钥轮换

触发条件操作期限
每年例行轮换每 12 个月
怀疑泄露立即轮换不得延迟
人员变动审查并在必要时轮换7 天内
安全事件作为事件响应 (Incident Response) 的一部分进行轮换按应急手册执行

轮换流程

1. 生成新的密钥对
   └── cosign generate-key-pair

2. 更新 GitHub Secrets
   ├── COSIGN_PRIVATE_KEY → 新私钥
   └── COSIGN_PASSWORD → 新密码

3. 更新仓库中的公钥
   └── cosign.pub → 新公钥

4. 归档旧公钥
   └── keys/cosign-<date>.pub.archived

5. 更新文档
   ├── 轮换日期
   ├── 密钥指纹
   └── 轮换原因

6. 验证
   └── 执行测试签名和验证

密钥泄露时的应急流程

  1. 立即: 轮换 GitHub Secrets(新密钥对)
  2. 1 小时内: 识别自泄露以来签名的所有发布
  3. 4 小时内: 使用新密钥重新签名受影响的发布
  4. 24 小时内: 通知用户密钥变更
  5. 文档记录: 在事件报告 (Incident Report) 中记录该事件

访问权限

角色私钥公钥密钥轮换
安全负责人 (Security Lead)管理(GitHub Secrets)读取执行
DevOps 负责人无直接访问(仅通过工作流)读取支持
开发团队无访问权限读取无访问权限
GitHub Actions读取(运行时)读取无访问权限

文档基于 CC BY-NC 4.0 许可 · 代码基于 MIT 许可