kubernetes CKS 4.3 Pod安全策略(PSP)

本文详细介绍了Kubernetes中的PodSecurityPolicy(PSP),如何定义和启用策略来确保Pod安全。通过实例展示了如何创建PSP、配置SA和Role,以及避免特权Pod和指定用户运行容器。阅读以掌握在K8s中实施安全策略的步骤和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.3.1 简述

PodSecurityPolicy(简称PSP):Kubernetes中Pod部署时重要的安全校验手段,能够 有效地约束应用运行时行为安全。
使用PSP对象定义一组Pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这 些条件才会被K8s接受。
![image.png](https://img-blog.csdnimg.cn/img_convert/4bc6eb9e8b13d151f7eeeceb29fa6c65.png#clientId=u1f958e2d-ca55-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=660&id=u565c3ebd&margin=[object Object]&name=image.png&originHeight=660&originWidth=1099&originalType=binary&ratio=1&rotation=0&showTitle=false&size=219457&status=done&style=none&taskId=udd7cc165-880c-411e-b5f1-5ecfbea005b&title=&width=1099)

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

![image.png](https://img-blog.csdnimg.cn/img_convert/ad1880aced8551754c163e529fd162a1.png#clientId=u1f958e2d-ca55-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=668&id=u756c9748&margin=[object Object]&name=image.png&originHeight=668&originWidth=589&originalType=binary&ratio=1&rotation=0&showTitle=false&size=155512&status=done&style=none&taskId=ufb0fb5c5-5689-4dc7-b5ee-08870ca7adc&title=&width=589)

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考题分析

![image.png](https://img-blog.csdnimg.cn/img_convert/76f341a4871f1bca595baf3808337256.png#clientId=ua4a1bba0-7db3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=511&id=u5f96cba8&margin=[object Object]&name=image.png&originHeight=511&originWidth=778&originalType=binary&ratio=1&rotation=0&showTitle=false&size=209244&status=done&style=none&taskId=u1cf0e239-85e6-4988-bde3-3a84268b4f4&title=&width=778)

解读:

  1. 创建一个名为 restrict-policy 的 PodSecurityPolicy,防止创建特权 Pod
  2. 创建一个名为 restrict-access-role 的 ClusterRole 能够使用 PSP restrict-policy
  3. 在 staging 命名空间创建一个名为 psp-denial-sa 的 ServiceAccount
  4. 最后,创建一个名为 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值