1. 课程导论:软件供应链安全现状、镜像签名与验证的必要性、Sigstore 项目简介与核心组件、K8s 准入控制概述
1.1 软件供应链安全现状:从开发到部署的信任危机
现代云原生应用高度依赖开源组件、第三方基础镜像和自动化 CI/CD 流水线。这种复杂的依赖关系使得软件供应链成为攻击者的高价值目标。近年来,针对软件供应链的攻击事件呈指数级增长,攻击手法也从传统的漏洞利用演变为对构建、分发和部署环节的深度渗透。
容器镜像作为云原生应用的主要交付物,其安全性面临以下核心威胁:
- 镜像投毒: 攻击者将恶意代码植入公共仓库的官方或流行镜像中,等待用户拉取。
- 中间人篡改: 在镜像从仓库传输到运行环境的过程中,拦截并修改镜像层或 Manifest 文件。
- 仓库劫持: 攻击者获取镜像仓库的凭证,直接替换或修改已存储的镜像标签。
- 依赖混淆: 利用内部包命名规则,上传同名恶意镜像到公共仓库,诱导构建系统拉取。
| 攻击阶段 | 典型攻击向量 | 影响范围 |
|---|---|---|
| 开发阶段 | 依赖混淆、恶意 SDK、IDE 插件 | 单个项目或团队 |
| 构建阶段 | CI/CD 凭证泄露、构建缓存投毒 | 整个流水线产物 |
| 分发阶段 | 镜像仓库劫持、中间人攻击 | 所有下游消费者 |
| 部署阶段 | 运行时镜像篡改、恶意 Sidecar | 生产集群 |
1.2 镜像签名与验证的必要性:建立端到端的信任链
传统的镜像安全策略(如镜像扫描、漏洞检测)属于被动防御,无法解决“镜像是否来自可信发布者”以及“镜像在构建后是否被篡改”这两个根本问题。镜像签名与验证机制通过密码学手段,为镜像的发布者身份和内容完整性提供可验证的保证。
实施镜像签名与验证的核心价值体现在:
- 来源认证: 确保镜像确实由声称的发布者(如组织、团队或个人)签名,防止身份伪造。
- 完整性校验: 验证镜像内容从签名时刻到部署时刻未被任何中间环节修改。
- 不可否认性: 发布者无法否认其曾签名并发布过特定版本的镜像。
- 策略执行: 在 Kubernetes 集群中,通过准入控制器强制要求所有运行的镜像必须经过有效签名,否则拒绝部署。
1.3 Sigstore 项目简介与核心组件
Sigstore 是一个开源项目,旨在通过简化签名流程、提供透明的公共审计日志以及无密钥签名技术,解决传统软件签名方案(如 GPG)在易用性、密钥管理和可审计性方面的痛点。Sigstore 不是单一工具,而是一套由多个组件组成的生态系统。
1.3.1 Cosign:签名与验证工具
Cosign 是 Sigstore 的命令行工具和库,用于对容器镜像、Blob 和文档进行签名与验证。它支持多种签名方式,包括密钥对签名、云 KMS 集成以及 Sigstore 特有的无密钥签名(Keyless Signing)。Cosign 将签名作为独立的 OCI 制品存储在镜像仓库中,与镜像本身解耦,便于管理和分发。
1.3.2 Fulcio:无密钥签名的证书颁发机构
Fulcio 是 Sigstore 的根证书颁发机构(Root CA),专为无密钥签名设计。当开发者使用 Cosign 进行无密钥签名时,Cosign 会向 Fulcio 发送一个短暂的证书签名请求(CSR)。Fulcio 验证开发者的身份(通过 OIDC 协议,如 GitHub、Google、Microsoft 账号),并颁发一个短期有效的 X.509 证书。该证书的公钥用于签名,私钥仅存在于签名者的内存中,签名完成后立即销毁,从而消除了传统密钥管理的风险。
1.3.3 Rekor:透明性与审计日志
Rekor 是 Sigstore 的不可变、防篡改的透明性日志。每次签名操作(包括签名元数据、证书信息和哈希值)都会被记录到 Rekor 日志中。任何人都可以查询 Rekor 来验证某个签名是否在特定时间点存在,以及签名者的身份信息。Rekor 提供了公开的可审计性,使得恶意签名或证书滥用行为可以被发现和追溯。
| 组件 | 核心功能 | 关键特性 |
|---|---|---|
| Cosign | 镜像签名、验证、存储 | 支持密钥对、KMS、无密钥签名;签名作为 OCI 制品 |
| Fulcio | 证书颁发机构(CA) | 基于 OIDC 身份验证;颁发短期证书;消除长期密钥管理 |
| Rekor | 透明性日志 | 不可变、防篡改;公开可查询;提供时间戳证明 |
1.4 Kubernetes 准入控制概述
Kubernetes 准入控制是集群安全的关键防线。准入控制器(Admission Controller)是一段代码,它会在 API 请求通过认证和授权之后、对象被持久化到 etcd 之前拦截请求。准入控制器可以修改(Mutating)或验证(Validating)请求对象。
在镜像安全场景中,准入控制器扮演着“守门员”的角色:
- MutatingAdmissionWebhook: 可以在 Pod 创建前自动注入 Sidecar 容器、修改镜像拉取策略或添加安全上下文。
- ValidatingAdmissionWebhook: 用于验证 Pod 的镜像是否经过有效签名,如果验证失败,则拒绝创建 Pod。