基于Cosign的镜像供应链信任边界驱动开发实践 - 第1节
1.1 软件供应链安全现状
现代软件开发高度依赖开源组件、第三方库和容器镜像。一个典型的企业级应用,其镜像中超过 90% 的代码可能来自上游依赖。这种“软件供应链”的深度嵌套,使得任何一个环节的失陷都会向下游传导,形成“供应链投毒”或“依赖混淆”攻击。
关键数据: 2024 年 Sonatype 报告显示,过去三年针对软件供应链的攻击数量年均增长超过 600%,其中针对容器镜像的篡改和恶意镜像投递占比显著上升。
1.1.1 主要威胁模型
| 威胁类型 | 攻击向量 | 典型后果 |
|---|---|---|
| 镜像篡改 | 中间人攻击、注册表入侵 | 植入后门、挖矿程序 |
| 依赖混淆 | 恶意包同名上传至公共仓库 | 构建时自动拉取恶意依赖 |
| 构建环境投毒 | CI/CD 凭证泄露、缓存污染 | 篡改构建产物签名 |
| 陈旧依赖 | 已知 CVE 未修复 | 运行时被远程利用 |
1.1.2 传统安全防护的盲区
传统安全策略聚焦于“边界防御”和“运行时扫描”,但在镜像供应链中,信任是隐式的:开发者默认从 Docker Hub 拉取的镜像就是安全的,默认构建产物没有被篡改。这种“默认信任”正是攻击者利用的缺口。
核心矛盾: 镜像在构建完成后,从 CI 系统传输到生产注册表,再到 Kubernetes 拉取部署,整个链路缺乏“端到端”的完整性验证。谁签发了这个镜像?它是否被篡改过?传统方案无法回答。
1.2 信任边界模型概念
信任边界(Trust Boundary)是安全架构中用于区分“可信”与“不可信”环境的逻辑或物理边界。在云原生镜像供应链中,我们引入“信任边界驱动开发”(Trust Boundary Driven Development, TBDD)理念:在镜像生命周期的每个关键转换点,显式地建立并验证信任边界。
1.2.1 镜像供应链中的信任边界
我们将镜像从“开发”到“运行”的旅程划分为四个信任域:
- 开发域(不可信): 开发者本地环境、第三方依赖、基础镜像来源。
- 构建域(半可信): CI/CD 系统、构建缓存、编译工具链。
- 分发域(半可信): 镜像仓库、传输网络、镜像签名与验证。
- 运行域(可信): 生产集群、运行时安全策略、准入控制。
核心原则: 信任不能传递,必须逐域验证。一个镜像从“构建域”进入“分发域”时,必须携带不可伪造的签名凭证;从“分发域”进入“运行域”时,必须验证签名是否有效、是否由授权方签发。
1.2.2 信任边界驱动开发(TBDD)流程
| 阶段 | 信任边界动作 | 验证手段 |
|---|---|---|
| 开发阶段 | 锁定基础镜像摘要,扫描 SBOM | Trivy / Grype 扫描 |
| 构建阶段 | 对镜像进行签名(Sign) | Cosign 私钥签名 |
| 分发阶段 | 验证签名,存储签名到透明日志 | Cosign verify + Rekor |
| 部署阶段 | 准入控制器强制验证签名 | Kyverno / OPA + Cosign |
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 透明日志,任何人都可以审计签名的有效性。
1.4 本章小结
软件供应链安全的核心挑战在于“隐式信任”。通过引入信任边界模型,我们将镜像生命周期划分为开发、构建、分发、运行四个域,并在每个域之间建立显式的验证机制。Cosign 作为 Sigstore 生态的核心工具,提供了轻量级、可审计的镜像签名与验证能力,是实现信任边界驱动开发的关键基础设施。
下一阶段: 在第二章中,我们将深入 Cosign 的安装配置、密钥管理策略,并完成第一个镜像签名与验证的实战操作。