Kubernetes v1.25+ 应启用 PodSecurity Admission 控制器,默认拒绝特权配置:通过命名空间标签 pod-security.kubernetes.io/enforce=restricted 拦截 privileged: true、hostNetwork、危险 capabilities 等高危行为,实现默认拒绝、零容忍。

不能也不应该强制推行“全网容器特权模式”的硬性禁令——因为特权模式(--privileged)本身就是高危配置,安全目标是**全面禁止**,而非“推行”。你真正需要的是:在集群入口处用 Admission Controller 拦截所有含特权意图的部署请求,实现“默认拒绝、零容忍”。
启用 PodSecurity Admission(Kubernetes v1.25+ 官方推荐)
这是当前最轻量、原生、无需额外组件的方案:
- 确保集群版本 ≥ v1.25,且
PodSecurity准入插件已启用(默认开启) - 在命名空间级别设置强制策略:
kubectl label ns <ns-name> pod-security.kubernetes.io/enforce=restricted -
restricted级别会自动拒绝:
•securityContext.privileged: true
•securityContext.capabilities.add包含ALL或SYS_ADMIN等危险能力
•securityContext.hostPID/hostIPC/hostNetwork: true
• 挂载/proc/sys、/dev全路径等敏感宿主机路径
用 Kyverno 编写精准拦截策略(增强可观测性与审计)
适用于需自定义提示信息、记录违规详情或跨多租户统一管控的场景:
- 部署 Kyverno 后,创建如下策略(拒绝所有特权 Pod):
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: block-privileged-pods
spec:
validationFailureAction: enforce
rules:
- name: deny-privileged
match:
any:
- resources:
kinds: [Pod]
validate:
message: "Privileged mode is forbidden. Remove 'securityContext.privileged: true' or '--privileged' flag."
pattern:
spec:
containers:
- securityContext:
privileged: false
- 同时可追加规则拦截:
--cap-add=ALL、挂载/dev/sda、使用hostPath指向/proc等典型绕过手法 - 策略生效后,任何违规 YAML 提交将被 API Server 直接拒绝,并返回清晰错误信息
配套加固:Docker daemon 层兜底限制
针对可能绕过 Kubernetes 的裸 Docker 场景(如 CI 节点直连 dockerd),需在宿主机层面设防:
- 编辑
/etc/docker/daemon.json,加入:
{
"userns-remap": "default",
"live-restore": false,
"default-ulimits": {
"nofile": {"Name": "nofile", "Hard": 65536, "Soft": 65536}
}
}
- 重启 Docker:
sudo systemctl restart docker - 该配置使所有容器默认运行在非 root UID 映射下,即使误启特权容器,其 root 也仅对应宿主机低权限用户,大幅压缩逃逸危害面
验证与持续监控
策略上线后必须闭环验证:
- 手动测试:
kubectl run pwn --image=alpine --privileged --command -- sleep 3600应立即报错 - 检查审计日志:
kubectl logs -n kyverno kyverno-xxxxx | grep "block-privileged" - 集成 Falco 或 eBPF 工具,对已运行 Pod 实时检测
cap_sys_admin使用、/dev/mem访问等异常行为,形成运行时兜底

















