核心是组合使用runAsNonRoot、runAsUser、allowPrivilegeEscalation:false和capabilities.drop["ALL"]四项配置:runAsNonRoot:true强制启动校验,runAsUser指定非零UID,allowPrivilegeEscalation:false禁用提权路径,capabilities.drop["ALL"]清空隐性特权。

直接禁用 root 权限并剥离其特权,核心是组合使用 runAsNonRoot、runAsUser、allowPrivilegeEscalation: false 和 capabilities.drop 四项配置。单靠某一项无法真正“剥离”——比如只设 runAsUser=1000 但不关提权,进程仍可能通过 exec 或 setuid 二进制文件重新获得高权限。
强制非 root 启动(第一道防线)
必须同时启用两个字段,缺一不可:
- runAsNonRoot: true —— Kubernetes 在启动前校验:若容器 entrypoint 以 UID 0 运行,直接拒绝启动(Pod 状态为 CreateContainerConfigError)
- runAsUser: <非零UID> —— 显式指定一个普通用户 ID(如 1001、65534),确保进程从一开始就在该 UID 下执行
⚠️ 注意:镜像内必须存在该 UID 对应的用户(/etc/passwd 中有记录),否则容器可能因无法切换用户而失败。推荐在构建镜像时提前创建非 root 用户,例如:RUN adduser -u 1001 -D appuser && usermod -aG wheel appuser
切断权限提升路径(关键加固)
即使以非 root 用户启动,仍可能通过 sudo、su、newgrp 或 setuid 程序提权。Kubernetes 提供原生防护:
-
allowPrivilegeEscalation: false —— 底层设置 Linux
no_new_privs标志,禁止任何子进程获取比父进程更高的权限(包括 execve 带 setuid 位的程序) - 该字段需放在 容器级 securityContext 中才生效(Pod 级不支持)
效果示例:即便容器里放了 /usr/bin/passwd(典型 setuid 二进制),执行时也会报错 Operation not permitted。
清空 Linux capabilities(移除隐性 root 特权)
默认容器继承约 14 个 capabilities(如 CAP_NET_RAW、CAP_SYS_ADMIN),它们是 root 权限的“碎片化体现”。剥离方法是:
- capabilities.drop: ["ALL"] —— 先彻底清空所有能力
- 再按需 add 少量必要能力(如需要绑定 80 端口就加
NET_BIND_SERVICE)
常见高危能力必须移除:NET_RAW(发原始包,用于扫描/攻击)、SYS_ADMIN(挂载/卸载文件系统、修改命名空间)、SETFCAP(修改其他程序 capability)。
辅助加固项(堵住旁路)
这些不是“剥离 root 特权”的直接手段,但能防止绕过:
- readOnlyRootFilesystem: true —— 阻止向 /bin、/sbin 写入恶意二进制或覆盖关键工具(如 ls、ps)
- privileged: false —— 显式关闭特权模式(虽然默认就是 false,但显式声明可防误配)
-
seccompProfile: { type: RuntimeDefault } —— 过滤危险系统调用(如
ptrace、mount),进一步限制逃逸可能性
不复杂但容易忽略

















