Kubernetes 中的 Pod Security Policy 是什么?

在 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 的工作流程是:

  1. 管理员创建 PSP 策略,定义对 Pod 的访问控制。
  2. 集群启用 PSP Admission 控制器。
  3. 用户创建 Pod 时,PSP 控制器会校验 Pod 对象与集群中的 PSP 策略。
  4. 如果Pod违反任何策略中的规则,则无法创建成功。
  5. Pod 必须符合任一PSP策略才能创建成功。

例如,定义2个PSP策略:

  1. 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'
  1. 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  

然后:

  1. 部署PSP控制器及两个策略。
  2. 用户创建的Pod如果要使用特权必须符合privileged策略。
  3. 用户创建的普通Pod必须符合restricted策略。
  4. 如果Pod违反所有策略,则无法成功创建。

所以总结来说,PSP的主要作用是实现基于策略的Pod安全管理,其主要特征是:

  1. 通过策略限制Pod的权限和功能。
  2. 要求Pod必须符合某策略才能部署运行。
  3. 包含许多详细的控制措施,如是否允许特权、要求必须运行非root用户等。
  4. 需要搭配PSP Admission 控制器一起使用。