Kubernetes中所有的API对象,都保存在Etcd里,对这些API对象的操作,一定都是通过访问kube-apiserver实现的,原因是需要APIServer来做授权工作。

  在Kubernetes中,负责完成授权(Authorization)工作的机制,就是RBAC:基于角色的访问控制(Role-Based Access Control)

  RBAC中有三个最基本的概念:

1、Role:角色,它其实是一组规则,定义了一组对Kubernetes API对象的操作权限

  Role本身是一个Kubernetes的API对象,定义如下所示:

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: mynamespace ## 指定它能产生作用的Namespace
  5. name: example-role
  6. rules: ## 定义权限规则
  7. - apiGroups: [""]
  8. resources: ["pods"] ## 对mynamespace下面的Pod对象
  9. verbs: ["get", "watch", "list"] ## 进行GET、WATCH、LIST操作

2、Subject:被作用者,既可以是“人”,也可以是“机器”,也可以是Kubernetes里定义的“用户”

3、RoleBinding:定义了“被作用者”和“角色”的绑定关系

  RoleBingding本身也是一个Kubernetes的API对象

  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: example-rolebinding
  5. namespace: mynamespace
  6. subjects: ## 被作用者
  7. - kind: User ## 类型是User
  8. name: example-user ## 用户名是example-user
  9. apiGroup: rbac.authorization.k8s.io
  10. roleRef:
  11. ## 通过roleRef字段,RoleBinding对象可以直接通过名字来引用Role对象,从而定义了被作用者(Subject)和角色(Role)之间的关系
  12. kind: Role
  13. name: example-role
  14. apiGroup: rbac.authorization.k8s.io

  需要注意的是:Role和RoleBinding对象都是Namespaced对象,它们对权限限制规则仅在它们自己的Namespace内有效,roleRef也只能引用当前Namespace里的Role对象

  那对于非Namespaced对象(如: node)或者一个Role想作用于所有的Namespace的时候,又该如何去做授权呢?

  这个时候就必须要使用ClusterRole和ClusterRoleBinding这个组合了,这两个API对象的用法跟Role和RoleBinding完全一样,只不过它们的定义里没有了Namespace字段

  1. kind: ClusterRole
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: example-clusterrole
  5. rules:
  6. - apiGroups: [""]
  7. resources: ["pods"]
  8. verbs: ["get", "watch", "list"]
  9.  
  10. kind: ClusterRoleBinding
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. metadata:
  13. name: example-clusterrolebinding
  14. subjects:
  15. - kind: User
  16. name: example-user
  17. apiGroup: rbac.authorization.k8s.io
  18. roleRef:
  19. kind: ClusterRole
  20. name: example-clusterrole
  21. apiGroup: rbac.authorization.k8s.io

   上面的例子里意味着名叫example-user的用户拥有对所有Namespace里的Pod进行GET、WATCH和LIST操作的权限。

  如果想要赋予用户所有权限,那可以给它指定一个verbs字段的全集

  1. verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

  Role对象的Rules字段也可以进一步细化,如可以只针对某一个具体的对象进行权限设置

  1. rules:
  2. - apiGroups: [""]
  3. resources: ["configmaps"]
  4. resourceNames: ["my-config"]
  5. verbs: ["get"]

  那现在还有一个问题,在Kubernetes中其实并没有一个叫做“User”的API对象,那这个User从哪里来呢? 

  在Kubernetes的User只是一个授权系统里的逻辑概念,在大多数私有的使用环境中,只需要使用Kubernetes提供的内置“用户”足够了。负责管理内置用户的是ServiceAccount

  首先定义一个ServiceAccount

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. namespace: mynamespace
  5. name: example-sa

  然后通过编写RoleBinding的YAML文件,来为这个ServiceAccount分配权限

  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: example-rolebinding
  5. namespace: mynamespace
  6. subjects:
  7. - kind: ServiceAccount
  8. name: example-sa
  9. namespace: mynamespace
  10. roleRef:
  11. kind: Role
  12. name: example-role
  13. apiGroup: rbac.authorization.k8s.io

  接着创建这个三个对象

  1. $ kubectl create -f svc-account.yaml
  2. $ kubectl create -f role-binding.yaml
  3. $ kubectl create -f role.yaml
  4.  
  5. $ kubectl get sa -n mynamespace -o yaml
  6. - apiVersion: v1
  7. kind: ServiceAccount
  8. metadata:
  9. creationTimestamp: 2018-09-08T12:59:17Z
  10. name: example-sa
  11. namespace: mynamespace
  12. resourceVersion: "409327"
  13. ...
  14. secrets:
  15. - name: example-sa-token-vmfg6

  可以看到,Kubernetes会为一个ServiceAccount自动创建并分配一个Secret对象。这个Secret就是ServiceAccount对应的、用来跟APIServer进行交互的授权文件,一般称为Token。 Token文件的内容一般是证书或者密码,它以一个Secret对象的方式保存在Etcd中。

  这时候,用户的Pod就可以声明使用这个ServiceAccount了

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. namespace: mynamespace
  5. name: sa-token-test
  6. spec:
  7. containers:
  8. - name: nginx
  9. image: nginx:1.7.9
  10. serviceAccountName: example-sa
  11.  
  12. $ kubectl describe pod sa-token-test -n mynamespace
  13. Name: sa-token-test
  14. Namespace: mynamespace
  15. ...
  16. Containers:
  17. nginx:
  18. ...
  19. Mounts:
  20. /var/run/secrets/kubernetes.io/serviceaccount from example-sa-token-vmfg6 (ro)

  如果一个Pod没有声明serviceAccountName,Kubernetes会自动在它的Namespace下创建一个名叫default的默认ServiceAccount,然后分配给这个Pod,这个默认的ServiceAccount并没有关联任何Role。

  除了 前面使用的User,Kubernetes还有用户组(Group)的概念

  实际上一个ServiceAccount,在Kubernetes里对应的User的名字是:

  1. system:serviceaccount:<ServiceAccount 名字 >

  那它对应的Group的名字就是

  1. system:serviceaccounts:<Namespace 名字 >

  现在可以在RoleBinding里定义如下的subjects:

  1. subjects:
  2. - kind: Group
  3. name: system:serviceaccounts:mynamespace ## Role权限规则作用于Namespace里所有的ServiceAccount
  4. apiGroup: rbac.authorization.k8s.io
  5.  
  6. subjects:
  7. - kind: Group
  8. name: system:serviceaccounts ## Role权限规则作用于整个系统里所有ServiceAccount
  9. apiGroup: rbac.authorization.k8s.io
