什么是PSP : Pod Security Policy 是 kubernetes中一种集群级别的资源,它定义了用户能否在Pod中使用各种安全相关的特性,举例来说PSP可以做的事情:
- 是否允许Pod使用宿主节点的PID,IPC,网络命名空间
- Pod是否允许绑定到宿主节点端口
- 容器运行时允许使用的用户ID
- 是否允许特权模式的POD
- ….
一个psp的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
policy/example-psp.yaml apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: example spec: privileged: false # Don't allow privileged pods! # The rest fills in some required fields. seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny runAsUser: rule: RunAsAny fsGroup: rule: RunAsAny volumes: - '*' |
需要注意一个地方,当我们的cluster启用了这项功能以后,默认情况下任何pod都无法创建
1 |
Error from server (Forbidden): error when creating "STDIN": pods "pause" is forbidden: unable to validate against any pod security policy: [] |
这个是因为,当我们创建pod的时候,kubernetes会去查找是否有对应的PSP,发现没有任何定义,直接拒绝,所以,我们启用了PSP功能以后,要统一给所有的认证过的用户一个deafult的PSP(比较低但是可以创建普通Pod的权限)
如何来给所有的认证用户绑定一个defalt的权限呢? RBAC
1 |
kubectl create clusterrolebinding psp-all-users --clusterrole=psp-default --group=system:authenticated |
上边这个命令给所有的认证用户加了一个clusterrole:psp-default
具体的psp-default rule:
1 |
kubectl create clusterrole psp-default --verb=use --resource=podsecuritypolicies --resource-name=default |
这个时候所有的用户都要按照我们的default PSP里边的定义来创建pod了
当然,我们也可以给一些用户特殊的权限:
首先,创建一个特殊的PSP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: name: privileged spec: privileged: true runAsUser: rule: RunAsAny fsGroup: rule: RunAsAny supplementalGroups: rule: RunAsAny seLinux: rule: RunAsAny volumes: - '*' |
也就说,谁允许用这个PSP,就可以创建priviledged的pod
然后我们为他创建一个cluserrole
1 |
kubectl create clusterrole psp-privileged --verb=use --resource=podsecuritypolicies --resource-name=privileged |
然后我们给指定的用户或者serviceaccount绑定
1 |
kubectl create clusterrolebinding psp-bob --clusterrole=psp-privileged --user=bob |
例如,这个例子中,用户bob就和其他用户不一样了,它可以创建privileged 的Pod,其他人不可以
官方文档 https://kubernetes.io/docs/concepts/policy/pod-security-policy
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021