更新时间:2024-01-24 GMT+08:00

PodSecurityPolicy配置

Pod安全策略(Pod Security Policy) 是集群级别的资源,它能够控制Pod规约中与安全性相关的各个方面。 PodSecurityPolicy对象定义了一组Pod运行时必须遵循的条件及相关字段的默认值,只有Pod满足这些条件才会被系统接受。

v1.17.17版本的集群默认启用Pod安全策略准入控制组件,并创建名为psp-global的全局默认安全策略,您可根据自身业务需要修改全局策略(请勿直接删除默认策略),也可新建自己的Pod安全策略并绑定RBAC配置。

  • 除全局默认安全策略外,系统为kube-system命名空间下的系统组件配置了独立的Pod安全策略,修改psp-global配置不影响kube-system下Pod创建。
  • PodSecurityPolicy在Kubernetes v1.21版本中被弃用,并在Kubernetes v1.25中被移除。您可以Pod安全性准入控制器(Pod Security Admission)作为PodSecurityPolicy的替代,详情请参见Pod Security Admission配置

修改全局默认Pod安全策略

修改全局默认Pod安全策略前,请确保已创建CCE集群,并且通过kubectl连接集群成功。

  1. 执行如下命令:

    kubectl edit psp psp-global

  2. 修改所需的参数,如表1

    表1 Pod安全策略配置

    配置项

    描述

    privileged

    启动特权容器。

    hostPID

    hostIPC

    使用主机命名空间。

    hostNetwork

    hostPorts

    使用主机网络和端口。

    volumes

    允许使用的挂载卷类型。

    allowedHostPaths

    允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声明允许挂载的主机路径前缀组。

    allowedFlexVolumes

    允许使用的指定FlexVolume驱动。

    fsGroup

    配置Pod中挂载卷使用的辅组ID。

    readOnlyRootFilesystem

    约束启动Pod使用只读的root文件系统。

    runAsUser

    runAsGroup

    supplementalGroups

    指定Pod中容器启动的用户ID以及主组和辅组ID。

    allowPrivilegeEscalation

    defaultAllowPrivilegeEscalation

    约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控制Setuid的使用,同时控制程序是否可以使用额外的特权系统调用。

    defaultAddCapabilities

    requiredDropCapabilities

    allowedCapabilities

    控制Pod中使用的Linux Capabilities。

    seLinux

    控制Pod使用seLinux配置。

    allowedProcMountTypes

    控制Pod允许使用的ProcMountTypes。

    annotations

    配置Pod中容器使用的AppArmor或Seccomp。

    forbiddenSysctls

    allowedUnsafeSysctls

    控制Pod中容器使用的Sysctl配置。

Pod安全策略开放非安全系统配置示例

节点池管理中可以为相应的节点池配置allowed-unsafe-sysctls,CCE从1.17.17集群版本开始,需要在Pod安全策略的allowedUnsafeSysctls字段中增加相应的配置才能生效,配置详情请参考表1

除修改全局Pod安全策略外,也可增加新的Pod安全策略,如开放net.core.somaxconn非安全系统配置,新增Pod安全策略示例参考如下:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  name: sysctl-psp
spec:
  allowedUnsafeSysctls:
  - net.core.somaxconn
  allowPrivilegeEscalation: true
  allowedCapabilities:
  - '*'
  fsGroup:
    rule: RunAsAny
  hostIPC: true
  hostNetwork: true
  hostPID: true
  hostPorts:
  - max: 65535
    min: 0
  privileged: true
  runAsGroup:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  volumes:
  - '*'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sysctl-psp
rules:
  - apiGroups:
      - "*"
    resources:
      - podsecuritypolicies
    resourceNames:
      - sysctl-psp
    verbs:
      - use

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: sysctl-psp
roleRef:
  kind: ClusterRole
  name: sysctl-psp
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io

恢复原始Pod安全策略

如果您已经修改默认Pod安全策略后,想恢复原始Pod安全策略,请执行以下操作。

  1. 创建一个名为policy.yaml的描述文件。其中,policy.yaml为自定义名称,您可以随意命名。

    vi policy.yaml

    描述文件内容如下。

    apiVersion: policy/v1beta1
    kind: PodSecurityPolicy
    metadata:
      name: psp-global
      annotations:
        seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
    spec:
      privileged: true
      allowPrivilegeEscalation: true
      allowedCapabilities:
        - '*'
      volumes:
        - '*'
      hostNetwork: true
      hostPorts:
        - min: 0
          max: 65535
      hostIPC: true
      hostPID: true
      runAsUser:
        rule: 'RunAsAny'
      seLinux:
        rule: 'RunAsAny'
      supplementalGroups:
        rule: 'RunAsAny'
      fsGroup:
        rule: 'RunAsAny'
     
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: psp-global
    rules:
      - apiGroups:
          - "*"
        resources:
          - podsecuritypolicies
        resourceNames:
          - psp-global
        verbs:
          - use
     
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: psp-global
    roleRef:
      kind: ClusterRole
      name: psp-global
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: Group
      name: system:authenticated
      apiGroup: rbac.authorization.k8s.io

  2. 执行如下命令:

    kubectl apply -f policy.yaml