kubernetes CKS 4.3 Pod安全策略(PSP)
时间:2023-10-12 08:37:00
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 --resourcepodsecuritypolicy --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/