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

Sigstore 并非单一工具,而是一套由多个开源组件构成的软件供应链安全基础设施。其核心设计理念是去中心化、透明、免密钥管理,通过四个主要组件——Cosign、Fulcio、Rekor 和 Gitsign——协同工作,实现容器镜像、二进制文件、Git 提交等制品的签名、验证与审计。

下图展示了 Sigstore 各组件的协作关系与数据流:

Sigstore 核心组件架构与数据流 Sigstore 核心组件架构与数据流 用户 / 开发者 Cosign 签名 & 验证 CLI Fulcio 证书颁发机构 (CA) Rekor 透明日志 & 时间戳 Gitsign Git 提交签名 OIDC 身份提供商 cosign sign/verify 请求证书 git commit -S 获取证书 上传签名记录 验证身份 记录签名 说明:用户通过 Cosign 或 Gitsign 发起操作,Fulcio 签发短期证书,Rekor 提供不可篡改的审计日志

2.1 Cosign:签名与验证的 CLI 工具

Cosign 是 Sigstore 生态中最核心的命令行工具,负责容器镜像、Blob 文件、SBOM 等制品的签名、验证和存储。它消除了传统 PGP 密钥管理的复杂性,支持多种签名模式。

核心功能

  • 镜像签名:对 OCI 容器镜像进行签名,支持密钥对、密钥托管(KMS)和密钥less 模式。
  • 镜像验证:验证签名是否有效,并检查签名是否已记录在 Rekor 透明日志中。
  • 附件签名:支持对 SBOM、in-toto 布局等附件进行签名。
  • 密钥管理:支持本地密钥对、云 KMS(AWS KMS、GCP KMS、Azure Key Vault)以及硬件安全模块。
  • OCI 仓库集成:签名作为 OCI 制品存储在镜像仓库中,与镜像生命周期一致。

架构要点

特性 说明
签名模式 密钥对模式、密钥less 模式(通过 Fulcio 获取短期证书)
存储位置 OCI 仓库(与镜像同仓库)或本地文件系统
验证策略 支持自定义策略(CUE、Rego)、多签名验证、时间戳验证
身份绑定 通过 OIDC 令牌将签名者身份绑定到证书中

实战要点:Cosign 的 cosign verify 命令默认会检查 Rekor 日志,确保签名已被记录。如果 Rekor 不可用,可使用 --insecure-ignore-tlog 跳过,但生产环境不建议这样做。

2.2 Fulcio:无密钥签名的证书颁发机构

Fulcio 是 Sigstore 的证书颁发机构(CA),实现了无密钥签名(Keyless Signing)的核心能力。它根据用户的 OIDC 身份签发短期 X.509 证书,证书有效期通常为 10 分钟,大幅降低了密钥泄露风险。

核心功能

  • OIDC 身份验证:接受来自 GitHub、GitLab、Google、Microsoft 等 OIDC 提供商的身份令牌。
  • 短期证书签发:为每个签名操作签发一次性证书,证书中包含用户的身份信息。
  • 证书链验证:Fulcio 的根证书公开可查,验证者可以追溯证书链。
  • 审计追踪:所有签发的证书信息被记录到 Rekor 日志中。

架构要点

特性 说明
证书类型 X.509 v3 短期证书(有效期 10 分钟)
身份绑定 证书 Subject 字段包含 OIDC 身份信息(如 email)
根证书 公开托管在 Sigstore 官方仓库,支持离线验证
部署方式 Sigstore 公共实例(fulcio.sigstore.dev)或自托管

为什么需要 Fulcio?传统签名需要长期管理私钥,一旦泄露后果严重。Fulcio 的短期证书模式让签名操作与身份绑定,私钥只在内存中存在几秒钟,极大提升了安全性。

2.3 Rekor:不可篡改的透明日志

Rekor 是 Sigstore 的透明日志系统,为所有签名操作提供不可篡改的审计记录。它基于 Merkle 树 数据结构,确保一旦记录写入,就无法被删除或修改。

核心功能

  • 签名记录存储:存储签名元数据、证书信息、签名者身份、时间戳等。
  • Merkle 树验证:提供树头(Tree Head)和包含证明(Inclusion Proof),验证记录是否被篡改。
  • 搜索与查询:支持按哈希值、公钥、email 等字段搜索签名记录。
  • 时间戳服务:为记录提供可信时间戳,支持长期验证。

架构要点

特性 说明
数据结构 Merkle 树(类似 Certificate Transparency)
存储格式 Rekord(标准签名记录)、HashedRekord(哈希记录)等
API 接口 RESTful API,支持上传、查询、验证
公共实例 rekor.sigstore.dev(公共透明日志)

注意:Rekor 日志是公开可读的,任何签名记录都会暴露签名者的身份信息(如 email)。如果对隐私有要求,可以考虑使用自托管 Rekor 实例或使用匿名身份。

2.4 Gitsign:Git 提交的密钥less 签名

Gitsign 是 Sigstore 生态中专为 Git 提交签名 设计的工具。它替代了传统的 GPG 签名,使用 Fulcio 签发的短期证书对 Git 提交进行签名,并将签名记录写入 Rekor 日志。

核心功能

  • Git 提交签名:使用 git commit -S 命令,自动通过 Fulcio 获取证书并签名。
  • Git 标签签名:支持对 Git 标签进行签名。
  • 身份验证:通过 OIDC 身份(如 GitHub 账号)绑定提交者身份。
  • 验证集成:与 GitHub、GitLab 等平台集成,在 UI 中显示已验证的签名。

架构要点

特性 说明
签名方式 密钥less 模式,无需本地 GPG 密钥
证书来源 Fulcio CA,基于 OIDC 身份签发
日志记录 签名记录自动上传到 Rekor 透明日志
配置方式 Git 配置 gpg.format = x509 和 gpg.x509.program = gitsign

实战配置示例:

# 配置 Gitsign 作为 Git 签名工具
git config --global gpg.format x509
git config --global gpg.x509.program gitsign
git config --global commit.gpgsign true

# 使用 Gitsign 签名提交
git commit -S -m "feat: add new feature"

2.5 组件对比与选型建议

组件 主要用途 签名对象 依赖组件 适用场景
Cosign 容器镜像、Blob 签名 OCI 镜像、文件、SBOM Fulcio(密钥less 模式)、Rekor CI/CD 流水线、镜像仓库准入
Fulcio 短期证书签发 X.509 证书 OIDC 提供商 所有密钥less 签名场景
Rekor 透明日志审计 签名记录 无 所有需要审计追踪的场景
Gitsign Git 提交签名 Git 提交、标签 Fulcio、Rekor 代码仓库安全、开发者身份验证

选型建议:如果主要关注容器镜像安全,优先掌握 Cosign + Fulcio + Rekor 的组合;如果关注代码提交完整性,Gitsign 是 GPG 的现代替代方案。在准入控制场景中,Cosign 的验证能力是核心入口。