Kubernetes中的RBAC
Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。需要在kube-apiserver设置–authorization-mode=RBAC参数,启用RABC模式,下面的操作版本为v1.10.1;
  当应用没有指定serviceAccountName,它将使用default服务帐户。
  在RABC API中,通过如下的步骤进行授权:
  1)定义角色:定义角色时会指定此角色对于资源的访问控制的规则;
  2)定义主体:用户、组和服务帐户
  3)绑定角色:将主体与角色进行绑定,对主体进行访问授权。

                    RBAC API中的对象关系图
  Kubernetes中角色包含代表权限集合的规则,权限只有被授予,没有被拒绝的设置。
  在Kubernetes中有两类角色:普通角色和集群角色。
可以通过Role定义在一个命名空间中的角色,或是使用ClusterRole定义集群范围的角色。
普通角色只能被授予访问单一命令空间中的资源。
集群角色(ClusterRole)能够被授予资源权限有:集群范围资源(Node、NameSpace)、非资源端点(/healthz)、集群所有命名空间资源(跨名称空间);
角色绑定和集群角色绑定
  角色绑定用于将角色与一个主体进行绑定,从而实现将对主体授权的目的,主体分为用户、组和服务帐户。
角色绑定分为:普通角色绑定和集群角色绑定
角色绑定中不同主体定义有:
名称为 demo 用户:
 subjects:
 - kind:User
   name:"demo"
   apiGroup:rbac.authorization.k8s.io
名称为 demo 组:
 subjects:
 - kind:Group
   name:"demo-group"
   apiGroup:rbac.authorization.k8s.io
kube-system命名空间中,名称为default的服务帐户
 subjects:
 - kind:ServiceAccount
   name:default
   namespace:kube-system
so命名空间中,所有的服务帐户:
 subjects:
 - kind:Group
   name:system:serviceaccounts:so
   apiGroup:rbac.authorization.k8s.io
所有的服务帐户:
 subjects:
 - kind:Group
   name:system:serviceaccounts
   apiGroup:rbac.authorization.k8s.io
所有用户:
 subjects:
 - kind:Group
   name:system:authenticated    #授权用户
   apiGroup:rbac.authorization.k8s.io
 - kind:Group
   name:system:unauthenticated  #未授权用户
   apiGroup:rbac.authorization.k8s.io
授予cluster-admin集群角色给admin用户:
 kubectl create clusterrolebinding admin-cluster-admin-binding --clusterrole=cluster-admin --user=admin
授予cluster-admin集群角色给so名称空间中的app服务帐户:
 kubectl create clusterrolebinding app-admin-binding --clusterrole=cluster-admin --serviceaccount=so:app
RBAC实例demo下面创建solinx-service-account.yml文件包含以下内容:
 # 服务账号
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: solinx
 # 角色
 ---
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1beta1
 metadata:
   name: solinx
 rules:                #规则
 - apiGroups: [""]       # 所有核心api
   resources: ["pods"]   # 资源
   verbs: ["create","delete","get","list","patch","update","watch"]  #操作
 - apiGroups: [""]
   resources: ["namespaces"]
   verbs: ["create","delete","get","list","patch","update","watch"]
 # 角色绑定
 ---
 apiVersion: rbac.authorization.k8s.io/v1beta1
 kind: RoleBinding
 metadata:
   name: solinx
 roleRef:     # 上面定义的角色
   apiGroup: rbac.authorization.k8s.io
   kind: Role
   name: solinx
 subjects:   # 上面定义的服务账户
 - kind: ServiceAccount
   name: solinx
   namespace: default
  上面定义了一个服务账户solinx、普通角色solinx,并将该服务账户与角色进行绑定,该角色定义了对了pod的增删查改等操作,所以该服务账户也具备了该权限;
  这里使用solinx服务账户对资源进行操作:
 kubectl get po --as system:serviceaccount:default:solinx

由于只授予了pod的操作权限,当访问service资源时被拒绝:
 kubectl get svc --as system:serviceaccount:default:solinx
 Error from server (Forbidden): services is forbidden: User "system:serviceaccount:default:solinx" cannot list services in the namespace "default"

该角色为普通角色Role,当访问集群资源NameSpace时同样被拒绝:
 kubectl get ns --as system:serviceaccount:default:solinx
 Error from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:default:solinx" cannot list namespaces at the cluster scope

  此时把角色改为集群角色:ClusterRole,并重新绑定服务账户:

