podSecurityPolicy简介:
Kubernetes中pod部署时重要的安全校验手段,能够有效地约束应用运行时行为安全。使用PSP对象定义一组pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这些条件才会被K8s接受。
PodSecurityPolicy 在 Kubernetes v1.21 中被弃用, 在 Kubernetes v1.25 中被移除。
pod安全策略限制维度
配置项 | 描述 |
privileged | 启动特权容器。 |
hostPID,hostIPC | 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配置 |
PSP的启用
Pod安全策略实现为一个准入控制器,默认没有启用,当启用后会强制实施 Pod安全策略,没有满足的Pod将无法创建。因此,建议在启用PSP之前先添加 策略并对其授权。
启用Pod安全策略:
vi/etc/kubernetes/manifests/kube-apiserver.yaml
...
- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy
...
systemctl restart kubelet
PSP流程
![](https://i-blog.csdnimg.cn/blog_migrate/3a4375eccbd39664ed50ae94128f7d02.png)
用户使用SA (ServiceAccount)创建了一个Pod,K8s会先验证这个SA是否可以访问PSP资源权限,如果可以进一步验证Pod配置是否满足PSP规则,任 意一步不满足都会拒绝部署。
因此,需要实施需要有这几点:管理员不受限制
• 创建SA服务账号
• 该SA需要具备创建对应资源权限,例如创建Pod、Deployment
• SA使用PSP资源权限:创建Role,使用PSP资源权限,再将SA绑定Role
示例1:禁止创建特权模式的Pod
# 创建SA
kubectl create serviceaccount aliang
# 将SA绑定到系统内置Role
kubectl create rolebinding aliang--clusterrole=edit --serviceaccount=default:aliang
#通过sa创建资源
kubectl--as=system:serviceaccount:default:aliang create deployment web1 --image=nginx
![](https://i-blog.csdnimg.cn/blog_migrate/664e284301e6af3b36e65c6ae85792b1.png)
启用psp后即使无策略,默认禁止创建pod,必须配置psp策略
![](https://i-blog.csdnimg.cn/blog_migrate/3e922dd84b21b681a434bcd655c13b4a.png)
#创建策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-example
spec:
privileged: false #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
# 创建使用PSP权限的Role
【】kubectl create role psp:unprivileged--verb=use --resource=podsecuritypolicy --resource-name=psp-example
# 将SA绑定到Role
【】kubectl create rolebindingaliang:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:aliang
【】kubectl--as=system:serviceaccount:default:aliang run nginx4 --image=nginx
![](https://i-blog.csdnimg.cn/blog_migrate/6b3fb3d41f7cfeef1a833bfb8dd23e4a.png)
创建deploy
![](https://i-blog.csdnimg.cn/blog_migrate/9e5e760c13dfaaac462b9bb1c362d252.png)
无法创建,创建deploy成功replicaset无法成功,但replicaset无法成功,因为创建deploy会默认创建replicaset会默认使用default这个sa,需要给这个sa增加psp的授权
2个方案 1deploy创建时指定使用的服务账号sa 2将default这个sa绑定到psp上
kubectl create rolebinding default:psp:unprivileged--role=psp:unprivileged --serviceaccount=default:default
尝试创建特权pod,无法创建。因为psp策略限制了特权容器
【】cat cap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-psp2
spec:
containers:
- name: test
image: busybox
command:
- sleep
- 24h
securityContext:
privileged: true
【】kubectl apply -f cap.yaml
![](https://i-blog.csdnimg.cn/blog_migrate/9d074a18a66086422dc7c8ba1b986a6e.png)
示列2:禁止没指定普通用户运行的容器(runAsUser)
意思是所有创建的pod必须指定普通用户才能运行
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-example
spec:
privileged: false #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: MustRunAsNonRoot
fsGroup:
rule: RunAsAny
volumes:
- '*'
创建时不指定用户账号则会报
![](https://i-blog.csdnimg.cn/blog_migrate/9d942a314c9755f16e30bea041ffd620.png)