kubernetes的API Server常用的授权插件有:
Node、ABAC、RBAC、Webhook
我们重点说一下RBAC的访问控制逻辑
RBAC(Role base access control)基于角色的访问控制
涉及到的资源类型:
Role #角色,基于名称空间下的资源
RoleBinding #角色绑定,基于名称空间下的资源
ClusterRole #集群角色,基于集群级别下的资源
ClusterRoleBinding #集群角色绑定,基于集群级别下的资源
其中,Role和Role是针对于名称空间级别,授予其所在名称空间范围内的许可权限。
而ClusterRole和ClusterRoleBinding是针对于集群级别,授予其所在集群范围内的许可权限。
原理如图:
1.将user1通过rolebinding绑定到role,则该用户将拥有role定义的权限,但操作范围只能是role所在的名称空间。
2.将user2通过clusterrolebinding绑定到clusterrole,则该用户拥有clusterrole定义的权限,操作范围是clusterrole所在集群。
3.将user3通过rolebinding绑定到clusterrole,则该用户拥有clusterrole定义的权限,但操作范围只能是rolebinding所在名称空间。
使用 k8s资源配置清单的书写格式(yaml文件)的便捷方法,快速获取资源清单的基本框架:
1 创建角色:kubectl ceate role ROLE_NAME --verb=ACTION --resource=KIND --dry-run -o yaml >role-damo.yaml
2 创建角色绑定:kubectl create rolebinding ROLEBINDING_NAME --role=ROLE_NAME --user=USER_NAME --dry-run -o yaml > rolebinding.yaml
3 创建集群角色:kubectl create clusterrole CLUSTERROLE_NAME --verb=ACTION --resource=KIND --dry-run -o yaml > cluster-role.yaml
4 创建集群角色绑定:kubectl create clusterrolebinding CLUSTERROLEBINDING_NAEM --clusterrole=CLUSTERROLE_NAME --user=USER_NAME --dry-run -o yaml > cluster-binding.yaml
注:这些资源对象的修改会立即生效的
--verb:是动作名称如:get,list,watch等。
--resource:是资源类型如:pods,deploy,svc等;注意这里如果写入namespaces是无用的,因为role就是在namespace级别的,而namespaces选项是集群级别的。
--dry-run:运行这条命令,但不生效,常用于测试。
--role:是集群中现已存在的role资源对象。
--user:填写集群中现已存在的用户。或创建完rolebinding后创建这个用户。
--clusterrole:是集群中现已存在的clusterrole资源对象。
资源清单书写格式:
roleclusterrole(两个role写法差不多):
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 name: smbands-cluster-role
5 rules:
6 - apiGroups: #apigroups是包含资源的apigroup的名称。如果指定了多个API组,对其中一个将允许任何API组中的枚举资源。
7 - ""
8 resources: #写资源类型
9 - pods
10 - services
11 - namespaces
12 verbs: #写授权动作
13 - get
14 - list
15 - watch
16 - apiGroups:
17 - extensions
18 resources:
19 - deployments
20 verbs:
21 - get
22 - list
23 - watch
rolebindingclusterrolebinding(两个binding写法差不多):
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: RoleBinding
3 metadata:
4 name: smbands-binding
5 roleRef:
6 apiGroup: rbac.authorization.k8s.io #apigroup是被引用资源的组。
7 kind: ClusterRole #正在引用的资源类型(role或clusterrole)。
8 name: smbands-cluster-role #定义role或clusterrole时定义的资源名称。
9 subjects:
10 - apiGroup: rbac.authorization.k8s.io #这个apiGroup是参考类,默认对于ServiceAccount是"",默认对于用户或组是"rbac.authorization.k8s.io"
11 kind: User #用户类型:User,Group,ServiceAccount.
12 name: smbands #用于绑定的集群中的用户名。