
# PodSecurityPolicy配置
Pod安全策略（Pod Security Policy） 是集群级别的资源，它能够控制Pod规约中与安全性相关的各个方面。 [PodSecurityPolicy](https://kubernetes.io/zh-cn/docs/concepts/security/pod-security-policy/)对象定义了一组Pod运行时必须遵循的条件及相关字段的默认值，只有Pod满足这些条件才会被系统接受。
v1.17.17版本的集群默认启用Pod安全策略准入控制组件，并创建名为**psp-global**的全局默认安全策略，您可根据自身业务需要修改全局策略（请勿直接删除默认策略），也可新建自己的Pod安全策略并绑定RBAC配置。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
- 除全局默认安全策略外，系统为kube-system命名空间下的系统组件配置了独立的Pod安全策略，修改psp-global配置不影响kube-system下Pod创建。
- PodSecurityPolicy在Kubernetes v1.21版本中被弃用，并在Kubernetes v1.25中被移除，因此本章节仅适用于v1.25以下版本的集群使用。您可以使用Pod安全性准入控制器（Pod Security Admission）作为PodSecurityPolicy的替代，详情请参见[Pod Security Admission配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0466.html)。
 
#### 修改全局默认Pod安全策略
修改全局默认Pod安全策略前，请确保已创建CCE集群，并且通过kubectl连接集群成功。
1. 执行如下命令： 
   **kubectl edit psp psp-global**
   
   
2. 修改所需的参数，如[表1]。
   
    表1Pod安全策略配置 
   | 配置项                                                                                                                             | 描述                                                                                                                                                                                                                       |
   |:---|:---|
   | privileged                                                                                                                      | 启动特权容器。特权容器可访问节点上的所有设备，请谨慎开启。以GPU场景为例，即使容器仅申请部分GPU，启用特权容器后也会绕过资源限制，能够使用所在节点上的全部GPU卡。 更多信息，请参见[Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/)。 |
   | 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**
   
   
 
