3. 制品签名基础:软件供应链安全、签名算法简介与签名价值

在云原生环境中,从代码提交到生产部署的链路中,每一个制品(容器镜像、Helm Chart、策略包)都可能成为攻击目标。制品签名是软件供应链安全的第一道防线,它确保制品的完整性、来源真实性和不可抵赖性。

3.1 软件供应链安全威胁模型

现代软件供应链攻击不再局限于代码仓库,而是渗透到构建、分发和部署的每一个环节。常见的攻击向量包括:

  • 依赖混淆:攻击者上传同名恶意包到公共仓库,利用内部包管理器的优先级缺陷。
  • 构建环境投毒:CI/CD 流水线中的临时凭证泄露或恶意插件篡改构建产物。
  • 镜像篡改:在镜像推送到仓库后、拉取到集群前,中间人替换镜像层。
  • 元数据伪造:篡改镜像的标签、注解或 SBOM(软件物料清单)信息。
核心原则:签名必须发生在构建管线的可信节点(如 CI Runner 或专用的签名服务),并在部署策略中强制验证,形成“签名-验证”闭环。

3.2 签名算法简介:GPG 与 Sigstore/Cosign

当前主流的制品签名方案分为两类:传统的 GPG 和云原生时代的 Sigstore/Cosign。下表从多个维度对比两者的差异:

维度 GPG (OpenPGP) Sigstore / Cosign
密钥管理 自生成密钥对,需自行保护私钥,公钥分发依赖 Key Server 或手动交换 无长期密钥;使用 OIDC 身份(GitHub/GitLab/Email)签发临时密钥,签名后私钥即销毁
签名算法 RSA / DSA / ECDSA ECDSA-P256 / Ed25519(通过 Fulcio CA 签发)
验证方式 导入公钥到本地信任链,验证签名与摘要 通过 Rekor 透明日志查询签名记录,无需预先导入公钥
透明日志 无内置日志,依赖审计 Rekor 提供不可篡改的签名审计链
适用场景 传统 Git 提交签名、老旧系统集成 云原生容器镜像、Helm Chart、策略包签名

3.2.1 GPG 签名流程

GPG 使用非对称加密,签名者用私钥对制品的哈希值加密,验证者用公钥解密并比对哈希。其核心步骤为:

  1. 生成密钥对:gpg --full-generate-key
  2. 导出公钥并分发:gpg --armor --export <key-id> > public.key
  3. 对制品签名:gpg --detach-sign --armor artifact.tar.gz
  4. 验证签名:gpg --verify artifact.tar.gz.asc artifact.tar.gz
GPG 的运维挑战:私钥泄露风险高、公钥分发依赖带外渠道、密钥轮换成本大,在自动化 CI/CD 中容易成为安全短板。

3.2.2 Sigstore / Cosign 签名流程

Cosign 是 Sigstore 项目的一部分,专为容器镜像和 OCI 制品设计。它消除了密钥管理的痛点:

  1. 身份绑定:开发者通过 OIDC 登录(如 cosign login),Fulcio CA 签发短期证书。
  2. 签名与上传:cosign sign <image> 生成签名,并自动上传到 Rekor 透明日志。
  3. 验证:cosign verify <image> 从 Rekor 获取签名和证书,验证身份与完整性。
# 使用 Cosign 对镜像签名(基于 OIDC 身份)
cosign sign --key azurekms://mykeyvault/mykey myregistry.io/app:1.0

# 验证签名(无需预先导入公钥)
cosign verify --certificate-identity "developer@example.com" \
  --certificate-oidc-issuer "https://accounts.google.com" \
  myregistry.io/app:1.0

3.3 签名的作用与价值

制品签名在 DevSecOps 实践中提供三重核心价值:

  • 完整性保护:任何对制品的篡改(包括镜像层、配置元数据)都会导致签名验证失败,从源头阻断供应链投毒。
  • 身份认证:签名绑定到具体的 OIDC 身份或 GPG 密钥,确保制品来自可信的构建主体,防止“冒名发布”。
  • 审计与溯源:Rekor 透明日志提供不可篡改的签名记录,结合 CI/CD 流水线 ID,可快速定位“谁、在何时、签发了哪个制品”。
实践建议:在 IDP 中,建议将 Cosign 签名作为默认策略,并配合 Kyverno / OPA 在集群侧强制验证。对于遗留系统,可使用 GPG 签名作为过渡方案,但需建立密钥轮换和审计机制。

3.4 制品签名链路架构图

下图展示了从开发者提交代码到制品部署的完整签名与验证链路:

制品签名链路与验证流程 制品签名链路与验证流程 开发者 / CI Cosign 签名 Rekor 日志 OCI 仓库 策略验证 K8s 集群 审计面板 链路说明 ① 签名绑定身份 ② 日志不可篡改 ③ 仓库存储签名 ④ 策略强制验证 ⑤ 拒绝未签名镜像 ⑥ 审计可追溯

3.5 签名算法对比总结

在选择签名方案时,需结合团队运维能力和安全要求。下表给出推荐场景:

场景 推荐方案 理由
云原生新项目 Sigstore / Cosign 无密钥管理、原生 OCI 支持、透明日志审计
遗留系统 / Git 签名 GPG 工具链成熟、社区广泛支持
高合规金融场景 Cosign + 硬件密钥 短期证书 + HSM 保护私钥,满足合规审计
多团队 IDP 平台 Cosign + OIDC 自动绑定团队身份,策略引擎可基于身份做细粒度控制
关键结论:制品签名不是可选项,而是软件供应链安全的强制性基线。在 IDP 中,签名应作为流水线的内置步骤,而非事后补充。结合 Sigstore 的透明日志和 OIDC 身份,可以构建“零信任”的制品交付链路。