在K8S中,PodSecurityPolicy机制能实现哪些安全策略?
在 Kubernetes 中,PodSecurityPolicy (PSP) 是一种已弃用(Kubernetes v1.25 起正式移除)的安全机制,但它曾是实现集群安全加固的核心工具。其核心目标是通过定义强制性的安全策略,限制 Pod 及其容器的权限,减少攻击面。以下是它能实现的关键安全策略,用通俗场景解释:
一、核心安全策略分类及实现
1. 权限控制(防止特权升级)
- 策略示例:
privileged: false # 禁止容器以特权模式运行(相当于root) allowPrivilegeEscalation: false # 禁止进程获取更高权限(如sudo) - 小白理解:
❌ 禁止容器变成“超人”(特权模式),防止黑客控制容器后获得宿主机权限。
🔒 比如:禁止容器内部执行sudo rm -rf /这类危险操作。
2. 用户与组控制(最小权限原则)
- 策略示例:
runAsUser: rule: 'MustRunAsNonRoot' # 容器必须以非root用户运行 supplementalGroups: ranges: [{min: 1000, max: 2000}] # 限制附加用户组范围 - 小白理解:
👤 强制容器以“普通员工”身份运行(非root),而非“公司老板”。
📁 限制容器只能访问特定权限的文件(如仅允许读写用户组ID 1000~2000的文件)。
3. 文件系统保护(只读/敏感路径隔离)
- 策略示例:
readOnlyRootFilesystem: true # 强制根文件系统只读 volumes: # 仅允许挂载安全类型的存储卷 - 'configMap' - 'emptyDir' - 'persistentVolumeClaim' - 小白理解:
📄 将容器的“硬盘”设为只读模式,黑客无法篡改系统文件。
🔒 禁止挂载高危目录(如/proc或宿主机路径),防止逃逸。
4. 内核能力限制(裁剪危险系统调用)
- 策略示例:
requiredDropCapabilities: # 强制移除危险能力 - 'NET_RAW' # 禁止伪造网络包(防ARP欺骗) - 'SYS_ADMIN' # 禁止执行系统管理操作 allowedCapabilities: [] # 禁止添加任何额外能力 - 小白理解:
✂️ 砍掉容器的“危险超能力”(如直接操作网络设备或挂载磁盘)。
🛡️ 类似禁止普通员工使用黑客工具(如抓包软件)。
5. 主机命名空间隔离(禁止访问宿主机资源)
- 策略示例:
hostNetwork: false # 禁止共享宿主机网络命名空间 hostPID: false # 禁止查看宿主机进程列表 hostIPC: false # 禁止通过IPC访问宿主机 - 小白理解:
🌐 禁止容器“偷听”宿主机的网络流量(如窃听其他Pod)。
🔍 禁止容器查看宿主机的“任务管理器”(进程列表),防止信息泄露。
6. 容器资源访问限制
- 策略示例:
seLinux: rule: 'RunAsAny' # 强制使用SELinux安全上下文 apparmorProfile: 'docker-default' # 限制AppArmor配置文件 - 小白理解:
🚧 给容器穿上“防护服”(SELinux/AppArmor),限制越界行为。
二、PSP 的工作流程(剧本版)
- 用户创建 Pod:
👶 小明提交一个pod.yaml到 Kubernetes。 - PSP 控制器拦截:
🚓 保安(PSP Admission Controller)检查 Pod 是否符合公司安全规定(PSP 策略)。 - 策略匹配与验证:
- ✅ 符合策略 → 放行 Pod 创建。
- ❌ 不符合策略 → 直接拒绝并报错(如 "容器不能以root运行")。
- 强制执行:
🔐 即便 Pod 声明了危险配置(如privileged: true),PSP 也会覆盖为安全值。
三、PSP 的替代方案(现代安全实践)
由于 PSP 已被弃用,推荐迁移到以下机制:
1. Pod Security Admission (PSA)
- Kubernetes 原生替代品(v1.23+ 内置)。
- 定义三种安全等级:
privileged(宽松) → 允许rootbaseline(推荐) → 禁止已知风险(如特权容器)restricted(严格) → 全限制(非root+只读文件系统)
- 示例:
apiVersion: v1 kind: Namespace metadata: name: my-app labels: pod-security.kubernetes.io/enforce: baseline # 在该命名空间强制基线策略
2. OPA/Gatekeeper
- 通过策略引擎实现更灵活的安全规则(如自定义复杂条件)。
- 示例策略:
# 禁止容器挂载宿主机路径 violation[{"msg": msg}] { volume := input.spec.volumes[_] volume.hostPath != null msg := "挂载宿主机路径被禁止!" }
3. 安全运行时(gVisor/Kata Containers)
- 隔离容器与内核:
- gVisor:用用户空间沙箱拦截系统调用。
- Kata:每个 Pod 独占一个轻量级虚拟机。
四、PSP 的遗产与教训
| 策略目标 | PSP 实现方式 | 现代替代方案 |
|---|---|---|
| 禁止特权容器 | privileged: false |
PSA 的 baseline 等级 |
| 强制非root用户 | runAsNonRoot: true |
PSA 的 restricted 等级 |
| 限制挂载敏感卷 | volumes 白名单 |
Gatekeeper + OPA 策略 |
| 裁剪Linux Capabilities | requiredDropCapabilities |
PSA + RuntimeDefault 配置 |
💡 迁移建议:
- 升级到 Kubernetes v1.25+ 的集群,停用 PSP。
- 使用 Pod Security Admission 快速落地基础策略。
- 复杂场景用 Gatekeeper+OPA 定制策略(如“禁止特定镜像”)。
- 关键负载部署 gVisor/Kata 增强隔离性。
小白总结
- PodSecurityPolicy (PSP) 曾是 Kubernetes 的“安全警察”,负责:
- 🚫 禁止容器获得过高权限(如root)。
- 📁 锁定文件系统(如只读模式)。
- 🔗 隔离容器与宿主机(如禁止共享进程空间)。
- 现状:PSP 已退役,改用:
- PSA(内置三档安全等级)。
- Gatekeeper(自定义高级规则)。
- 核心原则:
✅ 最小权限 → 容器只给必要权限!
✅ 纵深防御 → 层层设卡,即便一层被攻破仍有保护!
浙公网安备 33010602011771号