1、基本概念

  RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项,相对于其他访问控制方式,新的RBAC具有如下优势:

  - 对集群中的资源和非资源权限均有完整的覆盖

    整个RBAC完全由几个API对象完成,同其他API对象一样,可以用kubectl或API进行操作

    可以在运行时进行调整,无需重启API Server

  要使用RBAC授权模式,需要在API Server的启动参数中加上--authorization-mode=RBAC

  

2、RBAC原理和用法

2.1 RBAC的API资源对象说明

  RBAC引入了4个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。同其他API资源对象一样,用户可以使用kubectl或者API调用等方式操作这些资源对象。

  - 角色(Role)

    一个角色就是一组权限的集合,这里的权限都是许可形式的,不存在拒绝的规则。在一个命名空间中,可以用角色来定义一个角色,如果是集群级别的,就需要使用ClusterRole了。

    角色只能对命名空间内的资源进行授权,下面的例子中定义的角色具备读取Pod的权限:

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: pod-reader
  6.  
  7. rules:
  8. - apiGroups: [""] # 空字符串表示核心API群
  9. resource: ["pods"]
  10. verbs: ["get", "watch", "list"]

    rules中的参数说明:

    - apiGroup:支持的API组列表,例如:APIVersion: batch/v1、APIVersion: extensions:v1、apiVersion:apps/v1等

      resources:支持的资源对象列表,例如:pods、deployments、jobs等

      verbs:对资源对象的操作方法列表,例如:get、watch、list、delete、replace、patch等

  - 集群角色(ClusterRole)

    集群角色除了具有和角色一致的命名空间内资源的管理能力,因其集群级别的范围,还可以用于以下特殊元素的授权。

    - 集群范围的资源,例如Node

      非资源型的路径,例如/healthz

      包含全部命名空间的资源,例如pods

    下面的集群角色可以让用户有权访问任意一个或所有命名空间的secrets:

  1. kind: ClusterRole
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. # name: secret-reader
  5. # ClusterRole不受限于命名空间,所以省略了namespace name的定义
  6.  
  7. rules:
  8. - apiGroups: [""]
  9. resources: ["secrets"]
  10. verbs: ["get", "watch", "list"]

  - 角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)

    角色绑定或集群角色绑定用来把一个角色绑定到一个目标上,绑定目标可以是User、Group或者Service Account。使用RoleBinding为某个命名空间授权,ClusterRoleBinding为集群范围内授权。

    RoleBinding可以引用Role进行授权,下例中的RoleBinding将在default命名空间中把pod-reader角色授予用户jane,可以让jane用户读取default命名空间的Pod:

  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: read-pods
  5. namespace: default
  6.  
  7. subjects:
  8. - kind: User
  9. name: jane
  10. apiGroup: rbac.authorization.k8s.io
  11. roleRef:
  12. kind: Role
  13. name: pod-reader
  14. apiGroup: rbac.authorization.k8s.io

    RoleBinding也可以引用ClusterRole,对属于同一命名空间内ClusterRole定义的资源主体进行授权。一种常见的做法是集群管理员为集群范围预先定义好一组角色(ClusterRole),然后在多个命名空间中重复使用这些ClusterRole。

    使用RoleBinding绑定集群角色secret-reader,使dave只能读取development命名空间中的secret:

  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: read-secrets
  5. namespace: development
  6.  
  7. subjects:
  8. - kind: User
  9. name: dave
  10. apiGroup: rbac.authorization.k8s.io
  11. roleRef:
  12. kind: ClusterRole
  13. name: secret-reader
  14. apiGroup: rbac.authorization.k8s.io

    集群角色绑定中的角色只能是集群角色,用于进行集群级别或者对所有命名空间都生效的授权。

    允许manager组的用户读取任意namespace中的secret

  1. kind: ClusterRoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: read-secrets-global
  5. subjects:
  6. - kind: Group
  7. name: manager
  8. apiGroup: rbac.authorization.k8s.io
  9. roleRef:
  10. kind: ClusterRole
  11. name: secret-reader
  12. apiGroup: rbac.authorization.k8s.io

2.2 对资源的引用方式

  多数资源可以用其名称的字符串来表达,也就是Endpoint中的URL相对路径,例如pods。然后,某些Kubernetes API包含下级资源,例如Pod的日志(logs)。Pod日志的Endpoint是GET /api/v1/namespaces/{namespaces}/pods/{name}/log。

  Pod是一个命名空间内的资源,log就是一个下级资源。要在一个RBAC角色中体现,则需要用斜线/来分割资源和下级资源。若想授权让某个主体同时能够读取Pod和Pod log,则可以配置resources为一个数组:

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: pod-and-pod-logs-reader
  6. rules:
  7. - apiGroups: [""]
  8. resources: ["pods", "pods/log"]
  9. verbs: ["get", "list"]

  资源还可以通过名字(ResourceName)进行引用。在指定ResourceName后,使用get、delete、update、patch动词的请求,就会被限制在这个资源实例范围内。例如下面的声明让一个主体只能对一个叫my-configmap的configmap进行get和update操作:

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: configmap-updater
  6. rules:
  7. - apiGroups: [""]
  8. resources: ["configmap"]
  9. resourceNames: ["my-configmap"]
  10. verbs: ["update", "get"]

