一、简介

基于角色的访问控制(“RBAC”)

http://docs.kubernetes.org.cn/80.html

(1)

Kubernetes的授权是基于插件形式的,常用的授权插件有以下几种:

  1. Node:node节点授权
  2. ABAC:基于属性的访问控制
  3. RBAC:基于角色的访问控制
  4. Webhook:自定义http回调方法

RBAC:http://docs.kubernetes.org.cn/148.html

  

基于角色的访问控制:如图,先让一个用户(Users)扮演一个角色(Role),让角色(Role)拥有权限,从而让用户拥有这样的权限,然后在授权机制当中,只需要将权限授予某个角色,此时用户将获取对应角色的权限,从而实现角色的访问控制;

(2)Role和ClusterRole 

  Role是一系列的权限的集合,例如一个Role可以包含读取 Pod 的权限和列出 Pod 的权限, ClusterRole 跟 Role 类似,但是可以在集群中全局使用。

  Role只能授予单个namespace 中资源的访问权限。

  ClusterRole授权 >= Role授予(与Role类似),但ClusterRole属于集群级别对象:

    • 集群范围(cluster-scoped)的资源访问控制(如:节点访问权限)
    • 非资源类型(如“/ healthz”)
    • 所有namespaces 中的namespaced 资源(如 pod)

(3)RoleBinding和ClusterRoleBinding

RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role,Role有了权限,用户也就有了权限。RoleBinding在某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

  RoleBinding可以引用相同namespace下定义的Role。

  Role和ClusterRole、RoleBinding和ClusterRoleBinding关系如下图:

  

(4)

使用RoleBinding去绑定ClusterRole:

如果有10个名称空间,每个名称空间都需要一个管理员,而这些管理员的权限都是一致的。那么此时需要去定义这样的管理员,使用RoleBinding就需要创建10个Role,这样显得很麻烦。为此当使用RoleBinding去绑定一个ClusterRole时,该User仅仅拥有对当前名称空间的集群操作权限,此时只需要创建一个ClusterRole就解决了以上的需求。

 二、RBAC应用

 (1)Role --> User -->Rolebinding 

  用法:

  

  使用kubectl create进行创建角色(role),指定角色名称,--verb指定权限,--resource指定资源或者资源组,--dry-run:此模式不会真的创建;

  a、

  [root@master ~]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml  #先用--dry-run模式看一下role的定义

  

  b、生成资源定义清单

  [root@master ~]# cd manifests/

  #导出yaml文件,稍微编辑一下就能用了
  [root@master manifests]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml >role-demo.yaml

  [root@master manifests]# vim role-demo.yaml

  

  c、创建

  

(2)RoleBinding角色绑定  

创建方法:

使用kubectl create进行创建角色绑定,指定角色绑定的名称,--role|--clusterrole指定绑定哪个角色,--user指定哪个用户;  

  a、导出rolebinding资源定义清单文件

  [root@master manifests]# kubectl explain role  #查看资源定义清单字段

  [root@master manifests]# kubectl explain rolebinding  #查看资源定义清单字段

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --role=pods-reader --user=magedu --dry-run -o yaml > rolebinding-demo.yaml

  

  b、创建,将权限授权给用户magedu

  [root@master manifests]# kubectl apply -f rolebinding-demo.yaml

  

  c、可见magedu已经绑定到了pods-reader角色上了;

  

  d、切换用户访问

  

  现在magedu已经有权限访问了;

  以上操作role和rolebinding都是只对当前名称空间生效;

  [root@master ~]# kubectl config use-context kubernetes-admin@kubernetes  #切换回kubernetes-admin用户

(2)ClusterRole-->ClusterRoleBinding-->User

  [root@master manifests]# kubectl explain clusterrole  #查看资源定义清单字段

  [root@master manifests]# kubectl explain clusterrolebinding  #查看资源定义清单字段

  a、导出clusterrole的资源定义清单文件

  [root@master manifests]# kubectl create clusterrole cluster-read --verb=get,list,watch --resource=pods -o yaml >clusterrole-demo.yaml

  [root@master manifests]# vim clusterrole-demo.yaml

  

  b、创建clusterrole

  [root@master manifests]# kubectl apply -f clusterrole-demo.yaml

  此时我们可以新建一个Linux系统账户,然后在这个系统账户下,将kubernetes的用户切换到magedu下,随后对magedu赋予clusterrole的权限;

  

  

  c、此时我们删除之前创建的rolebinding 解除magedu的权限;

  

  可见此时magedu已经没有了权限;

  

  d、创建clusterrolebinding

  导出yaml资源定义清单文件:

  [root@master ~]# kubectl create clusterrolebinding magedu-read-all-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >manifests/clusterrolebinding-demo.yaml

  [root@master manifests]# vim clusterrolebinding-demo.yaml

  

  创建,将magedu绑定到clusterrole:

  [root@master manifests]# kubectl apply -f clusterrolebinding-demo.yaml

  

  查看,可见已经绑定到集群角色:

  

  

  e、此时我们切换到系统用户为ik8s的窗口,并且kubernetes的用户为maedu

  

  查看其他namespace的pod, 也是可以的:

  

  但是,现在是不能删pod的,因为没有授权:

  

