Kubernetes中的RBAC模式详解

RBAC模式

kubernetes中的权限控制使用的是RBAC模式,其基本概念如下:

  • Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
  • Subject:被作用者,既可以是“人”,也可以是“机器”,也可以使你在 Kubernetes 里定义的“用户”。
  • RoleBinding:定义了“被作用者”和“角色”的绑定关系。

ROLE对象

1
2
3
4
5
6
7
8
9
10
11

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: mynamespace
name: example-role
rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["my-config"]
verbs: ["get"]

这里比较重要的是namespace属性,指定了Role的作用范围,另一个是rules属性,通过resources指定了可作用的资源的范围,verbs属性指定了资源上具体可支持的操作。

这里verbs支持的所有操作如下

verbs: [“get”, “list”, “watch”, “create”, “update”, “patch”, “delete”]

RoleBinding对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-rolebinding
namespace: mynamespace
subjects:
- kind: User
name: example-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io

RoleBinding中需要指定作用对象subjects和赋予的权限role。

关联ServiceAccount对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: mynamespace
name: example-sa

-------------------

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-rolebinding
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: example-sa
namespace: mynamespace
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io

除了User以外,RoleBinding还可以绑定ServiceAccount,定义方式如上所示。通常情况下,一个namespace创建时系统会自动生成一个default的ServiceAccount,当创建pod没有指定ServiceAccount时,默认就会将default赋予给该pod。

用户组

1
2
3
4
5

subjects:
- kind: Group
name: system:serviceaccounts:mynamespace
apiGroup: rbac.authorization.k8s.io

RoleBinding其实还可以绑定用户组,如上所示即为绑定mynamespace下的所有ServiceAccount,这里顺带提一下ServiceAccount的完全表示形式为

system:serviceaccount:<ServiceAccount名字>

ClusterRole 和 ClusterRoleBinding

由于ROLE和RoleBinding都是作用在指定namespace上的,当我们要跨namespace授权时就显得无能为力了,这时候就需要使用ClusterRole 和 ClusterRoleBinding,事例如下:

1
2
3
4
5
6
7
8
9

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
1
2
3
4
5
6
7
8
9
10
11
12
13

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrolebinding
subjects:
- kind: User
name: example-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: example-clusterrole
apiGroup: rbac.authorization.k8s.io

可以看到两者的使用和ROLE、RoleBinding基本一样,仅仅是不用设置namespace字段。

另外,系统初始化时已经内置了许多的ClusterRole,具体可以通过以下命令查询

kubectl get clusterrole

其中最值得注意的是cluster-admin这个角色,它代表了k8s中的最高权限,需要小心使用。