在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!

【Kubernetes】基于角色的权限控制:RBAC的更多相关文章

  1. [Kubernetes]基于角色的权限控制之RBAC

    Kubernetes中有很多种内置的编排对象,此外还可以自定义API资源类型和控制器的编写方式.那么,我能不能自己写一个编排对象呢?答案是肯定的.而这,也正是Kubernetes项目最具吸引力的地方. ...

  2. RBAC: K8s基于角色的权限控制

    文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...

  3. 图文详解基于角色的权限控制模型RBAC

    我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...

  4. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

  5. webapi框架搭建-安全机制(三)-简单的基于角色的权限控制

    webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...

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

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

  7. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  8. thinkphp基于角色的权限控制详解

    一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...

  9. Django 基于角色的权限控制

    有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看 ...

随机推荐

  1. 基于swoole的聊天室模型

    client.html: <!doctype html><html><head> <meta charset="utf-8"> &l ...

  2. 时分秒倒计时的js实现

    示例: 剩余天数:08天02事02分02秒 html代码: <div id="timer" data-timer="20160628140203" sty ...

  3. 【转】对H264进行RTP封包原理

    1. 引言     H.264/AVC 是ITU-T 视频编码专家组(VCEG)和ISO/IEC 动态图像专家组(MPEG )联合组成的联合视频组(JVT)共同努力制订的新一代视频编码标准,它最大的优 ...

  4. java官网门户源码 SSM框架 自适应-响应式 freemarker 静态模版引擎

    来源:http://www.fhadmin.org/webnewsdetail3.html 前台:支持(5+1[时尚单页风格])六套模版,可以在后台切换 官网:www.fhadmin.org 系统介绍 ...

  5. ios 开发UI篇—UITextView

    概述 UITextView可滚动的多行文本区域 UITextView支持使用自定义样式信息显示文本,并支持文本编辑.您通常使用文本视图来显示多行文本,例如在显示大型文本文档的正文时. UITextVi ...

  6. Struts2知识点小结(一)

    一.struts2简介 1.Struts2是一个基于MVC设计模式的Web应用框架        只要是web层框架 一般就会遵守MVC设计模式     2.struts2与struts1的关系?  ...

  7. 在 Mac 上通过 Docker 运行 Asp.net Core 简易教程

    首先,你需要在 Mac 上安装好 Docker 下载地址 https://download.docker.com/mac/stable/Docker.dmg 或者查看别人的 安装教程 怎么安装这里就不 ...

  8. 利用canvas将网页元素生成图片并保存在本地

    利用canvas将网页元素生成图片并保存在本地 首先引入三个文件: 1.<script type="text/javascript" src="js/html2ca ...

  9. Android ViewPager设置监听注意事项

    首先 implements View.OnClickListener 因为Item比较多用这个方便 设置监听要注意地方,如果在 onCreate 直接 findViewById布局里的ID是会出错的 ...

  10. SEO优化上首页之搜索引擎原理简要

    搜索引擎(Search Engine)是特定的计算机程序,它根据一定的策略.从互联网上搜集信息,对信息进行处理后,为用户提供检索服务,并将用户结果展示给用户. 搜索引擎优化(Search Engine ...