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连接集群成功。
- 执行如下命令:
kubectl edit psp psp-global
- 修改所需的参数,如表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安全策略,请执行以下操作。
- 创建一个名为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
- 执行如下命令:
kubectl apply -f policy.yaml