Cosign镜像安全容量阈值建模与自动巡检 - 第2节

2.1 Cosign 项目背景

Cosign 是由 Chainguard 公司于 2021 年发起、后捐赠给 CNCF Sigstore 项目的开源容器镜像签名工具。它的诞生源于云原生生态中一个长期存在的安全缺口:容器镜像在构建完成后,从仓库拉取到部署运行之间,缺乏轻量级、可验证的完整性校验机制。

传统方案(如 GPG 签名)存在密钥管理复杂、与 CI/CD 集成困难、缺乏透明审计等痛点。Cosign 的设计目标正是解决这些问题,它利用 Sigstore 生态的 无密钥(Keyless)签名 模式,大幅降低了签名门槛,使开发者无需管理长期密钥即可对镜像进行签名和验证。

核心痛点对比: 传统 GPG 签名需要生成、分发、轮换密钥对,且签名存储在外部,验证时需手动导入公钥;Cosign 通过 OCI 仓库原生存储签名,并支持 OIDC 身份绑定,将签名操作简化为一条命令。

2.2 核心功能:签名、验证、存储

Cosign 围绕三个核心操作构建其功能体系,下表总结了每个功能的关键特性:

功能 操作命令 核心能力 典型场景
签名 cosign sign 支持密钥对签名、Keyless 签名(OIDC 身份绑定)、Blob 签名 CI/CD 流水线中构建完成后自动签名
验证 cosign verify 验证签名完整性、检查签名者身份、支持自定义策略(CUE/Rego) Kubernetes 准入控制器(如 Kyverno)在部署前验证镜像
存储 OCI 仓库原生存储 签名以 OCI 制品形式存储在镜像仓库中,与镜像同生命周期 无需额外签名存储服务,利用现有镜像仓库管理签名

2.2.1 签名(Sign)

Cosign 支持两种签名模式:

  • 密钥对签名: 使用 cosign generate-key-pair 生成公私钥,私钥本地保管,公钥可公开用于验证。适用于组织内部有成熟密钥管理体系的场景。
  • Keyless 签名: 利用 Sigstore 的 Fulcio 证书颁发机构,通过 OIDC 协议(如 GitHub、Google、Microsoft 身份)获取短期证书进行签名。签名后证书被记录到 Rekor 透明日志中,实现可审计的签名链。这是 Cosign 最具创新性的能力。
# 密钥对签名示例
cosign sign --key cosign.key myregistry.io/myimage:v1

# Keyless 签名示例(无需本地密钥)
cosign sign myregistry.io/myimage:v1

2.2.2 验证(Verify)

验证操作确保镜像的签名未被篡改,并确认签名者的身份。Cosign 支持多种验证策略:

  • 公钥验证: 使用签名者的公钥验证镜像签名。
  • Keyless 验证: 验证签名证书是否由可信的 Fulcio 实例签发,并检查证书中的 OIDC 身份信息。
  • 策略验证: 结合 CUE 或 Rego 策略语言,定义更细粒度的验证规则(如仅允许特定邮箱域名的签名者)。
# 公钥验证
cosign verify --key cosign.pub myregistry.io/myimage:v1

# Keyless 验证
cosign verify myregistry.io/myimage:v1

2.2.3 存储(Storage)

Cosign 将签名作为 OCI 制品(即容器镜像的一种扩展形式)存储在同一个镜像仓库中。签名与镜像通过 镜像摘要(Digest) 绑定,形成不可篡改的关联。这种设计带来了几个关键优势:

  • 原子性: 签名与镜像共存亡,删除镜像时签名也随之删除,避免孤立签名带来的管理负担。
  • 可移植性: 签名随镜像仓库复制、迁移,无需额外同步签名数据。
  • 兼容性: 任何支持 OCI 规范的镜像仓库(如 Harbor、Docker Hub、AWS ECR)均可直接存储 Cosign 签名。
实践建议: 在配置镜像仓库时,确保仓库支持 OCI 制品存储(大多数现代仓库已默认支持)。如果使用 Harbor,建议开启“不可变标签”功能,防止签名被意外覆盖。

2.3 Cosign 与 Sigstore 生态的关系

Cosign 是 Sigstore 生态的核心组件之一,但并非全部。Sigstore 是一个由 Linux 基金会托管的开源项目,旨在为软件供应链提供一套完整的签名、验证和透明审计工具链。下图展示了 Cosign 在 Sigstore 生态中的位置及其与其他组件的关系:

Sigstore 生态架构与 Cosign 角色 Sigstore 生态 Cosign 镜像签名与验证 Fulcio 短期证书颁发机构 Rekor 透明日志与审计 OIDC 身份认证 证书签发与验证 签名记录与查询 请求证书 记录签名 Keyless 签名流程(Cosign + Fulcio + Rekor) 1. Cosign 通过 OIDC 获取用户身份 → 2. 向 Fulcio 请求短期签名证书 3. 使用证书对镜像签名 → 4. 将签名和证书记录到 Rekor 透明日志

从上图可以看出,Cosign 并非孤立工作,它与 Sigstore 生态中的其他组件紧密协作:

  • Fulcio: 提供基于 OIDC 的短期证书颁发服务。Cosign 在 Keyless 模式下向 Fulcio 请求证书,证书中嵌入了签名者的身份信息(如邮箱地址)。
  • Rekor: 提供不可篡改的透明日志。Cosign 将每次签名操作记录到 Rekor 中,任何人都可以查询日志来审计签名历史,确保签名操作的公开透明。
  • 其他生态工具: Sigstore 还包含 gitsign(Git 提交签名)、policy-controller(Kubernetes 策略控制器)等工具,它们与 Cosign 共享相同的信任根和验证机制。
关键理解: Cosign 的 Keyless 签名模式之所以可信,是因为它依赖 Fulcio 的证书链和 Rekor 的透明日志,而非传统的长期密钥。这意味着即使签名者的本地环境被攻破,攻击者也无法伪造历史签名,因为 Rekor 日志提供了不可否认的证据。

2.4 本章小结