基于Cosign的镜像供应链信任边界驱动开发实践 - 第1节

1.1 软件供应链安全现状

现代软件开发高度依赖开源组件、第三方库和容器镜像。一个典型的企业级应用,其镜像中超过 90% 的代码可能来自上游依赖。这种“软件供应链”的深度嵌套,使得任何一个环节的失陷都会向下游传导,形成“供应链投毒”或“依赖混淆”攻击。

关键数据: 2024 年 Sonatype 报告显示,过去三年针对软件供应链的攻击数量年均增长超过 600%,其中针对容器镜像的篡改和恶意镜像投递占比显著上升。

1.1.1 主要威胁模型

威胁类型 攻击向量 典型后果
镜像篡改 中间人攻击、注册表入侵 植入后门、挖矿程序
依赖混淆 恶意包同名上传至公共仓库 构建时自动拉取恶意依赖
构建环境投毒 CI/CD 凭证泄露、缓存污染 篡改构建产物签名
陈旧依赖 已知 CVE 未修复 运行时被远程利用

1.1.2 传统安全防护的盲区

传统安全策略聚焦于“边界防御”和“运行时扫描”,但在镜像供应链中,信任是隐式的:开发者默认从 Docker Hub 拉取的镜像就是安全的,默认构建产物没有被篡改。这种“默认信任”正是攻击者利用的缺口。

核心矛盾: 镜像在构建完成后,从 CI 系统传输到生产注册表,再到 Kubernetes 拉取部署,整个链路缺乏“端到端”的完整性验证。谁签发了这个镜像?它是否被篡改过?传统方案无法回答。
软件供应链攻击面全景 开发者 代码仓库 CI/CD 流水线 镜像仓库 生产环境 攻击者 攻击面覆盖:开发者终端 → 代码仓库 → CI/CD 构建 → 镜像仓库 → 生产部署

1.2 信任边界模型概念

信任边界(Trust Boundary)是安全架构中用于区分“可信”与“不可信”环境的逻辑或物理边界。在云原生镜像供应链中,我们引入“信任边界驱动开发”(Trust Boundary Driven Development, TBDD)理念:在镜像生命周期的每个关键转换点,显式地建立并验证信任边界。

1.2.1 镜像供应链中的信任边界

我们将镜像从“开发”到“运行”的旅程划分为四个信任域:

  1. 开发域(不可信): 开发者本地环境、第三方依赖、基础镜像来源。
  2. 构建域(半可信): CI/CD 系统、构建缓存、编译工具链。
  3. 分发域(半可信): 镜像仓库、传输网络、镜像签名与验证。
  4. 运行域(可信): 生产集群、运行时安全策略、准入控制。
核心原则: 信任不能传递,必须逐域验证。一个镜像从“构建域”进入“分发域”时,必须携带不可伪造的签名凭证;从“分发域”进入“运行域”时,必须验证签名是否有效、是否由授权方签发。

1.2.2 信任边界驱动开发(TBDD)流程

阶段 信任边界动作 验证手段
开发阶段 锁定基础镜像摘要,扫描 SBOM Trivy / Grype 扫描
构建阶段 对镜像进行签名(Sign) Cosign 私钥签名
分发阶段 验证签名,存储签名到透明日志 Cosign verify + Rekor
部署阶段 准入控制器强制验证签名 Kyverno / OPA + Cosign
信任边界模型:镜像供应链四域 开发域 不可信 基础镜像 第三方依赖 构建域 半可信 CI/CD 流水线 Cosign 签名 分发域 半可信 镜像仓库 Rekor 透明日志 运行域 可信 K8s 准入控制 运行时验证 每个域之间必须通过签名/验证建立信任边界,禁止隐式信任传递

1.3 Cosign 在供应链中的角色

Cosign 是 Sigstore 项目下的容器镜像签名工具,它填补了云原生供应链中“完整性验证”和“来源认证”的空白。Cosign 的核心能力包括:

  • 镜像签名: 使用私钥或密钥对镜像摘要进行签名,生成不可伪造的签名对象。
  • 镜像验证: 使用公钥或 Sigstore 的公共信任根验证签名是否有效。
  • 透明日志集成: 自动将签名记录到 Rekor 透明日志,提供全局可审计性。
  • 密钥管理: 支持硬件密钥、云 KMS、GitHub Actions OIDC 等多种身份绑定方式。

1.3.1 Cosign 在信任边界中的位置

在 TBDD 模型中,Cosign 是连接“构建域”和“分发域”的信任锚点,也是“运行域”准入控制的核心决策依据。

信任域 Cosign 动作 输出产物
构建域 cosign sign 签名对象(.sig)
分发域 cosign verify 验证结果 + Rekor 条目
运行域 准入控制器调用 cosign verify 允许/拒绝部署
关键优势: Cosign 不依赖中心化的 PKI 体系,而是通过 Sigstore 的公共信任根(Fulcio + Rekor)实现“无密钥”签名,降低了密钥管理的复杂度,同时保证了签名的可验证性和不可抵赖性。

1.3.2 典型工作流示例

以下是一个使用 Cosign 对镜像进行签名和验证的完整流程:

# 1. 生成密钥对(或使用 OIDC 无密钥模式)
cosign generate-key-pair

# 2. 对镜像进行签名
cosign sign --key cosign.key your-registry/app:latest

# 3. 验证镜像签名
cosign verify --key cosign.pub your-registry/app:latest

# 4. 在 Kubernetes 准入控制中集成
# Kyverno 策略示例:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image
spec:
  rules:
    - name: check-cosign
      match:
        resources:
          kinds:
            - Pod
      verifyImages:
        - image: "your-registry/*"
          key: |-
            -----BEGIN PUBLIC KEY-----
            ...
            -----END PUBLIC KEY-----
实践建议: 在生产环境中优先使用 Sigstore 的“无密钥”模式(Keyless Signing),通过 OIDC 绑定开发者身份,避免私钥泄露风险。Cosign 会自动将签名记录到 Rekor 透明日志,任何人都可以审计签名的有效性。
Cosign 在信任边界中的核心角色 构建域 cosign sign Cosign 签名 + 透明日志 分发域 cosign verify 运行域 准入控制验证 Cosign 是构建域与分发域之间的信任锚点,也是运行域准入控制的决策依据

1.4 本章小结

软件供应链安全的核心挑战在于“隐式信任”。通过引入信任边界模型,我们将镜像生命周期划分为开发、构建、分发、运行四个域,并在每个域之间建立显式的验证机制。Cosign 作为 Sigstore 生态的核心工具,提供了轻量级、可审计的镜像签名与验证能力,是实现信任边界驱动开发的关键基础设施。

下一阶段: 在第二章中,我们将深入 Cosign 的安装配置、密钥管理策略,并完成第一个镜像签名与验证的实战操作。