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. luogu P2617 Dynamic Rankings(主席树)

    嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因 ...

  2. django restframework 简单总结

    官方文档:http://www.django-rest-framework.org/ model.py class Snippet(models.Model): created = models.Da ...

  3. Python自动化之form验证二

    class LoginForm(forms.Form): user = fields.CharField() pwd = fields.CharField(validators=[]) def cle ...

  4. P1776 宝物筛选_NOI导刊2010提高(02)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  5. docker 私有仓库 harbor docker-compose

    c创建docker私有仓库 docker pull registry:2.1.1 mkdir /opt/registry#mkdir /var/lib/registry docker run -d - ...

  6. 【取色】ColorMania

    取色剂软件

  7. iOS开发用如何用类"SKStoreProductViewController"跳转AppStore点赞评分?

    大家都知道,评论和评分是决定app在appstore中排名的重要因素,但是大部分用户下载安装APP后却不会去点评,所以添加提示用户去点评的功能是很必要的. 目前,AppStore点赞评分有两种方法,一 ...

  8. #leetcode刷题之路36-有效的数独

    判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可.数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...

  9. 在windows上安装不同(两个)版本的Mysql数据库

    1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去 ...

  10. (一)U盘安装ubuntu18.04.1

    我选择安装的ubuntu18.04.1因为我的显卡是Amd RX470 ,Amd官方所兼容的版本是18.04.1, 跳过的坑:用18.04.2 18.04.3 安装amdgpu驱动各种报错 0X:下载 ...