Sigstore 核心组件:Fulcio、Rekor、Cosign 的架构与职责

Sigstore 并非单一工具,而是一套由三个核心组件构成的开放签名基础设施。理解 Fulcio、Rekor 和 Cosign 各自的职责与协作方式,是掌握镜像签名验证流程的关键。这三个组件分别承担了证书颁发、透明日志记录和签名操作的角色,共同实现了无需管理私钥的软件供应链安全。

组件职责总览

组件 全称 核心职责 关键输出
Fulcio 证书颁发机构 基于 OIDC 身份签发短期证书 X.509 签名证书(有效期通常为 10 分钟)
Rekor 透明日志 不可篡改地记录签名元数据 日志条目索引、签名时间戳(Signed Entry Timestamp)
Cosign 签名与验证工具 执行签名、验证、存储操作 镜像签名、验证结果、策略断言

Fulcio:基于 OIDC 的证书颁发机构

Fulcio 是 Sigstore 的证书颁发机构(CA),它解决了传统 PKI 中私钥管理的痛点。开发者无需生成和保管长期私钥,而是通过 OIDC(OpenID Connect)身份提供商(如 GitHub、Google、Microsoft)进行身份认证,Fulcio 据此签发短期有效的 X.509 证书。

  • 身份绑定:Fulcio 验证 OIDC 中的身份信息(如邮箱、用户名),并将其嵌入证书的 Subject Alternative Name(SAN)字段。
  • 短期证书:默认证书有效期仅为 10 分钟,极大降低了私钥泄露的风险窗口。
  • 无状态设计:Fulcio 不存储证书状态,依赖 Rekor 日志提供证书存在的公开证明。
架构要点:Fulcio 的证书签发流程完全在线,每次签名操作都会触发一次 OIDC 认证和证书签发。这意味着在冷启动场景下,Fulcio 的可用性和响应延迟直接影响签名流程的启动时间。

Rekor:不可篡改的透明日志

Rekor 是 Sigstore 的透明日志系统,它充当了签名事件的公开账本。每次签名操作产生的元数据(包括证书、签名、镜像摘要等)都会被提交到 Rekor 日志中,形成一条可审计、可验证的记录。

  • 日志结构:基于 Merkle Tree 实现,支持高效的一致性证明和包含性证明。
  • 签名时间戳(SET):Rekor 为每个日志条目签发 Signed Entry Timestamp,证明该条目在特定时间点已被记录。
  • 公开可查:任何人都可以查询 Rekor 日志,验证某个签名是否在特定时间存在。
冷启动关联:在镜像签名验证的冷启动阶段,验证方需要查询 Rekor 日志来获取签名元数据。Rekor 的查询延迟和日志同步状态,是影响验证冷启动性能的关键因素之一。

Cosign:签名与验证的操作枢纽

Cosign 是 Sigstore 的命令行工具和库,它封装了与 Fulcio、Rekor 的交互逻辑,为开发者提供了简洁的签名、验证和存储接口。Cosign 是整个 Sigstore 生态中用户直接接触的组件。

  • 签名操作:自动触发 OIDC 认证、向 Fulcio 请求证书、对镜像进行签名、将签名元数据提交到 Rekor。
  • 验证操作:从镜像仓库获取签名、查询 Rekor 日志验证签名时间戳、验证证书链。
  • 密钥管理:支持密钥对模式(传统方式)和密钥less 模式(通过 Fulcio 签发短期证书)。
  • 策略引擎:支持基于 CUE 或 Rego 的验证策略,实现细粒度的准入控制。

三组件协作流程

下图展示了 Sigstore 三个核心组件在镜像签名与验证过程中的协作关系:

Sigstore 核心组件协作架构图 Sigstore 核心组件协作架构 开发者 / CI 系统 Cosign Fulcio (CA) Rekor (透明日志) OIDC Provider 镜像仓库 调用签名/验证 请求证书 验证身份 返回证书 提交签名元数据 存储签名 协作流程说明 1. 开发者通过 Cosign 发起签名 2. Cosign 向 Fulcio 请求证书 3. Fulcio 验证 OIDC 身份后签发证书 4. Cosign 签名并提交元数据到 Rekor 5. Cosign 将签名存储到镜像仓库

组件职责对比

下表从多个维度对比三个核心组件的职责差异,帮助理解它们在签名生命周期中的角色定位:

对比维度 Fulcio Rekor Cosign
生命周期 签名前(证书签发) 签名后(日志记录) 签名中(操作执行)
状态管理 无状态 有状态(Merkle Tree) 无状态(工具层)
安全假设 信任 OIDC Provider 信任日志的不可篡改性 信任本地操作环境
冷启动影响 证书签发延迟 日志查询延迟 工具初始化延迟
扩展性 水平扩展(无状态) 分片扩展(日志分片) 客户端扩展(CLI/SDK)

冷启动视角下的组件依赖

在镜像安全冷启动削峰场景中,三个组件的依赖关系直接影响启动延迟:

  1. 签名冷启动:Cosign 启动后,首先需要与 Fulcio 通信完成 OIDC 认证和证书签发,然后才能执行签名操作。Fulcio 的响应延迟是签名冷启动的主要瓶颈。
  2. 验证冷启动:验证方需要从镜像仓库获取签名,然后查询 Rekor 日志验证签名时间戳。Rekor 的查询延迟和日志同步状态是验证冷启动的关键因素。
  3. 缓存策略:在削峰设计中,可以考虑缓存 Fulcio 签发的短期证书(在有效期内复用)和 Rekor 的查询结果,以减少重复的网络开销。
注意:Fulcio 签发的证书有效期极短(10 分钟),缓存策略需要精确控制过期时间。Rekor 日志的查询结果(SET)可以缓存更长时间,因为日志条目一旦写入就不可更改。

组件部署模式

Sigstore 支持多种部署模式,以适应不同的安全需求和网络环境:

  • 公共实例:由 Sigstore 社区维护的公共 Fulcio 和 Rekor 实例,适合开源项目和快速原型开发。
  • 私有部署:企业可以在内部部署私有 Fulcio 和 Rekor 实例,实现完全的控制权和数据隔离。
  • 离线模式:在无法访问公共实例的环境中,可以使用 Cosign 的密钥对模式,绕过 Fulcio 和 Rekor 的依赖。