锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

kubernetes CKS 4.3 Pod安全策略(PSP)

时间:2023-10-12 08:37:00 s21血氧传感器

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

![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/

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章