以上可见,对用户magedu进行集群角色绑定,用户magedu将会获取对集群内所有资源的(namespace)对应权限。

(3)clusterrole --> rolebinding --> user

  将maedu通过rolebinding到集群角色clusterrole中,此时,magedu仅作用于当前名称空间的所有pods资源的权限;

  a、删除之前的clusterrolebinding

  

  b、导出yaml资源定义清单文件

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >rolebinding-clusterrole-dmeo.yaml

  [root@master manifests]# vim rolebinding-clusterrole-dmeo.yaml

  

  c、创建rolebinding,将magedu绑定到clusterrole

  

  查看rolebinding

  

  可见magedu已经绑定到集群角色clusterrole上了;

  d、此时切换到系统用户ik8s的窗口

  可见magedu可以访问当前namespace的pod,但是不能访问其他namespace的pod;

  因为这种绑定方式,clusterrole是被降级的;

  

 (4)RBAC的三种授权访问方式

RBAC不仅可以对user进行访问权限的控制,还可以通过group和serviceaccount进行访问权限控制。user即单个用户,group是对一个组内的user进行授权;

上一节学习了Pod可以通过 spec.serviceAccountName来定义其是以某个serviceaccount的身份进行运行,当我们通过RBAC对serviceaccount进行访问授权时,即可以实现Pod对其他资源的访问权限进行控制。也就是说,当我们对serviceaccount进行rolebinding或clusterrolebinding,会使创建Pod拥有对应角色的权限和apiserver进行通信。

             

k8s-RBAC授权-十六的更多相关文章

  1. Kubernetes 基于 RBAC 的授权(十六)

    目录 一.RBAC介绍 1.1.角色和集群角色 1.2.RoleBinding 和 ClusterRoleBinding 1.3.资源 1.4.主体 二.命令行工具 2.1.kubectl creat ...

  2. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  3. 容器编排系统K8s之访问控制--RBAC授权

    前文我们了解了k8s上的访问控制机制,主要对访问控制中的第一关用户认证做了相关说明以及常规用户的配置文件的制作,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/ ...

  4. k8s之RBAC授权模式

    导读 上一篇说了k8s的授权管理,这一篇就来详细看一下RBAC授权模式的使用 RBAC授权模式 基于角色的访问控制,启用此模式,需要在API Server的启动参数上添加如下配置,(k8s默然采用此授 ...

  5. VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View

       VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View  VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...

  6. Service Account和RBAC授权

    一.介绍 Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务.Service Accou ...

  7. Spring Boot(十六):使用Jenkins部署Spring Boot

    Spring Boot(十六):使用Jenkins部署Spring Boot jenkins是devops神器,介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署 ...

  8. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  9. 附006.Kubernetes RBAC授权

    一 RBAC 1.1 RBAC授权 基于角色的访问控制(RBAC)是一种基于个人用户的角色来管理对计算机或网络资源的访问的方法. RBAC使用rbac.authorization.k8s.io API ...

随机推荐

  1. BUPT复试专题—树查找(2011)

    https://www.nowcoder.com/practice/9a10d5e7d99c45e2a462644d46c428e4?tpId=67&tqId=29641&rp=0&a ...

  2. 使用FMDB多线程訪问数据库,及database is locked的问题

    今天最终攻克了多线程同一时候訪问数据库时,报数据库锁定的问题.错误信息是: Unknown error finalizing or resetting statement (5: database i ...

  3. SQL数据库 更改数据类型

    向表中添加数据 alter table 表名 add 列名 类型 更改表中列的数据类型 alter table 表名 alter column 列名 类型 删除表中的指定列 alter table 表 ...

  4. C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic

    DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...

  5. Hashed Indexes Geospatial Index

    Indexes — MongoDB Manual https://docs.mongodb.com/manual/indexes/ 地理索引 哈希索引

  6. Node中的promise简说及入门

    Node的特色之一就是异步回调,可是回调过多,就会形成著名的回调金字塔. 直接上例子,我要读取1.txt里的内容,然后在这个内容上加上'test'并重新写入文件,如下代码所示: var fs = re ...

  7. 通达OA二次开发 工作流表单中关联查询另外一个工作流方法(源代码)

    一个工作流表单中,怎样方便的查询相关的工作流表单内容.重复打开各个菜单必定须要造成多次点击浪费时间,切换也会带来思路的中断.这里通过js代码的方式把这个问题进行了解决. <style>&l ...

  8. mysql 数据库导入错误:40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RES ...

  9. JAVA 0 的突破

    使用IntelliJ Idea 开发的一个Java 处理数据文件折行的问题,整体来说功能比较简单的一个java脚本的开发,跨平台的优势可以处理windows和lunix平台的文件折行 package ...

  10. 动态预览Xib的实现

    写一个TestView继承于UIView,然后写个对应的xib,把xib的名字设置成TestView,这是标准的用xib加载这个view必须得条件 然后xib里把这个View的backgroundCo ...