2. Sigstore 核心组件:Fulcio、Rekor、Cosign、Gitsign 与 Policy Controller 概览
Sigstore 并非单一工具,而是一套由多个开源组件构成的 签名与验证生态。每个组件承担独立职责,通过标准化的接口协同工作,共同实现“无密钥签名、透明日志审计、策略化验证”的云原生安全基线。本章将逐一拆解五大核心组件:Fulcio(证书颁发)、Rekor(透明日志)、Cosign(签名与验证)、Gitsign(Git 提交签名)以及 Policy Controller(策略执行)。
2.1 组件全景与职责分工
下表从功能定位、输入输出、信任锚点三个维度对比五大组件,帮助建立全局认知:
| 组件 | 核心职责 | 输入 | 输出 | 信任锚点 |
|---|---|---|---|---|
| Fulcio | 短期代码签名证书颁发 | OIDC 身份令牌 | X.509 证书(有效期通常 10 分钟) | OIDC 提供商(GitHub、Google、Microsoft 等) |
| Rekor | 不可篡改的签名元数据日志 | 签名载荷、证书、工件摘要 | 透明日志条目(含 Merkle 证明) | 日志的 Merkle 树根哈希(公开可审计) |
| Cosign | 容器镜像/工件的签名与验证 | 镜像引用、私钥/证书、OIDC 令牌 | 签名(存储在 OCI 仓库或本地) | Fulcio 证书链 / 公钥 |
| Gitsign | Git 提交的密钥签名 | Git 提交对象、OIDC 令牌 | 签名后的 Git 提交(含 Rekor 引用) | Fulcio 证书 + Rekor 日志 |
| Policy Controller | Kubernetes 集群内的签名验证策略 | 镜像签名、策略定义(CUE/Rego) | 准入控制决策(允许/拒绝) | 信任根(Fulcio 根证书 / 公钥列表) |
2.2 Fulcio:无密钥证书颁发机构
Fulcio 是 Sigstore 的 短期证书颁发机构(CA),它彻底改变了传统软件签名的密钥管理方式。开发者无需生成、保管或轮换长期私钥,而是通过 OIDC(OpenID Connect) 身份提供商(如 GitHub、Google、Microsoft)进行身份认证,Fulcio 在认证通过后即时签发一张 有效期极短(通常 10 分钟) 的 X.509 证书。
- 工作流程:
- 开发者使用
cosign sign或gitsign触发签名操作。 - 工具自动向 OIDC 提供商发起认证,获取身份令牌。
- 工具将身份令牌发送给 Fulcio 服务。
- Fulcio 验证令牌有效性,提取身份信息(如 email、用户名),生成证书签名请求(CSR)。
- Fulcio 使用其根 CA 私钥签发证书,返回给客户端。
- 客户端使用证书对应的临时私钥对工件进行签名,签名完成后证书和私钥均可丢弃。
- 开发者使用
- 关键特性:
- 无密钥管理: 私钥仅在内存中短暂存在,不落盘、不备份。
- 身份绑定: 证书的 Subject 字段直接绑定 OIDC 身份(如
email:user@example.com),签名者身份可追溯。 - 证书透明度: Fulcio 签发的证书可被 Rekor 记录,形成完整的审计链。
2.3 Rekor:透明日志与审计溯源
Rekor 是 Sigstore 的 透明日志系统,它提供了一个 不可篡改、可公开审计 的账本,用于记录所有签名相关的元数据。任何签名操作产生的证书、签名载荷、工件哈希都会被提交到 Rekor 日志中,并返回一个唯一的 日志条目索引 和 Merkle 证明。
- 核心功能:
- 签名存证: 将签名事件永久记录在日志中,任何人都可以查询。
- 时间戳服务: 通过日志的 Merkle 树结构,可以证明某个签名在某个时间点之前已经存在(存在性证明)。
- 审计追踪: 验证者可以通过 Rekor 查询签名者的身份、签名时间、工件摘要,形成完整的证据链。
- 日志结构: Rekor 使用 Merkle 树 组织日志条目,每个新条目被追加到树中,并更新根哈希。任何人都可以下载整个日志或部分日志,通过 Merkle 证明验证某个条目是否确实存在于日志中。
- 公开实例: Sigstore 社区维护了一个公共的 Rekor 实例(
rekor.sigstore.dev),所有使用默认配置的签名操作都会将记录发送至此。组织也可以部署私有的 Rekor 实例。
2.4 Cosign:容器签名与验证工具
Cosign 是 Sigstore 生态中使用最广泛的 命令行工具,专门用于 容器镜像 及其他 OCI 工件的签名、验证和存储。它深度集成了 Fulcio 和 Rekor,使得“开箱即用”的无密钥签名成为可能。
- 核心命令:
cosign sign:对镜像进行签名。支持密钥模式和无密钥模式(通过 Fulcio + Rekor)。cosign verify:验证镜像签名。支持多种验证策略(如检查证书身份、检查 Rekor 条目)。cosign attach:将签名、SBOM(软件物料清单)等附件附加到镜像仓库中。cosign triangulate:查找与镜像关联的签名或附件。
- 签名存储: Cosign 将签名作为 OCI 制品 存储在容器镜像仓库中,与镜像本身共存。这使得签名管理简单,无需额外的存储后端。
- 验证流程:
- 从镜像仓库拉取签名和镜像。
- 从签名中提取证书或公钥。
- 验证证书链(信任 Fulcio 根证书)。
- (可选)查询 Rekor 日志,验证签名是否被记录且未被篡改。
- 验证签名是否匹配镜像摘要。
# 无密钥签名示例(默认使用 Fulcio + Rekor)
cosign sign ghcr.io/myorg/myapp:v1
# 验证签名(自动查询 Rekor 并验证证书身份)
cosign verify ghcr.io/myorg/myapp:v1 \
--certificate-identity-regexp '.*@myorg\.com$' \
--certificate-oidc-issuer-regexp 'https://github\.com/login/oauth'
2.5 Gitsign:Git 提交的密钥签名
Gitsign 将 Sigstore 的无密钥签名能力引入 Git 提交 验证。它替代了传统的 GPG 或 SSH 签名方式,开发者无需管理任何密钥,即可对 Git 提交进行签名,并将签名记录到 Rekor 日志中。
- 工作方式:
- 配置 Git 使用 Gitsign 作为签名后端:
git config --global gpg.format x509和git config --global gpg.x509.program gitsign。 - 执行
git commit -S时,Gitsign 自动触发 OIDC 认证。 - 从 Fulcio 获取短期证书,对提交对象进行签名。
- 将签名和证书信息提交到 Rekor 日志。
- 在提交信息中嵌入 Rekor 条目索引,方便后续验证。
- 配置 Git 使用 Gitsign 作为签名后端:
- 验证方式: 使用
git verify-commit或gitsign verify命令,Gitsign 会自动从 Rekor 拉取证书和日志证明,验证提交的完整性和签名者身份。 - 优势:
- 消除了 GPG 密钥的生成、上传、轮换等繁琐操作。
- 签名者身份直接绑定 OIDC 账户,审计更直观。
- 所有签名记录集中存储在 Rekor 中,便于组织级审计。
gitsign verify --certificate-identity <expected-email> 来验证所有合并请求(PR)的提交是否来自受信开发者,防止恶意提交进入主分支。
2.6 Policy Controller:集群内策略执行
Policy Controller 是 Sigstore 生态中的 Kubernetes 准入控制器,它允许集群管理员定义 签名验证策略,在 Pod 创建或更新时自动验证镜像签名,拒绝未签名或签名无效的镜像运行。
- 架构位置: Policy Controller 作为 动态准入 Webhook 部署在 Kubernetes 集群中,拦截 Pod 创建请求。
- 策略定义: 使用 CUE 语言 或 Rego 语言 编写策略,支持以下验证维度:
- 签名者身份: 只允许特定 OIDC 身份(如
user@myorg.com)签名的镜像。 - 证书颁发者: 只信任来自特定 Fulcio 实例的证书。
- 透明日志: 要求签名必须在 Rekor 日志中有记录。
- 密钥策略: 支持公钥白名单模式。
- 签名者身份: 只允许特定 OIDC 身份(如
- 工作流程:
- 用户执行
kubectl apply -f pod.yaml。 - API Server 将请求发送给 Policy Controller Webhook。
- Policy Controller 解析 Pod 中的镜像引用。
- 调用 Cosign 库验证镜像签名(包括查询 Rekor 和验证证书)。
- 根据策略规则做出决策:允许(Allow)或拒绝(Deny)。
- 用户执行
# 示例策略(CUE):只允许由 myorg.com 邮箱签名的镜像
package sigstore
import (
"github.com/sigstore/policy-controller/pkg/apis/policy/v1beta1"
)
#ImagePattern: "ghcr.io/myorg/*"
#ValidIdentity: v1beta1.IdentitySpec{
Issuer: "https://github.com/login/oauth",
Subject: ".*@myorg\\.com$",
}
#ValidSignature: v1beta1.SignatureVerification{
Identities: [#ValidIdentity],
}
2.7 组件协作关系图
下图展示了 Sigstore 核心组件在“签名-记录-验证”全生命周期中的协作关系:
2.8 组件选择与部署建议
在实际落地 Sigstore 时,并非所有组件都必须部署。下表根据不同的使用场景给出推荐组合:
| 场景 | 必需组件 | 可选组件 | 说明 |
|---|---|---|---|
| 容器镜像签名与验证 | Cosign + Rekor(公共实例) | Fulcio(公共实例)、Policy Controller | 使用公共 Sigstore 实例即可快速启动,无需自建服务 |
| Git 提交签名审计 | Gitsign + Rekor(公共实例) | Fulcio(公共实例) | Gitsign 自动使用公共 Fulcio 和 Rekor |
| 企业级离线/私有部署 | Fulcio + Rekor + Cosign | Policy Controller、Gitsign | 需要自建 Fulcio 和 Rekor 实例,管理根证书和日志 |
| Kubernetes 集群强制策略 | Policy Controller + Cosign | Fulcio、Rekor(依赖公共实例) | Policy Controller 内部调用 Cosign 库进行验证 |