课题研究 云安全与容器安全 子课题02 · 第04页 / 共8页
02子课题 · 容器与Kubernetes安全

容器与Kubernetes安全第04页:Pod安全标准与运行时防护

容器与宿主机共享内核的本质,决定了运行时安全必须"假设逃逸可能、限制逃逸收益、检测逃逸行为"三位一体。本页从Linux容器隔离机制的底层原理(命名空间、cgroups、capabilities、seccomp、LSM)讲起,系统解析Pod Security Standards三档标准的每一条要求及其拦截的已知逃逸路径;梳理CVE-2019-5736、CVE-2022-0492、CVE-2022-0811、CVE-2024-21626等逃逸漏洞的共性与防护映射;对比gVisor、Kata Containers等沙箱运行时的隔离强度与性能代价;最后给出基于Falco与Tetragon的运行时行为检测方案。

Pod Security StandardsseccompcapabilitiesAppArmorSELinux容器逃逸gVisorKata ContainersFalcoTetragoneBPFRuntimeClass研究状态:研究中
所属专题云安全与容器安全 › 子课题02 容器与Kubernetes安全
目标受众平台工程、安全运营、运行时研发与检测工程人员
全文结构隔离机制 → PSS三档 → 逃逸谱系 → 沙箱选型 → 行为检测

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 关键差异速查

字段BaselineRestricted
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-21626runc在容器进程替换/工作目录处理上的文件描述符与路径处理缺陷,使容器内进程可触及宿主机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 两大开源检测引擎

维度FalcoTetragon
发起方Sysdig发起的CNCF孵化项目,云原生运行时安全事实标准Isovalent(Cilium公司)开源,2022年发布
技术底座内核模块或eBPF探针,采集syscall与K8s元数据原生eBPF,深入内核(含L3-L7网络事件与进程级 enforcement)
规则体系YAML规则(如检测到shell in容器、敏感文件读取、setuid、挖矿进程名)CEL-based TracingPolicy:可按进程、文件、网络、capability使用精细定义,支持运行时阻断(kill)
阻断能力以检测+告警为主(可联动响应)原生支持"检测即阻断"(直接kill违规进程)

6.2 关键检测场景与数据源映射

检测场景观测信号规则思路(示例)
容器内反弹Shellexecve拉起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页)

[1]

Kubernetes官方文档——Pod Security Standards(三档标准完整条款):kubernetes.io/docs/concepts/security/pod-security-standards;Pod Security Admission使用指南:kubernetes.io(PSA使用)。

[2]

NSA & CISA《Kubernetes Hardening Guidance》v1.1(2022):Pod安全、容器加固、运行时防护章节。

[4]

Falco官方文档与默认规则集:falco.org/docs;Tetragon官方文档:tetragon.io/docs。

[5]

gVisor官方文档:gvisor.dev/docs;Kata Containers官方文档:katacontainers.io;Firecracker:firecracker-microvm.github.io;Kubernetes RuntimeClass:kubernetes.io(RuntimeClass)。