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规则。如同要做某件事需要先征得领导的同意才行,但是现在都没领导,所以这事就没法执行下去,如下图。
下面创建名字为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的权限。即连访问领导的权限都没有,自然不能得到领导的回应,如下图。
所以首先我们需要让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规则的话,需要为
然后再次使用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就没法创建出来。