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 的签名与验证流程分为两个独立阶段,分别对应构建/推送环节和部署/拉取环节。下图展示了完整的端到端流程:

Cosign 签名与验证工作流程 签名阶段(构建/推送) 开发者 / CI 容器镜像 cosign sign 签名 + 证书 验证阶段(部署/拉取) 验证者 / CD 签名 + 证书 cosign verify 验证通过/失败 OCI 注册表 Rekor 透明日志(签名事件记录)

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 的信任模型包含以下层级:

  1. 根信任:Sigstore 的 Fulcio 根证书(公开、可验证)。
  2. 身份信任:OIDC 发行者(如 https://github.com/login/oauth)的可信性。
  3. 策略信任:用户自定义的验证策略(如只允许特定邮箱或组织签名的镜像)。

通过 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