文章转载自:https://blog.csdn.net/BigData_Mining/article/details/88849696

基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Kubernetes API动态配置策略。

基于RBAC配置User权限,包括操作(get、create、list、delete、update、edit、watch、exec)资源:

Pods
PV
ConfigMaps
Deployments
Nodes
Secrets
Namespaces

资源与api group关联(如pods属于core api group,deployments属于apps api group)。

在RBAC中的几个概念:

Rules:规定一组可以在不同api group上的资源执行的规则(verbs)
Role与ClusterRoles:都是包括一组规则(rules)两者不同在于,Role针对的是一个namespace中,ClusterRoles针
对整个集群
Subject:有三种Subjects,Service Account、User Account、Groups,参照官方文档主要区别是User Account针对
人,Service Accounts针对运行在Pods中运行的进程。
RoleBindings与ClusterRoleBindins:将Subject绑定到Role或ClusterRoles。其区别在于:RoleBinding将使规则在命
名空间内生效,而ClusterRoleBinding将使规则在所有命名空间中生效。

RBAC API所定义的四种类型

Role与ClusterRole

在RBAC API中,一个角色定义了一组特定权限的规则。namespace范围内的角色由Role对象定义,

而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现。

Role

Role对象只能用于授予对某一namespace中资源的访问权限。

以下示例表示在“default” namespace中定义一个Role对象,用于授予对资源pods的读访问权限,绑定到该Role的用户则具有get/watch/list pod资源的权限:

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"]

为了更容易对API进行扩展,Kubemetes 使用API Groups (API组)进行标识。APIGroups 以及REST URL中的路径进行定义。当前支持两类API groups。

Core Groups (核心组),也可以称为Legacy Groups,该组的REST路径位于/api/v1, 作为 Kubernetes 最核心的 API,
它是没有“组”的概念,例如 ”v1“,在资源对象的定义中表示为”apiVersion: v1“。 具有分组信息的API,以/apis/$GROUP_NAME/$VERSIONURL路径进行标识,在资源对象的定义中表示为
apiVersion: $GROUP_NAME/$VERSION(例如,apiVersion: batch/v1)。已支持的 API 组详细列表请参阅
Kubernetes API reference。

ClusterRole

ClusterRole对象可以授予整个集群范围内资源访问权限, 也可以对以下几种资源的授予访问权限:

  • 集群范围资源(例如节点,即node)
  • 非资源类型endpoint(例如”/healthz”)
  • 跨所有namespaces的范围资源(例如pod,需要运行命令kubectl get pods --all-namespaces来查询集群中所有的pod)

以下示例中定义了一个名为pods-reader的ClusterRole,绑定到该ClusterRole的用户或对象具有用对集群中的资源pods的读访问权限:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
# 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段
name: pods-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]

RoleBinding与ClusterRoleBinding

角色绑定将一个角色中定义的各种权限授予一个或者一组用户,则该用户或用户组则具有对应绑定的Role或ClusterRole定义的权限。

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

  • RoleBinding
  • RoleBinding可以将同一namespace中的subject(用户)绑定到某个具有特定权限的Role下,则此subject即具有该Role定义的权限。

下面示例中定义的RoleBinding对象在”default” namespace中将”pod-reader”角色授予用户”Caden”。 这一授权将允许用户”Caden”从”default” namespace中读取pod。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: Caden
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

ClusterRoleBinding

ClusterRoleBinding在整个集群级别和所有namespaces将特定的subject与ClusterRole绑定,授予权限。

下面示例中所定义的ClusterRoleBinding 允许在用户组”pods-reader”中的任何用户都可以读取集群中任何namespace中的pods。

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-pods-global
subjects:
- kind: Group
name: pods-reader
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pods-reader
apiGroup: rbac.authorization.k8s.io

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

例如,尽管下面示例中的RoleBinding引用的是一个ClusterRole对象,但是用serviceaccount ”reader-dev”(即角色绑定主体)还是只能读取”development” namespace中的pods(即RoleBinding所在的namespace)。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-pods
namespace: development # 这里表明仅授权读取"development" namespace中的资源,若不定义该字段,则表示整个集群的Pod资源都可访问
subjects:
- kind: ServiceAccount
name: reader-dev
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pod-reader
namespace: kube-system

相关命令行工具

获取并查看Role/ClusterRole/RoleBinding/ClusterRoleBinding的信息

kubectl get role -n kube-system

查看kube-system namespace下的所有role

kubectl get role <role-name> -n kube-system -o yaml

查看某个role定义的资源权限

kubectl get rolebinding -n kube-system

查看kube-system namespace下所有的rolebinding

