# 心智模型
攻击者容易利用特权容器从受限容器环境侵入宿主机操作系统。
# 🛠️ 实操手册:逃逸演示与防御配置
# 第一阶段:演示特权容器逃逸(危险操作,仅限实验)
我们将演示攻击者如何利用特权容器直接访问宿主机的磁盘。
- 部署一个特权 Pod: 注意
privileged: true这个开关。
YAML
apiVersion: v1
kind: Pod
metadata:
name: privileged-escape-demo
spec:
containers:
- name: attacker-container
image: alpine
command: ["sh", "-c", "sleep 3600"]
securityContext:
privileged: true # 开启特权模式
- 执行逃逸攻击: 特权容器可以看到宿主机的设备文件。我们可以直接挂载宿主机的根磁盘。
Bash
## 进入容器
kubectl exec -it privileged-escape-demo -- sh
## 在容器内,查看宿主机的磁盘设备(通常是 /dev/sda1 或 /dev/nvme0n1p1)
fdisk -l
## 创建一个挂载点并挂载宿主机根目录
mkdir /host_root
mount /dev/sda1 /host_root # 请根据 fdisk 结果替换设备名
## 现在,你已经在容器里看到了宿主机的所有敏感文件
ls /host_root/etc/shadow
ls /host_root/root/.ssh/
结论:一旦开启
privileged: true,容器与宿主机之间已无安全可言。
# 第二阶段:配置安全上下文限制权限提升
仅仅不开启 privileged 就够了吗?不够。 很多进程会利用 setuid(如 sudo 命令)在运行时尝试获取更高级别的权限。我们需要通过 allowPrivilegeEscalation: false 封死这条路。
- 编写安全加固的 Pod 配置:
YAML
apiVersion: v1
kind: Pod
metadata:
name: hardened-pod
spec:
containers:
- name: safe-container
image: alpine
command: ["sh", "-c", "sleep 3600"]
securityContext:
# 1. 明确禁止特权模式
privileged: false
# 2. 禁止进程通过 setuid 等方式获取比父进程更高的权限
allowPrivilegeEscalation: false
# 3. 配合之前的实验,以非 root 用户运行
runAsNonRoot: true
runAsUser: 1000
# 🔍 核心参数深度解析
allowPrivilegeEscalation (禁止权限提升)
- 它是干什么的? 它控制
no_new_privs内核标志。如果设为false,即使一个程序设置了SUID位(比如一个只有 root 才能跑的程序),普通用户也无法通过它获得 root 权限。 - 为什么重要? 很多提权漏洞(Exploit)依赖于在容器内通过特殊手段获取 root。关掉这个开关,就砍掉了攻击者的“阶梯”。
readOnlyRootFilesystem (只读根文件系统)
-
建议配合使用:
YAML
securityContext: readOnlyRootFilesystem: true -
效果:容器的整个根目录变成只读。如果黑客想下载一个木马脚本到
/tmp或/bin,会直接被内核拦截。