来聊聊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: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-reader
rules:- apiGroups: [""] # 空字符串""表明使用core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
#示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:
ClusterRole: 对象可以授予与Role对象相同的权限,但由于它们属于集群范围对象
举个栗子:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
# 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段
name: secret-reader
rules:- 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: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-pods
namespace: default
subjects:- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
RoleBinding对象也可以引用一个ClusterRole对象用于在RoleBinding所在的命名空间内授予用户对所引用的ClusterRole中 定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的命名空间中复用这些角色。
# 以下角色绑定允许用户"dave"读取"development"命名空间中的secret。kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets
namespace: development # 这里表明仅授权读取"development"命名空间中的资源。subjects:- kind: User
name: dave
apiGroup: rbac.authorization.k8s.io
roleRef:
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: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets-global
subjects:- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
根据上面的实例,基本可以定义为:
role:是某个空间中的某个单一资源
clusterrole: 是集群空间所有空间或者特定空间、特定资源或者所有资源
RoleBinding:可以引用在同一命名空间内定义的Role对象
ClusterRoleBinding:在集群级别和所有命名空间中授予权限
面向用户的角色
一些默认角色并不包含system:前缀,它们是面向用户的角色。 这些角色包含超级用户角色(cluster-admin),即旨在利用ClusterRoleBinding(cluster-status)在集群范围内授权的角色, 以及那些使用RoleBinding(admin、edit和view)在特定命名空间中授权的角色。
默认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: v1
kind: Namespace
metadata:
name: sz-om
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pengyong
namespace: sz-om
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: pengyong
namespace: sz-om
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
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