01 · 容器隔离机制基础
容器不是虚拟化技术,而是一组Linux内核特性的组合装配。理解每一层机制的隔离强度与局限,是评估"这个Pod配置能挡住什么"的前提。
| 机制 | 作用 | 局限与逃逸关联 |
|---|---|---|
| 命名空间(namespace) | 隔离进程视角:PID、NET、MNT、UTS、IPC、USER、CGROUP视图 | 仅隔离"可见性"不隔离资源;共享内核使内核漏洞成为公共突破面;USER namespace未启用时容器内root=宿主机root |
| 控制组(cgroups) | 限制CPU、内存、IO、PIDs用量 | 只管资源配额不管行为;CVE-2022-0492证明cgroups通知机制(release_agent)本身可被滥用为逃逸通道 |
| capabilities | 将root权限拆分为40余种细粒度能力(CAP_SYS_ADMIN、CAP_NET_ADMIN等) | 默认Docker/Containerd保留的capability集合过宽;CAP_SYS_ADMIN号称"新root",足以完成多数提权与挂载操作 |
| seccomp | 系统调用过滤器,白名单容器进程可调用的syscall | 默认配置(RuntimeDefault)约允许300余调用;过宽的自定义profile等于无效;不限制已被允许调用的参数组合 |
| LSM(AppArmor/SELinux) | 强制访问控制:按profile/标签约束进程可访问的文件、能力与网络 | 策略编写复杂度高,生产启用率偏低;模式设为Unconfined等于完全豁免 |
设计原则:纵深防御要求每一层独立有效——最小化capabilities(drop ALL,仅加回必需项)、默认seccomp profile、启用SELinux/AppArmor、readOnlyRootFilesystem、no-new-privileges与runAsNonRoot五件套同时生效时,绝大多数公开逃逸链的关键环节将被拦截(详见第4节漏洞防护映射)。
02 · PSS三档详解
PodSecurityPolicy(PSP)于Kubernetes v1.25正式移除后,Pod Security Standards(PSS)经内置PodSecurity准入插件成为官方唯一的Pod安全基线执行机制。PSS按namespace标签三档强制执行:
| 档位 | 定位 | 关键约束(非完整清单) |
|---|---|---|
| Privileged | 无限制,等于无安全基线 | 仅用于系统级组件(CNI插件、存储插件、节点观测代理) |
| Baseline | 防止已知的权限提升路径,最小限制 | 禁止hostPID/hostNetwork/hostIPC、hostPath卷、特权容器、hostPorts、SYS_ADMIN等危险capabilities;要求no-new-privileges;限制卷类型 |
| Restricted | 强化最佳实践,面向多租户与不可信负载 | 在Baseline之上:必须runAsNonRoot、seccompProfile=RuntimeDefault、allowPrivilegeEscalation=false、capabilities drop=ALL、禁止hostPath、限制卷类型至最小集、限制sysctls白名单 |
2.1 强制执行模式与标签体系
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
# 系统命名空间(如 kube-system)则显式标注:
# pod-security.kubernetes.io/enforce: privileged- 三种模式:enforce(拒绝违规Pod)、audit(记录审计事件不拦截)、warn(向用户返回警告)——上线新档位建议按 audit→warn→enforce 灰度。
- 豁免机制:用户、RuntimeClass与镜像前缀可豁免(如kube-system组件);豁免清单是基线核查重点对象。
- 与PSA的关系:PSS是标准定义,PSA(Pod Security Admission)是执行插件;第三方Webhook(Kyverno/Gatekeeper)可实现更细粒度(如按镜像仓库、按团队)的例外管理。
2.2 Baseline vs Restricted 关键差异速查
| 字段 | Baseline | Restricted |
|---|---|---|
| runAsNonRoot | 未强制(建议设置) | 必须true |
| seccompProfile | 未强制(建议RuntimeDefault) | 必须RuntimeDefault或更严 |
| allowPrivilegeEscalation | 未强制(建议false) | 必须false |
| capabilities | 禁止SYS_ADMIN等高危项 | 必须drop: ["ALL"],仅可加回NET_BIND_SERVICE等极少量 |
| hostPath | 禁止 | 禁止 |
| 卷类型 | 禁止hostPath等危险类型 | 进一步收敛至configMap、secret、emptyDir、projected等最小集 |
03 · 安全上下文最佳实践
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
spec:
template:
spec:
serviceAccountName: app-sa # 专用SA,默认不挂载令牌视需要
automountServiceAccountToken: false # 不访问API则关闭
securityContext:
runAsNonRoot: true
runAsUser: 10001
fsGroup: 10001
seccompProfile: { type: RuntimeDefault }
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true # 根文件系统只读,防落盘篡改
capabilities: { drop: ["ALL"] } # 只按需加回(如NET_BIND_SERVICE)
volumeMounts:
- { name: tmp, mountPath: /tmp } # 可写目录以emptyDir提供- readOnlyRootFilesystem:将镜像内根文件系统只读化,多数Webshell落地、配置文件篡改、恶意ELF落盘将被直接阻断;须为/tmp、缓存目录配置emptyDir。
- no-new-privileges:禁止进程通过setuid二进制提权——直接消解CVE-2022-0492类依赖setuid的逃逸链的关键环节。
- 以UID显式运行:runAsUser与镜像内USER指令双保险;避免以0(root)运行,即使逃逸后的可利用权限面也大幅收缩。
- 宿主命名空间隔离:hostNetwork/hostPID/hostIPC三者为Baseline档禁止项——开启hostPID即可看到并操作宿主机全部进程,隔离归零。
04 · 容器逃逸漏洞谱系与防护映射
将第2页漏洞档案中的运行时类逃逸事件按"机理"归类,可得到四条谱系线。每一类均有对应的基线拦截点——这正是PSS与安全上下文的价值所在。
| 谱系 | 代表CVE | 机理摘要 | 基线拦截点(无补丁时) |
|---|---|---|---|
| 运行时文件处理缺陷 | CVE-2019-5736、CVE-2024-21626 | runc在容器进程替换/工作目录处理上的文件描述符与路径处理缺陷,使容器内进程可触及宿主机runc二进制或文件系统 | 非root运行+RuntimeDefault seccomp(阻断ptrace等关键调用)+异常工作目录告警;补丁升级为根本解 |
| 内核特性滥用 | CVE-2022-0492(cgroups release_agent) | 容器内进程利用cgroups通知机制在宿主机上下文执行命令;依赖CAP_SYS_ADMIN及mount能力 | capabilities drop ALL+no-new-privileges(Baseline强制项)使前提条件不成立 |
| 配置注解/标签注入 | CVE-2022-0811(CRI-O cr8escape) | 运行时未校验Pod注解中的sysctl键值,注入kernel.core_pattern等内核参数实现宿主机代码执行 | 准入层白名单校验注解(Gatekeeper/Kyverno);PSS Restricted的sysctls白名单 |
| 挂载路径逃逸 | CVE-2021-25741(subPath符号链接) | 利用subPath挂载时序与符号链接,将宿主机密钥/文件系统暴露进容器 | 禁止hostPath+subPath组合用于不受信负载;PSS Baseline禁止hostPath;监控异常符号链接行为 |
共性结论:①四类逃逸中至少三类的"前提条件"是危险配置(特权、宽capabilities、hostPath、注解注入)——这意味着即使不升级补丁,强化的PSS基线也能消解多数逃逸链的关键前提,补丁与基线是互补而非替代关系;②运行时漏洞的检测窗口在"容器内行为"而非网络层——必须依赖内核级遥测(第6节);③对不受信代码(CI任务、客户提交的作业)应直接启用沙箱运行时或独立节点池。
05 · 沙箱化运行时选型
当负载不可信程度超过"共享内核"可承受边界时,应升级隔离模型。Kubernetes通过RuntimeClass资源原生支持为指定Pod选择不同运行时。
| 方案 | 隔离原理 | 隔离强度 | 性能开销 | 典型场景 |
|---|---|---|---|---|
| runc / containerd (默认) | Linux命名空间+cgroups(共享内核) | 进程级 | 极低 | 内部可信负载默认选项 |
| gVisor | 用户态内核(Sentry)拦截并重放系统调用,应用不直接接触宿主内核 | 系统调用虚拟化级 | 中(syscall密集负载20%+) | 多租户SaaS、不受信CI任务、线上代码执行类服务 |
| Kata Containers | 每Pod独立轻量虚拟机(KVM),内核级隔离 | 硬件虚拟化级 | 中高(每Pod独立内核) | 高价值多租户、合规强隔离要求场景 |
| Firecracker(经Kata/直接集成) | AWS开源microVM,专为高密度多租户设计 | 硬件虚拟化级 | 中 | Serverless平台(AWS Lambda底层)、大规模多租户 |
- 选型逻辑:先以PSS基线+运行时检测覆盖"可信负载";对不受信负载按"开销敏感度"选gVisor(低开销优先)或Kata(隔离强度优先);GPU等专用设备场景注意gVisor的设备支持边界。
- 落地形态:RuntimeClass+节点选择器将沙箱Pod调度至专用节点池;配合准入策略实现"namespace→RuntimeClass"的强制映射(如tenant命名空间强制gVisor)。
- 清醒认识:沙箱缓解的是"内核共享面",不替代权限最小化——gVisor逃逸漏洞(其安全公告中亦有披露)与配置错误仍是独立风险。
06 · 运行时行为检测
补丁有窗口期、基线有例外项——运行时检测是兜底层。核心工具链均以eBPF或内核模块为底座,实现"无代理、低开销"的容器行为观测。
6.1 两大开源检测引擎
| 维度 | Falco | Tetragon |
|---|---|---|
| 发起方 | Sysdig发起的CNCF孵化项目,云原生运行时安全事实标准 | Isovalent(Cilium公司)开源,2022年发布 |
| 技术底座 | 内核模块或eBPF探针,采集syscall与K8s元数据 | 原生eBPF,深入内核(含L3-L7网络事件与进程级 enforcement) |
| 规则体系 | YAML规则(如检测到shell in容器、敏感文件读取、setuid、挖矿进程名) | CEL-based TracingPolicy:可按进程、文件、网络、capability使用精细定义,支持运行时阻断(kill) |
| 阻断能力 | 以检测+告警为主(可联动响应) | 原生支持"检测即阻断"(直接kill违规进程) |
6.2 关键检测场景与数据源映射
| 检测场景 | 观测信号 | 规则思路(示例) |
|---|---|---|
| 容器内反弹Shell | execve拉起bash/sh并建立网络连接 | Falco官方规则"Terminal shell in container"告警+网络连接关联 |
| 凭证窃取 | 读取/var/run/secrets/kubernetes.io/serviceaccount/token、云元数据169.254.169.254访问 | 敏感路径openat事件+目的IP白名单 |
| 挖矿与滥用 | 进程名/连接矿池域名、异常CPU | 进程名匹配+DNS查询审计+CPU异常联动 |
| 逃逸痕迹 | mount到宿主机路径、setuid执行、/proc/sys写操作 | mount syscall参数匹配hostPath+no-new-privileges未启用的容器 |
| 异常出网 | 非白名单外部连接(结合Cilium/Hubble) | namespace出网白名单+首次连接告警(学习模式) |
检测工程要点:①规则启用遵循"先audit计数、再告警、后阻断"三段灰度,避免误报淹没;②所有事件须关联K8s元数据(namespace、Pod、镜像、SA),否则无法定位责任面;③与API审计(第3页)联动:运行时行为异常+对应主体API行为异常的双重确认,可大幅降低误报。
本节参考来源(第4页)
Kubernetes官方文档——Pod Security Standards(三档标准完整条款):kubernetes.io/docs/concepts/security/pod-security-standards;Pod Security Admission使用指南:kubernetes.io(PSA使用)。
NSA & CISA《Kubernetes Hardening Guidance》v1.1(2022):Pod安全、容器加固、运行时防护章节。
NVD漏洞条目:CVE-2019-5736、CVE-2022-0492、CVE-2022-0811、CVE-2024-21626。
Falco官方文档与默认规则集:falco.org/docs;Tetragon官方文档:tetragon.io/docs。
gVisor官方文档:gvisor.dev/docs;Kata Containers官方文档:katacontainers.io;Firecracker:firecracker-microvm.github.io;Kubernetes RuntimeClass:kubernetes.io(RuntimeClass)。