1. 课程导论:Sigstore 项目背景、云原生供应链安全挑战、课程目标与学习路径
1.1 云原生供应链安全挑战
云原生架构的普及使得软件供应链从“构建-发布-部署”的线性流程演变为高度动态、多参与方的复杂网络。容器镜像、Helm Chart、Kustomize 覆盖层、策略引擎等配置制品在流转过程中面临以下核心威胁:
| 威胁类别 | 典型攻击场景 | 影响范围 |
|---|---|---|
| 镜像篡改 | 攻击者劫持 CI/CD 管道,向镜像仓库推送带后门的镜像 | 运行时集群、下游消费者 |
| 配置注入 | 恶意 PR 修改准入策略或 ConfigMap,绕过安全基线 | 集群安全态势、合规审计 |
| 元数据伪造 | 伪造 SBOM、签名或 attestation,欺骗策略引擎 | 供应链透明度、取证溯源 |
| 密钥泄露 | 签名私钥被窃取,攻击者以合法身份发布恶意制品 | 信任链根证书、发布者身份 |
关键洞察: 传统 PKI 和手动签名流程无法适应云原生环境下的高频发布、多集群分发和声明式策略管理需求。供应链安全的核心矛盾已从“能否签名”转变为“能否在声明式工作流中自动验证并生成可审计的证据”。
1.2 Sigstore 项目背景
Sigstore 是由 Google、Red Hat、Purdue 大学等联合发起的开源项目,旨在为软件供应链提供一套无门槛、免密钥管理、可审计的签名与验证基础设施。其核心组件包括:
- Cosign:容器镜像、Blob、Attestation 的签名与验证工具。
- Fulcio:基于 OIDC 身份的无根证书颁发机构,签发短期签名证书。
- Rekor:不可篡改的透明日志,记录所有签名元数据与证据。
- Policy Controller:Kubernetes 准入控制器,基于 Sigstore 签名执行策略。
Sigstore 的设计哲学是“签名不应成为开发者的负担”。通过 OIDC 身份(如 GitHub、Google、Microsoft 账号)自动获取短期证书,签名过程无需管理私钥,验证过程依赖公共透明日志而非预分发公钥。
核心价值: Sigstore 将签名从“手动、易错、密钥密集”的操作转变为“自动、可审计、声明式”的云原生原语,为配置管理准入策略提供了可编程的信任基础。
1.3 课程目标与学习路径
本课程旨在帮助学员掌握使用 Sigstore 工具链对云原生配置管理(如 Kubernetes 资源、Helm Chart、Kustomize 覆盖层)实施声明式准入策略,并生成可审计的发布证据。完成本课程后,学员将能够:
- 理解 Sigstore 签名模型与透明日志原理。
- 使用 Cosign 对容器镜像和 Kubernetes 配置清单进行签名与验证。
- 部署并配置 Policy Controller,实现基于签名的准入策略。
- 将签名与验证集成到 GitOps 工作流(ArgoCD / Flux)中。
- 生成并管理符合 SLSA 和 SSDF 要求的发布证据链。
1.4 课程章节概览
| 模块 | 章节范围 | 核心实践 |
|---|---|---|
| 基础篇 | 第 1-5 章 | Sigstore 环境搭建、Cosign 签名验证、Fulcio/Rekor 配置 |
| 策略篇 | 第 6-12 章 | Policy Controller 部署、声明式准入策略编写、策略测试 |
| 集成篇 | 第 13-20 章 | GitOps 集成、Helm/Kustomize 签名、多集群策略分发 |
| 证据篇 | 第 21-26 章 | Attestation 生成、Rekor 查询、审计证据导出 |
| 实战篇 | 第 27-30 章 | 端到端供应链安全平台搭建、故障排查、生产最佳实践 |
学习建议: 建议学员具备基本的 Kubernetes 操作经验(kubectl、YAML 编写)和 CI/CD 概念。每章均提供可复现的代码示例和验证步骤,建议在本地 Kind 或 Minikube 集群中跟随操作。
1.5 环境准备与前置要求
为顺利完成本课程实践,请确保以下环境就绪:
- Kubernetes 集群:推荐使用 Kind v0.20+ 或 Minikube v1.30+,至少 4GB 内存。
- 命令行工具:cosign v2.2+、kubectl v1.28+、helm v3.12+。
- OIDC 身份:GitHub、Google 或 Microsoft 账号,用于 Fulcio 证书签发。
- 可选:Docker 或 Podman 用于本地镜像构建与签名测试。
快速验证命令:
# 验证 Cosign 安装
cosign version
# 验证集群访问
kubectl cluster-info
# 测试 OIDC 身份(以 GitHub 为例)
cosign generate-key-pair
echo "环境就绪,可以开始第 2 章内容。"