2. Sigstore 核心组件:CTL、Rekor、Fulcio、Cosign 功能与架构

Sigstore 并非单一工具,而是一套由多个开源组件构成的软件供应链安全基础设施。其核心目标是通过自动化签名、透明日志记录和公钥基础设施(PKI),消除传统密钥管理中的痛点。本章将深入剖析四个核心组件:Certificate Transparency Log (CTL)、Rekor、Fulcio 和 Cosign,并阐明它们如何协同工作以构建可信的镜像供应链。

2.1 组件全景与协作流程

Sigstore 的架构遵循“签名-记录-验证”的闭环模型。开发者使用 Cosign 生成密钥对或通过 Fulcio 获取短期证书,对镜像进行签名;签名元数据被提交至 Rekor 透明日志;验证者通过查询 Rekor 和 CTL 来确认签名的有效性与来源。下图展示了四个组件之间的核心交互关系:

Sigstore 核心组件架构与交互流程 Sigstore 核心组件架构与交互流程 开发者 / CI Cosign Fulcio Rekor CTL 验证者 触发签名 请求证书 返回短期证书 提交签名条目 证书透明度 查询签名 验证证书 图例 开发者 签名工具 CA 服务 透明日志 证书日志 验证者
关键理解:Sigstore 的四个组件并非孤立运行。Fulcio 提供身份绑定,Cosign 执行签名操作,Rekor 保证签名不可篡改,CTL 确保证书颁发可审计。缺少任何一个环节,供应链的可信度都会下降。

2.2 Certificate Transparency Log (CTL) — 证书审计日志

CTL 是 Sigstore 中负责记录所有由 Fulcio 颁发的 X.509 证书的只追加日志。其设计灵感来源于 Google 的 Certificate Transparency (CT) 项目,旨在解决证书颁发机构(CA)的恶意或错误颁发问题。

2.2.1 核心功能

  • 证书透明度:强制公开所有已颁发的证书,任何人都可以审计证书的颁发记录。
  • 防篡改:基于 Merkle 树结构,一旦证书条目被追加,便无法被删除或修改。
  • 快速验证:支持通过 Merkle 树证明(Inclusion Proof)和一致性证明(Consistency Proof)来验证证书是否存在于日志中。

2.2.2 架构要点

特性 说明
数据结构 Merkle 树(哈希树),叶子节点存储证书的 SHA-256 哈希值。
操作模式 仅支持 Add(追加)和 Query(查询),不支持删除或更新。
监控机制 通过 CT Log Monitor 定期检查日志的一致性,防止日志分叉。
与 Fulcio 的关系 Fulcio 在颁发证书后,必须将证书提交到 CTL 并获得 Signed Certificate Timestamp (SCT),否则证书被视为不可信。
安全价值:CTL 使得任何未公开的“影子证书”或“后门证书”都无法通过验证。在 Sigstore 体系中,CTL 是 Fulcio 信任链的基石。

2.3 Rekor — 签名透明日志

Rekor 是 Sigstore 的元数据透明日志,用于存储所有与软件制品相关的签名记录、哈希值以及可选的附加元数据。它是整个 Sigstore 生态系统的“唯一事实来源”。

2.3.1 核心功能

  • 签名记录存储:接收并存储来自 Cosign 或其他工具的签名条目(Entry)。
  • 不可篡改:与 CTL 类似,Rekor 也使用 Merkle 树结构,确保历史记录无法被篡改。
  • 可搜索:支持通过制品哈希、公钥哈希、UUID 等方式检索签名记录。
  • 时间戳服务:为每个条目提供经过加密验证的时间戳,证明签名在某个时间点之前已经存在。

2.3.2 架构要点

特性 说明
数据结构 Merkle 树,叶子节点存储 Rekord 对象(包含签名、公钥、制品哈希等)。
API 接口 RESTful API:/api/v1/log/entries(提交)、/api/v1/log/entries/{uuid}(查询)。
存储后端 支持内存、文件系统、Trillian(分布式 Merkle 树)等多种后端。
验证方式 验证者通过 Rekor 的 Public Key 和 Signed Entry Timestamp (SET) 来验证条目真实性。
运维注意:Rekor 日志的完整性依赖于 Merkle 树的根哈希。如果 Rekor 服务被攻破或数据损坏,所有依赖该日志的验证都将失效。建议在生产环境中启用 Trillian 后端以实现高可用和一致性。

