3. 供应链策略概述:什么是镜像供应链策略、常见策略类型
在云原生环境中,镜像供应链策略是指从代码提交、镜像构建、制品存储到运行时部署的全链路安全控制规则集合。etcd 作为分布式键值存储系统,其镜像一旦被篡改或植入恶意组件,将直接威胁整个集群的控制面数据。因此,理解供应链策略的定义与常见类型,是复核误报、定位策略缺陷的前提。
3.1 什么是镜像供应链策略
镜像供应链策略是一组可编程的安全门禁,用于确保容器镜像在生命周期各阶段满足预定义的信任条件。策略通常以 准入控制(Admission Control) 或 持续验证(Continuous Verification) 的方式执行,覆盖以下关键环节:
- 构建阶段:基础镜像来源校验、依赖包漏洞扫描、签名生成。
- 存储阶段:镜像仓库访问控制、不可变标签策略、签名存储。
- 部署阶段:运行时准入校验、签名验证、白名单匹配。
3.2 常见策略类型
根据 etcd 镜像供应链的实际运营经验,策略可归纳为三种核心类型。下表从校验对象、执行时机、误报倾向三个维度进行对比:
| 策略类型 | 校验对象 | 执行时机 | 典型误报原因 | 适用场景 |
|---|---|---|---|---|
| 签名校验 | 镜像数字签名(如 Cosign、Notation) | 构建完成时 / 部署准入时 | 密钥轮换未同步、签名算法不兼容 | 防止镜像被篡改、确保发布者身份 |
| 来源白名单 | 镜像仓库地址、组织命名空间、标签模式 | 构建拉取时 / 部署准入时 | 白名单未包含镜像仓库镜像、标签通配符过严 | 限制镜像来源、防止使用未授权仓库 |
| 漏洞扫描 | 镜像层中的 CVE、依赖库版本、操作系统包 | 镜像推送后 / 定期重新扫描 | 扫描器数据库滞后、误报高危但实际不可利用 | 阻止已知漏洞进入生产环境 |
3.3 策略类型详解
3.3.1 签名校验
签名校验通过非对称加密技术确保镜像的完整性和发布者身份。etcd 镜像通常使用 Cosign 或 Notation 进行签名,策略引擎在部署前验证签名是否有效、是否由受信任的私钥签署。
- 正向流程:构建者使用私钥对镜像摘要签名 → 签名存储于镜像仓库或 OCI 制品中 → 准入控制器使用公钥验证。
- 误报复核点:公钥分发延迟、签名格式不兼容(如旧版 Cosign 与新版 Notation 互认失败)、镜像重新打标签后签名丢失。
3.3.2 来源白名单
来源白名单策略定义允许拉取或部署的镜像仓库地址、组织路径和标签模式。对于 etcd 镜像,白名单通常包含官方仓库(如 gcr.io/etcd-development/etcd)和内部镜像仓库。
*/*:* 等过于宽泛的规则。例如:registry.internal.io/etcd/*:v3.5.* 比 registry.internal.io/*:* 更安全且误报率更低。
3.3.3 漏洞扫描
漏洞扫描策略基于 CVE 数据库对镜像层进行静态分析。扫描结果通常包含漏洞严重等级(Critical / High / Medium / Low)和修复建议。策略可配置为:当存在 Critical 级别漏洞时阻止部署,或仅记录告警。
- 常见扫描工具:Trivy、Grype、Clair、Anchore。
- 误报场景:扫描器将已修复的 CVE 标记为存在(数据库未更新)、将仅影响非运行时的依赖标记为高危、将 etcd 自身代码中的误报 CVE 标记为严重。
3.4 策略组合与误报关系
在实际生产环境中,etcd 镜像供应链通常同时启用上述三种策略。策略组合虽然提升了安全性,但也增加了误报的复杂性和排查难度:
- 签名校验 + 来源白名单:镜像来源合法但签名过期,导致部署被拒绝。
- 漏洞扫描 + 签名校验:镜像签名有效但扫描报告包含误报 CVE,导致流水线阻塞。
- 三种策略同时触发:需要按策略优先级逐层排查,先确认来源白名单是否匹配,再验证签名有效性,最后复核漏洞扫描结果。
3.5 策略配置示例(Cosign + Kyverno)
以下是一个针对 etcd 镜像的供应链策略配置片段,使用 Cosign 进行签名校验,Kyverno 作为准入控制器执行策略:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: etcd-signature-verify
spec:
validationFailureAction: Enforce
rules:
- name: verify-cosign-signature
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
- "gcr.io/etcd-development/etcd:*"
attestors:
- count: 1
entries:
- keys:
publicKeys: |-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
-----END PUBLIC KEY-----
mutateDigest: true
required: true
该策略强制要求所有来自 gcr.io/etcd-development/etcd 的镜像必须包含有效的 Cosign 签名,且摘要必须与签名时一致。若签名缺失或无效,Pod 创建将被拒绝。