必须禁用--privileged,因其绕过全部隔离机制、等同授予宿主机root权限;应改用细粒度控制:按需添加capabilities、精确挂载设备、强制非root运行、启用userns-remap,并辅以只读根文件系统、镜像扫描、策略拦截与运行时监控。

在Kubernetes中配置Docker容器的特权模式,核心不是“开或不开”,而是用细粒度控制替代--privileged——它绕过全部隔离机制,等同于把宿主机root权限直接交给容器。真正可行的做法是:禁用特权模式,再按最小必要原则补足权限。
禁用privileged: true,改用capabilities精准授权
特权模式默认开启全部Linux能力(如CAP_SYS_ADMIN、CAP_NET_RAW),极易被利用逃逸。应显式禁用所有能力后,仅添加真实所需项:
- 绑定80/443端口 →
cap-add: NET_BIND_SERVICE - 配置网络接口(如ip link)→
cap-add: NET_ADMIN,但避免同时加cap-add: SYS_ADMIN - 禁止使用
cap-add: ALL或cap-add: SYS_MODULE,这两项已接近特权模式风险水位
限制设备访问,不挂载全/dev
特权模式会自动暴露/dev下所有设备,包括/dev/sda、/dev/mem等高危路径。安全做法是只挂必要设备:
- GPU计算 →
--device /dev/nvidia0:/dev/nvidia0 - USB通信 →
--device /dev/bus/usb:/dev/bus/usb - 禁止写法:
--device /dev、--privileged、或未声明securityContext.devicePrivilege时放行全部设备
强制非root运行 + 用户命名空间映射
即使容器内UID为0,也不应等于宿主机root。双层防护更可靠:
- Dockerfile中固定用户:
USER 1001,并用COPY --chown=1001:1001确保文件归属 - K8s Pod中声明:
runAsUser: 1001+runAsNonRoot: true - 集群级加固:在
/etc/docker/daemon.json启用"userns-remap": "default",使容器内root映射为宿主机上无特权UID(如100000)
加固运行时行为,不止于启动参数
权限配得再细,也需防御运行时异常行为:
- 根文件系统设为只读:
readOnlyRootFilesystem: true,配合tmpfs挂载/tmp供临时写入 - 镜像扫描前置:
trivy image your-image检查SUID二进制、硬编码密钥、过期基础镜像 - K8s策略拦截:
Kyverno或OPA/Gatekeeper拒绝含privileged: true或cap-add: SYS_ADMIN的YAML提交 - 运行时监控:
Falco检测mount、ptrace、module_load等敏感调用并告警











