Kubernetes(k8s)中如何通过PodSecurityPolicy限制容器的运行时权限?
mingri88:在Kubernetes中通过PodSecurityPolicy(PSP)限制容器运行时权限的核心实践包括以下步骤与经验: 权限控制: 禁止特权模式:设置privileged: false,避免容器获得宿主机内核权限。 限制Linux Capabilities:通过allowedCapabilities和requiredDropCapabilities删除高危能力(如SYS_ADMIN、NET_RAW),仅保留业务必要能力。 关闭权限提升:设置allowPrivilegeEscalation: false,防止子进程获得更高权限。 文件系统保护: 强制只读根文件系统:readOnlyRootFilesystem: true,结合EmptyDir挂载写入路径。 限制敏感挂载:通过allowedHostPaths屏蔽/proc、/dev等目录,避免容器逃逸。 用户与组策略: 禁止root用户:设置runAsUser: rule: MustRunAsNonRoot,强制容器以非root启动。 限制用户组范围:通过supplementalGroups和fsGroup定义允许的GID范围。 运行时隔离: 限制宿主机命名空间共享:禁用hostPID、hostIPC、hostNetwork,避免跨容器进程可见性。 控制卷类型:通过volumes字段仅允许业务必要的存储类型(如configMap、secret)。 实践中遇到的挑战: 兼容性问题:部分遗留应用依赖特权模式或特定Capability(如Java应用需NET_ADMIN),需通过风险评估后动态调整策略,或推动应用改造。 策略继承冲突:Init Container需临时高权限时,通过runtimeClassName隔离或拆分PSP策略,确保主容器仍受限制。 策略碎片化:多团队共用集群时,易出现PSP规则重复或冲突,需通过命名规范与自动化工具(如OPA)统一管理。 废弃替代风险:PSP在K8s 1.21后逐步废弃,需提前规划迁移至Pod Security Admission或Gatekeeper,采用enforce、audit、warn分级控制。 关键经验: 灰度生效:通过RBAC逐步绑定PSP到Namespace,监控拒绝事件,避免全局策略导致服务中断。 审计追踪:结合Falco或kube-audit日志监控异常Pod创建行为,并定期扫描集群中违反PSP的残留资源。 文档同步:将PSP约束纳入CI/CD准入检查,确保开发人员明确容器化要求,减少部署阶段摩擦。