1. 课程导论:软件供应链安全现状、镜像签名与验证的必要性、Sigstore 项目简介与核心组件、K8s 准入控制概述

1.1 软件供应链安全现状:从开发到部署的信任危机

现代云原生应用高度依赖开源组件、第三方基础镜像和自动化 CI/CD 流水线。这种复杂的依赖关系使得软件供应链成为攻击者的高价值目标。近年来,针对软件供应链的攻击事件呈指数级增长,攻击手法也从传统的漏洞利用演变为对构建、分发和部署环节的深度渗透。

关键数据: 根据 Sonatype 2023 年报告,过去三年软件供应链攻击的年均增长率超过 700%,其中针对容器镜像的投毒和篡改事件占比显著上升。

容器镜像作为云原生应用的主要交付物,其安全性面临以下核心威胁:

  • 镜像投毒: 攻击者将恶意代码植入公共仓库的官方或流行镜像中,等待用户拉取。
  • 中间人篡改: 在镜像从仓库传输到运行环境的过程中,拦截并修改镜像层或 Manifest 文件。
  • 仓库劫持: 攻击者获取镜像仓库的凭证,直接替换或修改已存储的镜像标签。
  • 依赖混淆: 利用内部包命名规则,上传同名恶意镜像到公共仓库,诱导构建系统拉取。
攻击阶段 典型攻击向量 影响范围
开发阶段 依赖混淆、恶意 SDK、IDE 插件 单个项目或团队
构建阶段 CI/CD 凭证泄露、构建缓存投毒 整个流水线产物
分发阶段 镜像仓库劫持、中间人攻击 所有下游消费者
部署阶段 运行时镜像篡改、恶意 Sidecar 生产集群

1.2 镜像签名与验证的必要性:建立端到端的信任链

传统的镜像安全策略(如镜像扫描、漏洞检测)属于被动防御,无法解决“镜像是否来自可信发布者”以及“镜像在构建后是否被篡改”这两个根本问题。镜像签名与验证机制通过密码学手段,为镜像的发布者身份和内容完整性提供可验证的保证。

实施镜像签名与验证的核心价值体现在:

  • 来源认证: 确保镜像确实由声称的发布者(如组织、团队或个人)签名,防止身份伪造。
  • 完整性校验: 验证镜像内容从签名时刻到部署时刻未被任何中间环节修改。
  • 不可否认性: 发布者无法否认其曾签名并发布过特定版本的镜像。
  • 策略执行: 在 Kubernetes 集群中,通过准入控制器强制要求所有运行的镜像必须经过有效签名,否则拒绝部署。
实践建议: 镜像签名应作为 CI/CD 流水线的标准步骤,在镜像构建完成后立即执行。验证则应在镜像被拉取到 Kubernetes 节点之前完成,最佳实践是在准入控制阶段进行。

1.3 Sigstore 项目简介与核心组件

Sigstore 是一个开源项目,旨在通过简化签名流程、提供透明的公共审计日志以及无密钥签名技术,解决传统软件签名方案(如 GPG)在易用性、密钥管理和可审计性方面的痛点。Sigstore 不是单一工具,而是一套由多个组件组成的生态系统。

Sigstore 核心组件架构图 开发者 / CI 系统 Cosign Fulcio Rekor OCI 镜像仓库 工作流程:开发者使用 Cosign 签名 → Cosign 向 Fulcio 请求证书 → 签名记录写入 Rekor → 签名和镜像推送至 OCI 仓库

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。
K8s 准入控制流程(镜像验证场景) kubectl / API API Server 准入控制器 etcd 准入控制器在镜像验证中的关键检查点 1. 拦截 Pod 创建请求,提取容器镜像地址。 2. 调用外部验证服务(如 Cosign 验证器)检查镜像签名。 3. 根据验证结果:通过则放行至 etcd;失败则返回错误并拒绝创建。
重要提示: 准入控制器是强制实施镜像签名策略的理想位置。通过在集群中部署 ValidatingAdmissionWebhook,可以确保所有部署到集群的镜像都必须经过签名验证,从而将安全策略从“建议”升级为“强制”。