在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范围。
- 禁止root用户:设置
-
运行时隔离:
- 限制宿主机命名空间共享:禁用
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准入检查,确保开发人员明确容器化要求,减少部署阶段摩擦。