2. Sigstore 核心组件:Cosign、Fulcio、Rekor、Gitsign 的功能与架构
Sigstore 并非单一工具,而是一套由多个开源组件构成的软件供应链安全基础设施。其核心设计理念是去中心化、透明、免密钥管理,通过四个主要组件——Cosign、Fulcio、Rekor 和 Gitsign——协同工作,实现容器镜像、二进制文件、Git 提交等制品的签名、验证与审计。
下图展示了 Sigstore 各组件的协作关系与数据流:
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 的验证能力是核心入口。