3. 镜像签名与验证基础:Cosign工具介绍、镜像签名流程、公钥/私钥对管理
在云原生安全体系中,镜像签名是确保容器镜像从构建到部署全链路可信的关键环节。本章节将深入介绍 Cosign 这一主流签名工具,详细拆解镜像签名的完整流程,并系统讲解公钥/私钥对的生命周期管理方法。
3.1 Cosign 工具介绍
Cosign 是 Sigstore 项目下的核心组件之一,旨在简化容器镜像的签名与验证过程。它无需复杂的 PKI 基础设施,支持多种签名模式,并深度集成 OCI 标准。
| 特性 | 说明 |
|---|---|
| 无密钥模式 | 支持通过 OIDC 身份进行密钥生成与签名,无需手动管理私钥。 |
| 密钥对模式 | 支持传统的公钥/私钥对签名,适用于离线或高安全环境。 |
| OCI 集成 | 签名作为 OCI 制品存储在镜像仓库中,无需额外存储后端。 |
| 透明日志 | 签名记录可自动上传至 Rekor 透明日志,提供全局可审计性。 |
| 策略引擎 | 可与 Kyverno、OPA 等策略引擎集成,实现自动化验证。 |
推荐场景: 在集群升级前巡检中,推荐使用 Cosign 的密钥对模式对关键基础镜像进行离线签名,确保签名过程不依赖外部网络,同时将公钥安全分发至集群内。
3.2 镜像签名流程
镜像签名流程的核心是将镜像摘要(Digest)与签名者身份绑定,生成不可篡改的签名数据。以下是基于 Cosign 密钥对模式的完整签名流程:
- 生成密钥对: 使用
cosign generate-key-pair命令生成私钥(cosign.key)和公钥(cosign.pub)。 - 计算镜像摘要: Cosign 自动拉取镜像并计算其 SHA256 摘要。
- 签名操作: 使用私钥对镜像摘要进行签名,生成签名载荷。
- 存储签名: 签名作为 OCI 制品(
sha256-xxx.sig)推送至镜像仓库。 - 上传透明日志(可选): 签名记录可同步至 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
3.3 公钥/私钥对管理
密钥对管理是镜像签名安全性的基石。不安全的密钥存储或分发可能导致签名被伪造或验证失效。以下是密钥对管理的核心实践:
| 管理环节 | 推荐实践 | 风险说明 |
|---|---|---|
| 私钥生成 | 在离线、受控环境中生成,使用强密码保护。 | 在联网环境生成可能被窃取。 |
| 私钥存储 | 使用硬件安全模块(HSM)或密钥管理服务(KMS)。 | 文件系统存储易被泄露。 |
| 私钥轮换 | 定期轮换(如每90天),旧密钥用于验证历史签名。 | 长期不轮换增加泄露风险。 |
| 公钥分发 | 通过安全通道分发至集群,或嵌入策略引擎。 | 公钥被篡改会导致验证失效。 |
| 密钥撤销 | 使用 Sigstore 的 Fulcio 或自定义撤销列表。 | 无撤销机制时泄露密钥无法补救。 |
安全警告: 切勿将私钥(
cosign.key)提交至代码仓库或镜像中。私钥泄露后,攻击者可对任意镜像进行签名,绕过安全验证。建议使用 cosign import 命令将私钥导入 KMS 进行托管。
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