2. Sigstore 核心概念:组件、软件供应链安全与签名验证
Sigstore 是一套用于对软件制品进行签名、验证和透明性审计的开源标准。它通过三个核心组件(Cosign、Rekor、Fulcio)解决了传统 PGP 签名在密钥管理、分发和撤销上的痛点,使容器镜像、二进制文件等制品的签名验证能够以无密钥(keyless)或短生命周期密钥的方式集成到 CI/CD 流水线中。
2.1 Sigstore 三大组件
| 组件 | 角色 | 核心能力 | 运维关注点 |
|---|---|---|---|
| Cosign | 签名与验证客户端 | 对容器镜像、blob、附件进行签名、验证和存储签名 | 签名策略配置、OCI 仓库权限、keyless 模式下的 OIDC 集成 |
| Rekor | 透明性日志 | 记录签名元数据到不可篡改的 Merkle 树,提供审计溯源 | 日志存储、检索 API、与内部审计系统的对接 |
| Fulcio | 证书颁发机构(CA) | 基于 OIDC 身份签发短期 X.509 证书,绑定身份与公钥 | OIDC 信任锚配置、证书有效期、吊销检查 |
关键区别:传统 PGP 签名依赖长期私钥,密钥泄露后难以撤销;Sigstore 通过 Fulcio 签发短生命周期证书(通常 10 分钟),结合 Rekor 透明日志,使签名验证不再依赖“信任 Web”,而是依赖“身份 + 日志”。
2.2 软件供应链安全与签名验证流程
Sigstore 的签名验证流程围绕“身份绑定”和“透明性审计”展开,典型流程如下:
- 身份认证:开发者通过 OIDC 提供者(如 GitHub、Google、GitLab)获取身份令牌。
- 证书签发:Fulcio 验证 OIDC 令牌后,签发短期 X.509 证书,证书中包含开发者身份信息(如 email)。
- 签名生成:Cosign 使用该证书对应的临时密钥对容器镜像摘要进行签名,生成签名载荷。
- 日志记录:签名载荷被提交到 Rekor 透明日志,获得唯一的 Merkle 树证据(UUID)。
- 签名存储:签名和证书被存储在 OCI 仓库的附件中(如
sha256-xxx.sig)。 - 验证阶段:验证者使用 Cosign 验证签名,Cosign 自动从 Rekor 查询日志条目,并检查证书是否由可信 Fulcio 签发、身份是否匹配策略。
2.3 Cosign 签名与验证命令示例
以下命令展示了使用 Cosign 对容器镜像进行签名和验证的典型操作:
# 使用 keyless 模式对镜像签名(自动触发 OIDC 流程)
cosign sign --keyless <registry>/<image>:<tag>
# 使用本地密钥对签名
cosign sign --key cosign.key <registry>/<image>:<tag>
# 验证签名(keyless 模式自动查询 Rekor)
cosign verify --keyless <registry>/<image>:<tag>
# 验证签名并检查身份策略
cosign verify --keyless --cert-identity "developer@example.com" \
--cert-oidc-issuer "https://accounts.google.com" \
<registry>/<image>:<tag>
运维提示:在容器网络运维准入策略中,建议在验证阶段强制指定
--cert-identity 和 --cert-oidc-issuer,防止攻击者使用任意 OIDC 身份签名恶意镜像。
2.4 组件协作关系图
下图展示了 Sigstore 组件在容器网络运维场景下的协作关系,重点关注准入控制器如何与 Cosign、Rekor 和 Fulcio 交互:
2.5 软件供应链安全的关键保障
- 不可抵赖性:签名绑定到 OIDC 身份,Rekor 日志提供永久审计证据,开发者无法否认签名行为。
- 无密钥风险:短期证书 + 透明日志消除了长期密钥泄露、丢失或轮换的运维负担。
- 策略可编程:验证阶段可指定身份、签发者、证书策略,与 OPA/Kyverno 等策略引擎集成,实现细粒度准入控制。
- 透明性审计:所有签名事件记录在 Rekor 中,安全团队可随时查询、回溯、分析异常签名行为。
风险提示:如果 Rekor 日志不可用或 Fulcio 证书链被篡改,签名验证将失败。在容器网络运维中,建议部署内部 Rekor 实例或配置可信的公共 Rekor 端点,并定期验证 Fulcio 根证书的完整性。