4. 镜像签名与验证基础:软件供应链安全、Sigstore 与 Cosign 简介、签名与验证的工作流程
在云原生环境中,镜像不仅是应用的交付物,更是整个软件供应链的核心载体。攻击者可能通过篡改镜像、注入恶意代码或利用中间人攻击来破坏供应链。本章将建立镜像签名与验证的理论基础,涵盖软件供应链安全威胁模型、Sigstore 生态与 Cosign 工具,以及签名/验证的核心工作流程。
4.1 软件供应链安全威胁模型
软件供应链攻击的目标是破坏从代码提交到生产部署的任意环节。针对容器镜像,主要威胁包括:
- 镜像篡改:攻击者在镜像推送或拉取过程中修改层数据或元数据。
- 注册表劫持:攻击者控制镜像仓库,替换合法镜像为恶意版本。
- 依赖投毒:基础镜像或第三方库被植入后门。
- 重放攻击:使用旧版本(含已知漏洞)的镜像替换新版本。
关键原则:镜像签名提供了不可否认性和完整性。即使注册表被攻破,未签名的镜像也无法通过验证,从而阻断供应链攻击链。
4.2 Sigstore 与 Cosign 简介
Sigstore 是一个开源、无中心的软件签名与验证生态系统,旨在简化代码和工件的签名流程。它由三个核心组件构成:
| 组件 | 功能 | 说明 |
|---|---|---|
| Cosign | 容器镜像签名与验证工具 | 支持密钥对、密钥管理服务(KMS)和 OIDC 身份 |
| Fulcio | 短期证书颁发机构(CA) | 基于 OIDC 身份签发 X.509 证书,证书有效期短(通常 10 分钟) |
| Rekor | 透明日志(Transparency Log) | 记录所有签名事件,提供可审计的不可变账本 |
Cosign 是 Sigstore 生态中最常用的客户端工具,支持:
- 使用本地密钥对、云 KMS(如 AWS KMS、GCP KMS、Azure Key Vault)或硬件安全模块(HSM)进行签名。
- 通过 OIDC 身份(如 GitHub、Google、Microsoft)自动获取 Fulcio 证书,实现免密钥签名。
- 将签名作为独立对象存储在 OCI 注册表中(与镜像同仓库),或附加为镜像标签。
- 支持对镜像、文本文件、Blob 等多种工件进行签名。
核心优势:Cosign 消除了传统 PKI 的证书管理负担。通过 Fulcio + Rekor,签名者无需长期保管私钥,验证者无需预先同步公钥,所有信任锚点来自 OIDC 身份和透明日志。
4.3 签名与验证的工作流程
Cosign 的签名与验证流程分为两个独立阶段,分别对应构建/推送环节和部署/拉取环节。下图展示了完整的端到端流程:
4.4 签名与验证的详细步骤
以下表格拆解了签名和验证两个阶段的具体操作步骤:
| 阶段 | 步骤 | 命令/操作 | 产出物 |
|---|---|---|---|
| 签名 | 1. 生成密钥对(或使用 OIDC) | cosign generate-key-pair |
私钥(本地保管)、公钥(公开) |
| 2. 计算镜像摘要 | cosign sign <image> |
镜像 SHA256 摘要 | |
| 3. 签名摘要并附加证书 | 内部调用 Fulcio 获取证书 | 签名载荷(.sig) | |
| 4. 上传签名到注册表 | 自动推送到 :sha256-xxx.sig |
OCI 签名对象 | |
| 验证 | 1. 拉取镜像与签名 | cosign verify <image> |
镜像 + 签名对象 |
| 2. 验证证书链 | 检查 Fulcio 根证书 | 证书有效性 | |
| 3. 验证签名与摘要匹配 | 公钥解密签名,对比摘要 | 完整性校验 | |
| 4. 检查透明日志 | 查询 Rekor 确保签名已记录 | 防抵赖证明 |
4.5 密钥管理与身份绑定
Cosign 支持两种主要的签名身份模式,其对比如下:
| 模式 | 密钥来源 | 信任模型 | 适用场景 |
|---|---|---|---|
| 密钥对模式 | 本地生成或 KMS | 公钥基础设施(PKI) | 内部 CI/CD、离线环境、合规要求严格的团队 |
| OIDC 模式(Keyless) | Fulcio 签发短期证书 | 身份联邦(GitHub/GitLab/Google) | 开源项目、多团队协作、追求低运维成本的场景 |
安全提示:在密钥对模式下,私钥必须妥善保管。建议使用 KMS 或 HSM 存储私钥,避免将私钥硬编码在 CI 配置或代码仓库中。OIDC 模式虽然免去了密钥管理,但需要确保 CI 环境能够安全获取 OIDC (如 GitHub Actions 的
id-: write 权限)。
4.6 签名验证的信任锚点
验证者需要建立信任锚点才能判断签名是否有效。Cosign 的信任模型包含以下层级:
- 根信任:Sigstore 的 Fulcio 根证书(公开、可验证)。
- 身份信任:OIDC 发行者(如
https://github.com/login/oauth)的可信性。 - 策略信任:用户自定义的验证策略(如只允许特定邮箱或组织签名的镜像)。
通过 cosign verify 命令,可以指定验证策略:
# 验证镜像签名,要求签名者邮箱为 @example.com
cosign verify --certificate-identity-regexp '.*@example\.com$' \
--certificate-oidc-issuer 'https://github.com/login/oauth' \
registry.example.com/my-image:v1.0