3、镜像供应链安全全景:全链路风险分析
镜像供应链安全是云原生安全的核心防线。一个容器镜像从代码提交到生产运行,历经构建、存储、传输、部署和运行时五个阶段,每个阶段都存在独特的安全风险。本章从全链路视角拆解各阶段风险,并给出可落地的巡检与防护策略。
核心观点:镜像供应链安全不是单点防护,而是从“代码到运行”的端到端安全水位管控。任何一环的疏漏都可能导致整个集群沦陷。
3.1 镜像构建阶段风险
构建阶段是安全左移的第一道关口。风险主要来自基础镜像、依赖库、构建过程和构建工具链。
| 风险类别 | 具体风险 | 影响等级 | 巡检要点 |
|---|---|---|---|
| 基础镜像 | 使用过时/未打补丁的基础镜像(如 Ubuntu 18.04 已停止维护) | 高 | 检查基础镜像版本、CVE 扫描结果 |
| 依赖库 | 引入已知漏洞的第三方库(如 Log4j、OpenSSL) | 高 | SBOM 生成与依赖审计 |
| 构建过程 | Dockerfile 中硬编码密钥、使用 root 用户运行 | 中 | Dockerfile 静态扫描(Hadolint) |
| 构建工具链 | CI/CD 管道被篡改、构建缓存投毒 | 高 | 构建环境隔离、签名验证 |
最佳实践:构建阶段应强制使用“最小基础镜像”(如 distroless、Alpine),并集成 Trivy/Grype 进行 CVE 扫描,未通过扫描的镜像禁止进入仓库。
3.2 镜像仓库存储阶段风险
镜像仓库是供应链的中枢节点。风险集中在访问控制、镜像完整性、仓库配置和镜像老化管理。
- 访问控制薄弱:匿名拉取、弱密码、未启用 RBAC,导致镜像被非法拉取或篡改。
- 镜像完整性缺失:未使用签名(Cosign/Notary),镜像被中间人替换后无法感知。
- 仓库配置风险:公开仓库暴露敏感信息、未启用镜像扫描、未限制存储配额。
- 镜像老化与垃圾:大量过时镜像占用存储,且包含未修复漏洞的旧版本。
常见陷阱:很多团队只关注仓库的认证,却忽略了“镜像标签可变性”。例如
latest 标签可以被覆盖,导致不同时间拉取的镜像内容不一致。建议使用不可变标签(如 SHA256 digest)。
3.3 镜像传输阶段风险
镜像从仓库传输到集群节点的过程,面临中间人攻击、传输劫持和镜像缓存投毒等风险。
| 风险点 | 攻击方式 | 防护措施 |
|---|---|---|
| 网络传输 | 中间人篡改镜像层数据 | 启用 HTTPS/TLS、镜像签名验证 |
| 镜像代理/缓存 | 代理服务器缓存被投毒 | 配置镜像代理白名单、启用完整性校验 |
| 多集群拉取 | 跨集群传输时凭证泄露 | 使用临时凭证、最小权限 ServiceAccount |
3.4 镜像部署阶段风险
部署阶段是安全策略落地的关键环节。K8s 在拉取和启动镜像时,需要验证镜像的合法性、完整性和策略合规性。
- 镜像拉取策略不当:使用
imagePullPolicy: Always导致频繁拉取,增加攻击面;使用IfNotPresent可能使用本地被篡改的缓存。 - 镜像准入控制缺失:未配置 OPA/Gatekeeper 或 Kyverno 策略,允许未签名、高危漏洞或非白名单镜像运行。
- 镜像凭证泄露:将私有仓库凭证硬编码在 Pod YAML 或 ConfigMap 中。
- 镜像拉取超时与重试:恶意镜像导致 kubelet 反复拉取,引发节点资源耗尽。
巡检命令示例:检查集群中所有 Pod 的镜像拉取策略和凭证使用情况。
# 查看所有 Pod 的 imagePullPolicy
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\t"}{.spec.containers[*].imagePullPolicy}{"\n"}{end}'
# 检查是否使用了 imagePullSecrets
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.imagePullSecrets == null) | .metadata.namespace + "/" + .metadata.name'
3.5 镜像运行时阶段风险
镜像启动后,风险从镜像本身转移到容器进程、文件系统和系统调用。运行时安全是最后一道防线。
| 风险类别 | 攻击场景 | 检测手段 |
|---|---|---|
| 容器逃逸 | 利用内核漏洞或配置缺陷逃逸到宿主机 | Falco 规则、Seccomp/AppArmor 配置 |
| 恶意进程 | 镜像内包含后门或挖矿程序,运行时启动 | 运行时 CVE 扫描、进程白名单 |
| 文件篡改 | 容器内关键文件被修改(如 /etc/passwd) | 文件完整性监控(AIDE、Tripwire) |
| 网络攻击 | 容器内进程发起对外恶意连接或横向移动 | 网络策略(NetworkPolicy)、流量审计 |
3.6 全链路风险矩阵与巡检策略
将五个阶段的风险汇总,形成可操作的巡检矩阵,帮助团队快速定位安全水位短板。
| 阶段 | 关键风险 | 巡检工具/方法 | 修复优先级 |
|---|---|---|---|
| 构建 | 基础镜像漏洞、依赖库漏洞 | Trivy、Grype、SBOM 生成 | P0 |
| 存储 | 镜像未签名、仓库访问控制弱 | Cosign、Harbor 策略、镜像扫描 | P0 |
| 传输 | 中间人攻击、缓存投毒 | HTTPS、镜像代理白名单、签名验证 | P1 |
| 部署 | 准入控制缺失、凭证泄露 | OPA/Gatekeeper、Kyverno、Secret 审计 | P0 |
| 运行时 | 容器逃逸、恶意进程 | Falco、Seccomp、NetworkPolicy | P1 |