2.4 Fulcio — 无密钥签名证书颁发机构

Fulcio 是一个专为 Sigstore 设计的轻量级证书颁发机构(CA)。它解决了传统签名中“密钥管理难”的核心问题,通过颁发短期证书实现“无密钥签名”体验。

2.4.1 核心功能

  • 身份绑定:将用户的 OIDC(OpenID Connect)身份(如电子邮件、GitHub 账号)绑定到一次性签名密钥上。
  • 短期证书:颁发的证书有效期通常为 10 分钟,过期后自动失效,降低了密钥泄露的风险。
  • 自动集成:与 Cosign 深度集成,开发者无需手动管理私钥或证书请求。

2.4.2 架构要点

特性 说明
证书类型 X.509 v3 证书,包含 OIDC 身份扩展字段。
颁发流程 用户通过 OIDC 提供者(如 Google、GitHub、Microsoft)认证 → Fulcio 验证身份 → 生成密钥对 → 颁发证书并提交至 CTL。
信任根 Fulcio 自身的根证书(Root CA),该根证书被 Sigstore 公共信任列表所包含。
安全约束 证书中嵌入的 OIDC 令牌必须包含 email_verified 声明,防止身份伪造。
用户体验:使用 Fulcio 时,开发者只需执行 cosign sign 命令,系统会自动完成 OIDC 登录、证书获取和签名操作。整个过程无需手动导出或备份任何私钥。

2.5 Cosign — 容器镜像签名与验证工具

Cosign 是 Sigstore 生态中的客户端工具,也是开发者最常直接交互的组件。它负责执行实际的签名、验证和存储操作。

2.5.1 核心功能

  • 镜像签名:支持对容器镜像、Blob 文件、文本文件等多种制品进行签名。
  • 密钥管理:支持多种签名方式:密钥对(本地生成)、无密钥模式(通过 Fulcio 获取短期证书)、密钥引用(KMS、硬件密钥)。
  • 签名存储:签名默认存储在镜像仓库的 OCI 镜像索引 或 Tag 中,也可单独上传至 Rekor。
  • 策略验证:支持基于 Keyless、Key 或 Policy Controller 的验证策略。

2.5.2 架构要点

特性 说明
签名格式 使用 DSSE (Dead Simple Signing Envelope) 格式封装签名负载。
存储位置 默认存储在 cosign.sig 或 cosign.att 等 OCI 制品中。
验证流程 从镜像仓库获取签名 → 从 Rekor 获取签名记录 → 从 Fulcio/CTL 验证证书 → 比对公钥或身份。
扩展性 支持通过 Cosign Webhook 或 Policy Controller 集成到 Kubernetes 准入控制中。

2.5.3 常用命令示例

# 使用无密钥模式签名镜像(自动通过 Fulcio 获取证书)
cosign sign <registry>/<image>:<tag>

# 使用本地密钥对签名
cosign sign --key cosign.key <registry>/<image>:<tag>

# 验证镜像签名(自动查询 Rekor 和 CTL)
cosign verify <registry>/<image>:<tag>

# 验证并指定身份
cosign verify --cert-identity <email> <registry>/<image>:<tag>
最佳实践:在 CI/CD 流水线中,优先使用 Keyless 模式。它消除了密钥轮换和备份的运维负担,同时通过 Fulcio 和 CTL 提供了更强的身份审计能力。

2.6 组件对比总结

下表从功能定位、数据存储、信任模型和运维复杂度四个维度,对四个核心组件进行横向对比:

组件 功能定位 数据存储 信任模型 运维复杂度
CTL 证书审计日志 证书哈希 Merkle 树 + 根证书 中(需监控日志一致性)
Rekor 签名元数据日志 签名条目 Merkle 树 + 公钥 高(需保证高可用与数据持久化)
Fulcio 证书颁发机构 无(仅颁发) OIDC + 根证书 低(可托管)
Cosign 客户端签名/验证 无(仅操作) 密钥 / 证书 低(CLI 工具)