此时该服务账户已经具备集群角色权限,访问集群资源:NameSpace
 kubectl get ns --as system:serviceaccount:default:solinx

参考资料:
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
文章首发地址:Solinx
http://www.solinx.co/archives/1233
Kubernetes中的RBAC的更多相关文章
- Kubernetes中的网络
		一.引子 既然Kubernetes中将容器的联网通过插件的方式来实现,那么该如何解决这个的联网问题呢? 如果你在本地单台机器上运行docker容器的话注意到所有容器都会处在docker0网桥自动分配的 ... 
- kubernetes 1.6 RBAC访问控制
		一.简介 之前,Kubernetes中的授权策略主要是ABAC(Attribute-Based Access Control).对于ABAC,Kubernetes在实现上是比较难用的,而且需要Mast ... 
- [转帖]Kubernetes中安装Helm及使用
		Kubernetes中安装Helm及使用 2018年07月02日 17:41:09 灬勿忘丶心安 阅读数 3699更多 分类专栏: K8S 版权声明:本文为博主原创文章,遵循CC 4.0 BY-S ... 
- Kubernetes中予许及限制(PodSecurityPolicy)使用宿主机资源
		1.在pod中使用宿主机命名空间.端口等资源 pod中的容器通常在分开的Linux命名空间中运行.这些命名空间将容器中的进程与其他容器中,或者宿主机默认命名空间中的进程隔离开来. 例如,每一个pod有 ... 
- 浅析kubernetes中client-go structure01
		Prepare Introduction 从2016年8月起,Kubernetes官方提取了与Kubernetes相关的核心源代码,形成了一个独立的项目,即client-go,作为官方提供的go客户端 ... 
- Kubernetes 中部署 NFS-Subdir-External-Provisioner 为 NFS 提供动态分配卷
		文章转载自:http://www.mydlq.club/article/109/ 系统环境: 操作系统: CentOS 7.9 Docker 版本: 19.03.13 Kubernetes 版本: 1 ... 
- phpcms中的RBAC权限系统
		PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ... 
- [Yii][RBAC]Yii中应用RBAC完全指南
		开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来. 设置参数.建树数据库 在设备数组中,增长以下 ... 
- 前后端分离Web项目中,RBAC实现的研究
		在前后端分离Web项目中,RBAC实现的研究 最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ... 
随机推荐
- Lombok插件看法浅谈
			背景 最近接触的几个工程中Lombok插件出现频率比较高,趁机了解一下原理. 简要说明: 受益于JSR 269 API,程序可以在编译阶段对AST进行节点的操作,从而注入相关的功能结点,从而包含在最终 ... 
- vue  keep-alive内置缓存组件
			1.当组件在keep-alive被切换时将会执行activeted和deactiveted两个生命周期 2.inlude 正则表达式或字符串 ,只有符合条件的组件会被缓存 exclude正则表达式或字 ... 
- 【easy】530. Minimum Absolute Difference in BST
			找BST树中节点之间的最小差值. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode ... 
- C# 根据出生日期(年月日)计算年龄的代码
			public int GetAgeByBirthdate(DateTime birthdate) { DateTime now = DateTime.Now; int age = now.Year - ... 
- 多个 Github 网站账号 的配置
			账号的基本配置可参考上篇 紧跟上篇已将config 文件配置好了,下面是多账号的配置 一, 多账号也是在config里面配置 1. 首先: 在git 里面输入命令: ll 可以看到 ... 
- MyOD(课下作业,选做)
			MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ... 
- 对于JavaBean+Servlet+SqlServer的代码总结和打包调用
			日期:2019.3.24 博客期:049 星期日 说起来我已经说过很多次前台的应用技术了呢!这一次我是要将这一部分打包,做成配套的制作工具: 当前我已经打包成功,想要下载的同学可以进入我的GitHub ... 
- flutter 登录后跳转到根路由
			flutter 登录以后 会有返回箭头显示 因为 路由的切换导致不是路由的第一个页面,解决办法清空路由. Navigator.of(context).pushAndRemoveUntil( new ... 
- python3+Robot Framework+PyCharm环境部署及执行脚本
			Robot Framework是一个非常优秀的开源关键字驱动自动化测试框架,目前已经支持python2和python3,但是GUI界面RIDE只支持python2,但是python的未来是python ... 
- zabbix 修改为UTC 时区的配置
			修改php.ini中的date.timezone = UTC还确实是正解,修改后要重新启动apache,另外你应该用phpinfo()检查一下你修改php.ini和phpinfo()中指明的当前php ... 
