pod安全策略PSP-1

平时我们创建pod的时候,对pod是没什么限制的,可以创建特权pod、也可以使用任何类型的卷。但有时我们需要对要创建的pod做一些限制,比如不允许创建特权pod,不允许在pod里使用hostNetwork选项等,这时可以使用PSP来限制(自k8s1.25开始就被取消了)。PSP来自红帽openshift的SCC。
本练习所涉及的yaml都放在demo5目录里,先创建demo5目录。

root@vms61:~# mkdir demo5 ; cd demo5
root@vms61:~/demo5# 

默认情况下并没有启用PSP,通过如下方式启用PSP。
编辑/etc/kubernetes/manifests/kube-apiserver.yaml,把

- --enable-admission-plugins=NodeRestriction 修改为
- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy

保存退出之后,重启kubelet。

当启用了PSP之后,不管哪个用户(包括管理员用户)在创建pod时都要先访问PSP规则,然后再判断能否创建出来pod。
先查看当前PSP规则。

root@vms61:~/demo5# kubectl get psp
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
No resources found
root@vms61:~/demo5#

现在不存在任何的PSP规则,创建pod1.yaml内容如下。

root@vms61:~/demo5# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 1000000"]
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
root@vms61:~/demo5# 

下面创建pod1。

root@vms61:~/demo5# kubectl apply -f pod1.yaml 
Error from server (Forbidden): error when creating "pod1.yaml": pods "pod1" is forbidden: PodSecurityPolicy: no providers available to validate pod request
root@vms61:~/demo5# 

pod1创建失败了,为什么呢?前面讲启动PSP之后要创建pod的话需要先访问PSP规则,但是现在都没有任何的PSP规则。如同要做某件事需要先征得领导的同意才行,但是现在都没领导,所以这事就没法执行下去,如下图。

file

下面创建名字为mypsp1的psp规则,创建mypsp1.yaml内容如下:

root@vms61:~/demo5# cat psp1.yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: mypsp1
spec:
  privileged: false  #这条的意思是不允许创建特权pod
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'
root@vms61:~/demo5# 

在这个PSP

root@vms61:~/demo5# kubectl apply -f mypsp1.yaml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy
```/mypsp1 created
root@vms61:~/demo5#
现在再次使用管理员用户创建pod1进行测试。
```shell
root@vms61:~/demo5# kubectl apply -f pod1.yaml 
pod/pod1 created
root@vms61:~/demo5# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          3s
root@vms61:~/demo5#

因为pod1里不包括特权属性,所以是可以创建出来的,删除pod1.

root@vms61:~/demo5# kubectl delete  pod pod1
pod "pod1" deleted
root@vms61:~/demo5#

那么使用lduan用户尝试创建pod1。

root@vms61:~/demo5# kuser apply -f pod1.yaml 
Error from server (Forbidden): error when creating "pod1.yaml": pods "pod1" is forbidden: PodSecurityPolicy: unable to admit pod: []
root@vms61:~/demo5# 

发现lduan用户创建不了,这是为何?因为lduan虽然具备创建pod的权限,

root@vms61:~/demo5# kubectl get clusterrolebinding -o wide | grep lduan
cbind1                                  ClusterRole/crole1                       21h   lduan
root@vms61:~/demo5# kubectl describe clusterrole crole1 | tail -n +6
  ---------  -----------------  --------------  -----
  pods       []                 []              [get list create delete]
root@vms61:~/demo5#

但是他根本没有访问mypsp1的权限。即连访问领导的权限都没有,自然不能得到领导的回应,如下图。
file

所以首先我们需要让lduan能够具备访问mypsp1的权限,首先创建一个名字为crole2的集群角色,这个角色可以访问名字为mypsp1的psp规则。

root@vms61:~/demo5# kubectl create clusterrole crole2 --verb=use --resource=psp --resource-name=mypsp1
clusterrole.rbac.authorization.k8s.io/crole2 created
root@vms61:~/demo5#

注:这里如果没有加--resource-name=mypsp1的话,则crole2具备访问所有psp的权限。

然后把把这个集群角色绑定给lduan用户。

root@vms61:~/demo5# kubectl create clusterrolebinding cbind2 --clusterrole=crole2 --user=lduan
clusterrolebinding.rbac.authorization.k8s.io/cbind2 created
root@vms61:~/demo5#

这样lduan用户就可以访问到mypsp1了,如果有多个psp规则的话,需要为
file

然后再次使用lduan用户创建pod1,验证能创建之后删除此pod。

root@vms61:~/demo5# kuser apply -f pod1.yaml 
pod/pod1 created
root@vms61:~/demo5# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          5s
root@vms61:~/demo5# kuser delete pod pod1
pod "pod1" deleted
root@vms61:~/demo5#

禁止特权pod运行
修改pod1.yaml内容如下。

root@vms61:~/demo5# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 1000000"]
    name: pod1
    resources: {}
    securityContext:
      privileged: true
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
root@vms61:~/demo5# 

再次创建pod1。

root@vms61:~/demo5# kuser apply -f pod1.yaml 
Error from server (Forbidden): error when creating "pod1.yaml": pods "pod1" is forbidden: PodSecurityPolicy: unable to admit pod: [spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]
root@vms61:~/demo5#

这里含有特权的pod就没法创建出来。

相关新闻

                                                                                                                                    RHCE9学习指南全部更新完成,点击阅读