2.3 常见的角色(Role)示例

  - 允许读取核心API组中Pod的资源:

  1. rules:
  2. - apiGroups: [""]
  3. resources: ["pods"]
  4. verbs: ["get", "list", "watch"]

  - 允许读写"extensions"和"apps"两个API组中的deployment资源

  1. rules:
  2. - apiGroups: ["extensions", "apps"]
  3. resources: ["deployments"]
  4. verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

  - 允许读写pods及读写jobs

  1. rules:
  2. - apiGroups: [""]
  3. resources: ["pods"]
  4. verbs: ["get", "list", "watch"]
  5. - apiGroups: ["batch", "extensions"]
  6. resources: ["jobs"]
  7. verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

  - 允许读取一个名为my-config的ConfigMap(必须绑定到一个RoleBinding来限制到一个namespace下的ConfigMap):

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

  - 读取核心组的node资源(Node属于集群级别的资源,必须放在ClusterRole中,并使用ClusterRoleBinding进行绑定):

  1. rules:
  2. - apiGroups: [""]
  3. resources: ["nodes"]
  4. verbs: ["get", "list", "watch"]

  - 允许对非资源端点/healthz及其所有子路径进行GET/POST操作(必须使用ClusterRole和ClusterRoleBinding):

  1. rules:
  2. - nonResourceURLs: ["/healthz", "/healthz/*"]
  3. verbs: ["get", "post"]

2.4 常用的角色绑定

  - 用户名Alice@example.com

  1. subjects:
  2. - kind: User
  3. name: "Alice@example.com"
  4. apiGroup: rbac.authorization.k8s.io

  - 组名frontend-admins

  1. subjects:
  2. - kind: Group
  3. name: "frontend-admins"
  4. apiGroup: rbac.authorization.k8s.io

  - kube-system命名空间中的默认Service Account

  1. subjects:
  2. - kind: ServiceAccount
  3. name: default
  4. namespace: kube-system

  - qa命名空间中的所有Service Account

  1. subjects:
  2. - kind: Group
  3. name: system:serviceaccounts:qa
  4. apiGroup: rbac.authorization.k8s.io

  - 所有Service Account

  1. subjects:
  2. - kind: Group
  3. name: system:serviceaccounts
  4. apiGroup: rbac.authorization.k8s.io

  - 所有认证用户

  1. subjects:
  2. - kind: Group
  3. name: system:authentication
  4. apiGroup: rbac.authorization.k8s.io

  - 所有未认证用户

  1. subjects:
  2. - kind: Group
  3. name: system:unauthentication
  4. apiGroup: rbac.authorization.k8s.io

  - 全部用户

  1. subjects:
  2. - kind: Group
  3. name: system:authentication
  4. apiGroup: rbac.authorization.k8s.io
  5. - kind: Group
  6. name: system:unauthentication
  7. apiGroup: rbac.authorization.k8s.io

2.5 默认的角色和角色绑定

  API Server会创建一套默认的ClusterRole和ClusterRoleBinding对象,其中很多是以system:为前缀的,以表明这些资源属于基础架构,对这些对象的改动可能造成集群故障。

  所有默认的ClusterRole和RoleBinding都会用标签kubernetes.io/bootstrapping=rbac-defaults进行标记。

  常见的系统角色如下:

  有些默认角色不是以system:为前缀的,这部分角色是针对用户的,其中包含超级用户角色cluster-admin,有的用于集群一级的角色cluster-status,还有针对namespace的角色admin、edit、view

  常见的用户角色如下:

- 核心Master组件角色

