在 Kubernetes 中,Pod Security Policy(PSP)是一组控制 Pod 运行时的安全策略。它通过定义一系列控制措施限制 Pod 运行时的权限和功能,以提高集群的安全性。
PSP 的主要作用是:
- 控制 Pod 运行的权限和功能,限制其访问集群的敏感资源。
- 要求 Pod 必须运行某些安全措施才能部署,如必须以非root用户运行。
- 实现基于策略的 Pod 安全管理。
PSP 定义包含许多控制项,主要包括:
- privileged:是否允许特权容器。
- hostPID/hostIPC/hostNetwork:是否允许与主机共享PID/IPC/Network。
- runAsUser/runAsGroup:要求Pod中的容器必须以某UID/GID运行。
- seLinux:要求SELinux必须开启或关闭。
- fsGroup:要求文件系统组必须是指定值。
- readOnlyRootFilesystem:要求容器必须使用只读根文件系统。
- volumes:允许和限制 Volume 的类型。
- allowPrivilegeEscalation:是否允许权限扩大。
- defaultAddCapabilities/requiredDropCapabilities:添加和删除的 Linux 功能。
- hostPorts:限制可以使用的主机端口。
PSP 的工作流程是:
- 管理员创建 PSP 策略,定义对 Pod 的访问控制。
- 集群启用 PSP Admission 控制器。
- 用户创建 Pod 时,PSP 控制器会校验 Pod 对象与集群中的 PSP 策略。
- 如果Pod违反任何策略中的规则,则无法创建成功。
- Pod 必须符合任一PSP策略才能创建成功。
例如,定义2个PSP策略:
- privileged 策略: 允许特权容器,主机共享和根文件系统可读写。
yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: privileged
spec:
privileged: true
allowPrivilegeEscalation: true
hostPID: true
hostIPC: true
hostNetwork: true
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
- restricted 策略:禁止特权和主机共享,要求非root用户和只读文件系统。
yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
readOnlyRootFilesystem: true
然后:
- 部署PSP控制器及两个策略。
- 用户创建的Pod如果要使用特权必须符合
privileged
策略。 - 用户创建的普通Pod必须符合
restricted
策略。 - 如果Pod违反所有策略,则无法成功创建。
所以总结来说,PSP的主要作用是实现基于策略的Pod安全管理,其主要特征是:
- 通过策略限制Pod的权限和功能。
- 要求Pod必须符合某策略才能部署运行。
- 包含许多详细的控制措施,如是否允许特权、要求必须运行非root用户等。
- 需要搭配PSP Admission 控制器一起使用。