来聊聊RBAC角色访问控制

Posted Friday8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来聊聊RBAC角色访问控制相关的知识,希望对你有一定的参考价值。

花了点时间来理解RBAC角色访问控制,说实话,这个这个权限管理有点复杂,经过反复验证之后,慢慢的把思路理清楚了,那么接下来介绍一下这个东东


什么是RBAC

基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Kubernetes API动态配置四种类型策略。四种策略分别是:role和clusterrole:主要用来定义角色权限和范围, RoleBinding与ClusterRoleBinding 将角色绑定一个用户 、组、serviceaccount,可以理解为,一个是定义权限,一个是绑定权限,剩下的就是权限范围了。

ps:截至Kubernetes 1.6,RBAC模式处于beta版本, 要启用RBAC,请使用--authorization-mode=RBAC启动API Server。


RBAC四种类型

  • Role 与 ClusterRole

角色可以由命名空间(namespace)内的Role对象定义,而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现。

  • Role:一个Role对象只能用于授予对某一单一命名空间中资源的访问权限

举个栗子:

kind: RoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: namespace: default name: pod-readerrules:- apiGroups: [""] # 空字符串""表明使用core API group resources: ["pods"] verbs: ["get", "watch", "list"]#示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:
  • ClusterRole: 对象可以授予与Role对象相同的权限,但由于它们属于集群范围对象

举个栗子:

kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: # 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段 name: secret-readerrules:- apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]#示例中的ClusterRole定义可用于授予用户对某一特定命名空间,或者所有命名空间中的secret(取决于其绑定方式)的读访问权限



  • RoleBinding与ClusterRoleBinding

角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授予角色的引用。 在命名空间中可以通过RoleBinding对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding对象完成

  • RoleBinding

举个栗子:

RoleBinding可以引用在同一命名空间内定义的Role对象。 下面示例中定义的RoleBinding对象在”default”命名空间中将”pod-reader”角色授予用户”jane”。这一授权将允许用户”jane”从”default”命名空间中读取pod。

# 以下角色绑定定义将允许用户"jane"从"default"命名空间中读取pod。kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: read-pods namespace: defaultsubjects:- kind: User name: jane apiGroup: rbac.authorization.k8s.ioroleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

RoleBinding对象也可以引用一个ClusterRole对象用于在RoleBinding所在的命名空间内授予用户对所引用的ClusterRole中 定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的命名空间中复用这些角色。

# 以下角色绑定允许用户"dave"读取"development"命名空间中的secret。kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: read-secrets namespace: development # 这里表明仅授权读取"development"命名空间中的资源。subjects:- kind: User name: dave apiGroup: rbac.authorization.k8s.ioroleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io#示例中的RoleBinding引用的是一个ClusterRole对象,但是用户”dave”(即角色绑定主体)还是只能读取”development” 命名空间中的secret(即RoleBinding所在的命名空间)。
  • ClusterRoleBinding

ClusterRoleBinding在集群级别和所有命名空间中授予权限。下面示例中所定义的ClusterRoleBinding 允许在用户组”manager”中的任何用户都可以读取集群中任何命名空间中的secret。

# 以下`ClusterRoleBinding`对象允许在用户组"manager"中的任何用户都可以读取集群中任何命名空间中的secret。kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: read-secrets-globalsubjects:- kind: Groupname: managerapiGroup: rbac.authorization.k8s.ioroleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

根据上面的实例,基本可以定义为:

role:是某个空间中的某个单一资源

clusterrole: 是集群空间所有空间或者特定空间、特定资源或者所有资源

RoleBinding:可以引用在同一命名空间内定义的Role对象

ClusterRoleBinding:在集群级别和所有命名空间中授予权限

面向用户的角色

一些默认角色并不包含system:前缀,它们是面向用户的角色。 这些角色包含超级用户角色(cluster-admin),即旨在利用ClusterRoleBinding(cluster-status)在集群范围内授权的角色, 以及那些使用RoleBinding(admineditview)在特定命名空间中授权的角色。

默认ClusterRole

默认ClusterRoleBinding

描述

cluster-admin

system:mastersgroup

超级用户权限,允许对任何资源执行任何操作。 在ClusterRoleBinding中使用时,可以完全控制集群和所有命名空间中的所有资源。 在RoleBinding中使用时,可以完全控制RoleBinding所在命名空间中的所有资源,包括命名空间自己。

admin

None

管理员权限,利用RoleBinding在某一命名空间内部授予。 在RoleBinding中使用时,允许针对命名空间内大部分资源的读写访问, 包括在命名空间内创建角色与角色绑定的能力。 但不允许对资源配额(resource quota)或者命名空间本身的写访问。

edit

None

允许对某一个命名空间内大部分对象的读写访问,但不允许查看或者修改角色或者角色绑定。

view

None

允许对某一个命名空间内大部分对象的只读访问。 不允许查看角色或者角色绑定。 由于可扩散性等原因,不允许查看secret资源。


一个实例:

需求:我想创建一个用户访问kubernetes-dashborad平台,权限限制在当前的namespace里面,其他ns无操作权限,也无法查看

流程大致如下:

1、创建namespace空间

2、因为要访问系统服务,所以需要创建serviceaccount账号与apiserver通信

3、通过rolebinding绑定,将 pengyong绑定至clusterrole的cluster-admin用户上

apiVersion: v1kind: Namespacemetadata: name: sz-om---apiVersion: v1kind: ServiceAccountmetadata: name: pengyong namespace: sz-om---apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata: name: pengyong namespace: sz-omroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: pengyong namespace: sz-om

查找用户的token并记录(红色部分要注意,需要根据实际情况填写)

kubectl -n sz-om describe secret $(kubectl -n sz-om get secret | grep pengyong | awk '{print $1}')


访问https://k8s.szjd.com/k8s/#!/overview?namespace=sz-om

访问其他namespace会提示警告


参考链接: https://jimmysong.io/kubernetes-handbook/concepts/rbac.html


以上是关于来聊聊RBAC角色访问控制的主要内容,如果未能解决你的问题,请参考以下文章

云原生 kubernetes - 基于角色的访问控制RBAC

RBAC介绍

Yii Framework 2.0 基于角色的访问控制 RBAC

RBAC相关的配置

Djang之基于角色的权限控制(RBAC)

Flask实现基于角色的访问控制(RBAC)