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

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

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

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

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

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

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

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

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

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

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

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

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

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"] kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrolebinding
subjects:
- kind: User
name: example-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: example-clusterrole
apiGroup: rbac.authorization.k8s.io

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

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

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

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

rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["my-config"]
verbs: ["get"]

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

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

  首先定义一个ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
namespace: mynamespace
name: example-sa

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

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-rolebinding
namespace: mynamespace
subjects:
- kind: ServiceAccount
name: example-sa
namespace: mynamespace
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io

  接着创建这个三个对象

$ kubectl create -f svc-account.yaml
$ kubectl create -f role-binding.yaml
$ kubectl create -f role.yaml $ kubectl get sa -n mynamespace -o yaml
- apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2018-09-08T12:59:17Z
name: example-sa
namespace: mynamespace
resourceVersion: "409327"
...
secrets:
- name: example-sa-token-vmfg6

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

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

apiVersion: v1
kind: Pod
metadata:
namespace: mynamespace
name: sa-token-test
spec:
containers:
- name: nginx
image: nginx:1.7.9
serviceAccountName: example-sa $ kubectl describe pod sa-token-test -n mynamespace
Name: sa-token-test
Namespace: mynamespace
...
Containers:
nginx:
...
Mounts:
/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的名字是:

system:serviceaccount:<ServiceAccount 名字 >

  那它对应的Group的名字就是

system:serviceaccounts:<Namespace 名字 >

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

subjects:
- kind: Group
name: system:serviceaccounts:mynamespace ## Role权限规则作用于Namespace里所有的ServiceAccount
apiGroup: rbac.authorization.k8s.io subjects:
- kind: Group
name: system:serviceaccounts ## Role权限规则作用于整个系统里所有ServiceAccount
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. Oracle学习(十一):PL/SQL

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/v123411739/article/details/30231659 1.知识点:能够对照以下的录屏 ...

  2. Day12 Java异常处理与程序调试

    什么是异常? 不正常的,会影响程序的正常执行流程. 例如下面的程序 public static void main(String[] args) { TestDemo1 t = new TestDem ...

  3. web常用的正则表达式

    1.    平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2.    "^\d+$" //非负整数(正整数 + 0) 3.    "^[0 ...

  4. Spring源码分析(四)容器的基础XmlBeanFactory

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 经过Spring源码分析(二)容器基本用法和Spring源码分析(三)容 ...

  5. 谈谈我的js学习过程(二)——“Hello World!”

    在<谈谈我的js学习过程(一)>中,我简单聊了一下我认为的javascript的学习方法,接下来我们可以尝试来写一个最简单的js代码. "Hello World!"对于 ...

  6. oracle 导入报错:field in data file exceeds maximum length

    今天用sqlldr导入数据时候报错: " Record 1: Rejected - Error on table ks_test, column khname.Field in data f ...

  7. CoreText 关键性常用函数说明

    CoreText是专门进行文字绘制的函数集合 CoreText 将单个字符分为 · baseline(基线),一条假想的线,一行上的字形都以此线作为上下位置的参考,在这条线的左侧存在一个点叫做基线的原 ...

  8. JQuery中的事件委托

    JQuery 中的事件委托 定义 事件委托就是利用冒泡的原理,把事件加到父级上,通过判断事件来源的子集,执行相应的操作,事件委托首先可以极大减少事件绑定次数,提高性能:其次可以让新元素的子元素也可以拥 ...

  9. 【PHP开发规范】老生常谈的编码开发规范你懂多少?

    [PHP开发规范]老生常谈的编码开发规范你懂多少? 这几天看了一下阿里技术发布的一套Java开发规范<阿里巴巴Java开发手册>,里面写了阿里内部的Java开发规范标准,写的很好.这套Ja ...

  10. STM32中EXTI和NVIC的关系

    (1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册>C ...