什么是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