Cosign镜像签名验证与供应链安全回滚 - 第2节
2.1 Cosign 是什么
Cosign 是 Sigstore 项目下的一个开源命令行工具,专为容器镜像、二进制文件、Blob 等软件制品提供无密钥(Keyless)签名、验证和存储能力。它解决了传统软件供应链签名中密钥管理复杂、流程繁琐的痛点,让开发者无需自行管理私钥即可完成签名,同时保证签名的可验证性和不可否认性。
核心能力:
- 无密钥签名(Keyless Signing): 利用 OIDC(OpenID Connect)身份协议,通过 GitHub、Google、Microsoft 等身份提供商临时签发签名凭证,签名后凭证立即失效,无需长期保管私钥。
- 镜像签名与验证: 支持对 Docker 镜像、OCI 镜像进行签名,并将签名存储在 OCI 仓库中(如 Harbor、Docker Hub),验证时自动拉取签名进行校验。
- 策略引擎集成: 可与 Kyverno、OPA/Gatekeeper 等策略引擎配合,在 Kubernetes 集群中强制要求镜像必须经过 Cosign 验证才能运行。
- 回滚与审计: 通过签名记录镜像的原始摘要,当镜像被篡改或替换时,验证失败即可触发回滚或告警。
2.2 Sigstore 生态介绍
Sigstore 是一个开源的安全签名生态系统,旨在简化软件供应链的签名、验证和透明度审计。它由三个核心组件构成,形成一个完整的信任链。
Sigstore 三大组件:
- Cosign: 签名与验证客户端工具,负责生成签名、上传签名、验证签名。
- Fulcio: 根证书颁发机构(Root CA),根据 OIDC 身份签发短期证书,证书有效期通常为 10 分钟。
- Rekor: 透明日志(Transparency Log),记录所有签名事件,提供不可篡改的审计线索,任何人都可以查询和验证。
Sigstore 的工作流程如下:开发者使用 Cosign 发起签名请求 → Cosign 向 Fulcio 请求证书 → Fulcio 验证 OIDC 身份后签发证书 → Cosign 使用证书对镜像签名 → 签名和证书被上传到 Rekor 日志 → 验证者从 Rekor 拉取签名和证书进行校验。
2.3 Cosign 与 Notary / Docker Content Trust 对比
在容器镜像签名领域,Notary(Docker Content Trust 的后端)和 Cosign 是两种主流方案。下表从多个维度进行对比,帮助您根据场景选择合适的技术。
| 对比维度 | Cosign (Sigstore) | Notary / Docker Content Trust |
|---|---|---|
| 密钥管理 | 无密钥(Keyless),基于 OIDC 临时证书,无需长期保管私钥 | 需要自行管理根密钥、目标密钥、快照密钥等,密钥轮换复杂 |
| 签名存储 | 签名存储在 OCI 仓库中(与镜像同仓库或独立仓库),支持 Tag 或 Referrers API | 签名存储在 Notary 服务端(TUF 仓库),需要额外部署 Notary 服务 |
| 透明日志 | 内置 Rekor 透明日志,所有签名公开可查,支持审计 | 无内置透明日志,审计依赖 Notary 服务端日志 |
| 验证复杂度 | 一条命令完成验证:cosign verify,自动拉取证书和签名 |
需要配置 Docker 客户端信任根,验证流程依赖 Docker Content Trust 环境 |
| 生态集成 | 原生支持 Kubernetes(Kyverno、Gatekeeper)、GitHub Actions、GitLab CI | 主要与 Docker 生态绑定,Kubernetes 集成需要额外工具(如 Portieris) |
| 性能与扩展性 | 轻量级,签名验证延迟低,适合大规模 CI/CD 流水线 | Notary 服务端可能成为瓶颈,大规模部署需要额外运维 |
| 社区与维护 | CNCF 孵化项目,社区活跃,更新频繁 | Docker Content Trust 已进入维护模式,Notary v2 仍在开发中 |
选型建议:
- 新项目推荐使用 Cosign: 无密钥签名降低了入门门槛,透明日志提供了更强的审计能力,且与云原生生态(Kubernetes、CI/CD)集成更自然。
- 遗留系统可继续使用 Notary: 如果已有 Docker Content Trust 基础设施且运行稳定,短期内无需强制迁移,但需关注 Notary v2 的进展。
- 混合场景: 可以在同一组织内同时使用两种方案,通过策略引擎根据镜像来源选择验证方式。
2.4 快速上手:安装与第一个签名
以下命令演示如何在 Linux/macOS 上安装 Cosign,并对一个 Nginx 镜像进行签名和验证。
# 安装 Cosign(Linux/macOS)
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign
# 验证安装
cosign version
# 使用 Keyless 模式对镜像签名(需要 OIDC 登录,如 GitHub)
cosign sign <your-registry>/nginx:latest
# 验证签名
cosign verify <your-registry>/nginx:latest
# 使用密钥对模式签名(生成密钥对)
cosign generate-key-pair
cosign sign --key cosign.key <your-registry>/nginx:latest
cosign verify --key cosign.pub <your-registry>/nginx:latest
注意: Keyless 模式需要当前环境支持 OIDC 登录(如 GitHub Actions、Google Cloud Shell)。在本地开发环境中,建议先使用密钥对模式体验完整流程。