kubectl get rolebinding <rolebind-name> -n kube-system -o yaml

查看kube-system namespace下的某个rolebinding详细信息(绑定的Role和subject)

kubectl get clusterrole

查看集群所有的clusterrole

kubectl get clusterrole <clusterrole-name> -o yaml

查看某个clusterrole定义的资源权限详细信息

kubectl get clusterrolebinding

查看所有的clusterrolebinding

kubectl get clusterrolebinding <clusterrolebinding-name> -o yaml

查看某一clusterrolebinding的详细信息

有两个kubectl命令可以用于在命名空间内或者整个集群内授予角色。

kubectl create rolebinding

在某一特定名字空间内授予Role或者ClusterRole。示例如下:

a) 在名为”acme”的名字空间中将admin ClusterRole授予用户”bob”:

kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme

b) 在名为”acme”的名字空间中将view ClusterRole授予服务账户”myapp”:

kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme
kubectl create clusterrolebinding

在整个集群中授予ClusterRole,包括所有名字空间。示例如下:

a) 在整个集群范围内将cluster-admin ClusterRole授予用户”root”:

kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root

b) 在整个集群范围内将system:node ClusterRole授予用户”kubelet”:

kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet

c) 在整个集群范围内将view ClusterRole授予名字空间”acme”内的服务账户”myapp”:

kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp

Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)的更多相关文章

  1. 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现

    RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管 ...

  2. kubernetes 1.6 RBAC访问控制

    一.简介 之前,Kubernetes中的授权策略主要是ABAC(Attribute-Based Access Control).对于ABAC,Kubernetes在实现上是比较难用的,而且需要Mast ...

  3. kubernetes API 访问控制在阿里云容器服务(ACK)上的实践

    提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供 ...

  4. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  5. [ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)

    [ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC) 程序代码下载 程序代码下载:点此下载 前言 ASP.NET Identity是微软所贡献的 ...

  6. 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)

    使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC) 程序代码下载 程序代码下载:点此下载 前言 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.N ...

  7. kubernetes Dashboard 使用RBAC 权限认证控制

    kubernetes RBAC实战 环境准备 先用kubeadm安装好kubernetes集群,[包地址在此](https://market.aliyun.com/products/56014009/ ...

  8. rbac集成 权限分配。之角色管理

    权限分配功能拆分: a. 角色管理 b. 用户管理 c. 菜单和权限的管理 d. 批量的权限操作 e. 分配权限 先实现 角色管理: 无非也就是,增删改查: 定义路由, 编写视图. 1.查看角色页面: ...

  9. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

随机推荐

  1. antd vue 折叠面板 v-for 循环点击无效

    问题描述 实现一个折叠面板点击展开,但是必须点击两次才能展开,第一次无效 <a-collapse-panel v-for="(item, index) in dataMap" ...

  2. vlan配置

    VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的局域网在逻辑上划分成多个广播域的技术. 通过在交换机上配置VLAN,可以实现在同一个VLAN内的用户可以进行 ...

  3. 基于ABP实现DDD--实体创建和更新

      本文主要介绍了通过构造函数和领域服务创建实体2种方式,后者多用于在创建实体时需要其它业务规则检测的场景.最后介绍了在应用服务层中如何进行实体的更新操作. 一.通过构造函数创建实体 假如Issue的 ...

  4. Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上

    概述 定义 dolphinscheduler 官网地址 https://dolphinscheduler.apache.org/ dolphinscheduler GitHub地址 https://g ...

  5. 一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

    一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务 原文转载自「刘悦的技术博客」https://v3u.cn/a_id_177 就在去年(2019年) ...

  6. 快速体验Spring Boot了解使用、运行和打包 | SpringBoot 2.7.2学习系列

    SpringBoot 2.7.2 学习系列,本节内容快速体验Spring Boot,带大家了解它的基本使用.运行和打包. Spring Boot 基于 Spring 框架,底层离不开 IoC.AoP ...

  7. npm run dev 启动项目报错我的解决办法

    我的报错截屏 解决方案   1.    config文件中 index 文件中的 host 值如果是数字串就将其改为 localhost 2.    再次尝试 如果有遇到其他问题阔以将 node-mo ...

  8. Spring的简单使用(1)

    一:IOC(控制反转):它是由spring容器进行对象的创建和依赖注入,程序员使用时直接取出即可 正转:例如: Student stu=new Student(): stu.setname(" ...

  9. MGR的gtid_executed不连续的问题分析

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1.问题描述 在做MGR测试的时候偶尔遇到gtid_executed事务ID不连续的问题,但是并不影响数据库的正常运行.现 ...

  10. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...