2.6 授权注意事项:预防提权和授权初始化

  RBAC API拒绝用户利用编辑角色或者角色绑定的方式进行提权。这一限制是在API层面做出的,因此即使RBAC没有启用也仍然有效。

  用户只能在拥有一个角色的所有权限,且与该角色的生效范围一致的前提下,才能对角色进行创建和更新。例如用户user-1没有列出集群中所有secret的权限,就不能创建具有这一权限的集群角色。要让一个用户能够创建或更新角色,需要以下权限:

  - 为其授予一个允许创建/更新Role或ClusterRole资源对象的角色;

    为用户授予角色,要覆盖该用户所能控制的所有权限范围。用户如果尝试创建超出其自身权限的角色或者集群角色,则该API调用会被禁止。

  如果一个用户的权限包含了一个角色的所有权限,那么就可以为其创建和更新角色绑定;或者如果被授予了针对某个角色的绑定授权,则也有权完成此操作。

  例如:user1没有列出集群内所有secret的权限,就无法为一个具有这样权限的角色创建集群角色绑定。要使用户能够创建、更新这一角色绑定,则需要有如下做法:

  - 为其授予一个允许创建和更新角色绑定或者集群角色绑定的角色

    为其授予绑定某一角色的权限,有隐式或显式两种方法

    - 隐式:让其具有所有该角色的权限

    - 显式:让用户授予针对该角色或集群角色绑定操作的权限

  让user-1有对user-1-namespace命名空间中的其他用户授予admin、edit及view角色

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: role-grantor
  5. rules:
  6. - apiGroups: ["rbac.authorization.k8s.io"]
  7. resources: ["rolebindings"]
  8. verbs: ["create"]
  9. - apiGroups: ["rbac.authorization.k8s.io"]
  10. resources: ["clusterroles"]
  11. verbs: ["bind"]
  12. resourceNames: ["admin", "edit", "view"]
  13. ---
  14. apiVersion: rbac.authorization.k8s.io/v1
  15. kind: RoleBinding
  16. metadata:
  17. name: role-grantor-binding
  18. namespace: user--namespace
  19. roleRef:
  20. apiGroup: rbac.authorization.k8s.io
  21. kind: ClusterRole
  22. name: role-grantor
  23. subjects:
  24. - apiGroup: rbac.authorization.k8s.io
  25. kind: User
  26. name: user-

  在进行第一个角色和角色绑定时,必须让初始用户具备其尚未被授予的权限,要进行初始的角色和角色绑定设置,有以下两种方法:

  - 使用属于system:masters组的身份,这一群组默认具有cluster-admin这一超级角色的绑定。

    如果API Server以--insecure-port参数运行,则客户端通过这个非安全端口进行接口调用,这一端口没有认证鉴权的限制。

原文:https://www.cnblogs.com/dukuan/p/9948063.html

kubernetes(k8s)集群安全机制RBAC的更多相关文章

  1. kubernetes实战(八):k8s集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  2. 5.基于二进制部署kubernetes(k8s)集群

    1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...

  3. Centos7 安装部署Kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...

  4. Kubernetes-深入分析集群安全机制

    Kubernetes过一系列机制来实现集群的安全机制,包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群的安全性必须考虑以下的几个目标: 保证容器与其所在宿主机的 ...

  5. 使用kubectl管理Kubernetes(k8s)集群:常用命令,查看负载,命名空间namespace管理

    目录 一.系统环境 二.前言 三.kubectl 3.1 kubectl语法 3.2 kubectl格式化输出 四.kubectl常用命令 五.查看kubernetes集群node节点和pod负载 5 ...

  6. Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理

    上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

  8. 一键运行CIS安全扫描,集群安全无忧!

    CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...

  9. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

随机推荐

  1. 彻底理解 JS 中 this 的指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  2. 轻松解决U盘拷贝文件时提示文件过大问题

    现在的高科技时代生活中,u盘的使用已经是许多从事电脑it行业的人每天都必须要用到的用具.可以在一台电脑上使用u盘拷贝文件到另外一台电脑上进行使用,加上它的身材小巧,非常方便我们随身携带到任何地方进行使 ...

  3. Service系统服务(一):安装一个KVM服务器、KVM平台构建及简单管理、virsh基本管理操作、xml配置文件的应用、为虚拟机制作快照备份、快建新虚拟机

    一.安装一个KVM服务器 目标: 本例要求准备一台 RHEL7.2 服务器,将其搭建为KVM平台,主要完成下列操作: 1> 关闭本机的SELinux保护.防火墙服务   2> 挂载RHEL ...

  4. 利用core_pattern实现core文件的配置和管理

    参考:https://xz.aliyun.com/t/1098 这里所说的core_pattern 指的是:/proc/sys/kernel/core_pattern. 我们知道在Linux系统中,如 ...

  5. python四种方法实现去除列表中的重复元素

    转载:https://blog.csdn.net/together_cz/article/details/76201975 def func1(one_list): ''''' 使用集合,个人最常用 ...

  6. MySQL concat、concat_ws 和 group_concat 的用法

    一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...

  7. 异步编程与scrapy

    https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter1/index.html https: ...

  8. RHEL6.1 安装 Oracle10gr2 (图文、解析)

    目录 目录 软件环境 前言 初始化RHEL61 硬件检测 预安装软件包 安装oratoolkit 创建Oracle用户 修改配置文件 系统版本伪装 解压并运行Oracle10gr2安装包 安装rlwr ...

  9. Leetcode_415字符串相加

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: ①num1 和num2 的长度都小于 5100.②num1 和num2 都只包含数字 0-9.③num1 和num2 都不 ...

  10. 卷积实现 python

    import sys h, w = input().strip().split() h = int(h) w = int(w) img = [] for i in range(h): line = s ...