4.3.1 简述
PodSecurityPolicy(简称PSP):Kubernetes中Pod部署时重要的安全校验手段,能够 有效地约束应用运行时行为安全。
使用PSP对象定义一组Pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这 些条件才会被K8s接受。

Pod安全策略实现为一个准入控制器,默认没有启用,当启用后会强制实施 Pod安全策略,没有满足的Pod将无法创建。因此,建议在启用PSP之前先添加 策略并对其授权。
启用Pod安全策略:
vi /etc/kubernetes/manifests/kube-apiserver.yaml
...
- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy
...
systemctl restart kubelet
用户使用SA (ServiceAccount)创建了一个Pod,K8s会先验证这个SA是否 可以访问PSP资源权限,如果可以进一步验证Pod配置是否满足PSP规则,任 意一步不满足都会拒绝部署。 因此,需要实施需要有这几点:
• 创建SA服务账号
• 该SA需要具备创建对应资源权限,例如创建Pod、Deployment
• SA使用PSP资源权限:创建Role,使用PSP资源权限,再将SA绑定Role

4.3.2 示例1:禁止创建特权模式的Pod
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-example
spec:
privileged: false # 不允许特权Pod
# 下面是一些必要的字段
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
4.3.3 示例1:禁止创建特权模式的Pod
# 创建SA
kubectl create serviceaccount aliang
# 将SA绑定到系统内置Role
kubectl create rolebinding aliang --clusterrole=edit --serviceaccount=default:aliang
# 创建使用PSP权限的Role
kubectl create role psp:unprivileged --verb=use --resource=podsecuritypolicy --resource-name=psp-example
# 将SA绑定到Role
kubectl create rolebinding aliang:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:aliang
4.3.4 示例2:禁止没指定普通用户运行的容器(runAsUser)
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-example
spec:
privileged: false # 不允许特权Pod
# 下面是一些必要的字段
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: MustRunAsNonRoot
fsGroup:
rule: RunAsAny
volumes:
- '*'
4.3.5 CKS考题分析

解读:
- 创建一个名为 restrict-policy 的 PodSecurityPolicy,防止创建特权 Pod
- 创建一个名为 restrict-access-role 的 ClusterRole 能够使用 PSP restrict-policy
- 在 staging 命名空间创建一个名为 psp-denial-sa 的 ServiceAccount
- 最后,创建一个名为 dany-access-bind 的 ClusterRoleBinding,绑定 ClusterRole
restrict-access-role 到 ServiceAccount psp-denial-sa
解题:
# 启用 PSP 准入控制器
vi /etc/kubernetes/manifests/kube-apiserver.yaml
- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy
启用后,发觉无法创建pod:
[root@k8s21-master01 ~]# kubectl run nginx0714 --image=nginx
Error from server (Forbidden): pods "nginx0714" is forbidden: PodSecurityPolicy: no providers available to validate pod request
创建psp规则:
[root@k8s21-master01 ~]# vi psp.yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restrict-policy
spec:
privileged: false # 不允许提权的 Pod!
# 以下内容负责填充一些必需字段。
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
[root@k8s21-master01 ~]#kubectl apply -f psp.yaml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/restrict-policy created
再创建pod,发觉可以创建了:
[root@k8s21-master01 ~]# kubectl run nginx0714 --image=nginx
pod/nginx0714 created
创建一个clusterrole绑定psp
kubectl create clusterrole restrict-access-role --verb=use --resource=psp --
resource-name=restrict-policy
创建sa账号:
kubectl create ns staging #考试不用创建
kubectl create sa psp-denial-sa -n staging
创建…绑定sa
kubectl create clusterrolebinding dany-access-bind --clusterrole=restrict-access-role --serviceaccount=staging:psp-denial-sa
验证:
kubectl --as=system:serviceaccount:staging:psp-denial-sa get pods -n staging
社区官方参考文档: https://kubernetes.io/zh-cn/docs/concepts/security/pod-security-policy/