kubernetes(k8s)之rbac权限管理详解

RBAC简介

RBAC(Role-Based Access Control)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C5QFijae-1660472909213)(C:\Users\83493\AppData\Roaming\Typora\typora-user-images\1659504463105.png)]

基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对 计算机或网络资源的访问的方法。

kubernetes集群相关所有操作都是通过apiserver来完成的,RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组来驱动鉴权决定, 允许你通过 Kubernetes API 动态配置策略。

RBAC API 声明了四种 Kubernetes 对象,RoleClusterRoleRoleBindingClusterRoleBinding。可以像使用其他 Kubernetes 对象一样,通过类似 kubectl 这类工具描述对象, 或修补对象。

kubernetes启用rbac

启用rbac需要在apiserver启动添加参数--authorization-mode=RBAC

# grep 'authorization-mode' /opt/TLS/k8s/cfg/kube-apiserver.conf
--authorization-mode=RBAC,Node \

API Server目前支持以下几种授权策略:

  • AlwaysDeny:表示拒绝所有请求,一般用于测试。
  • AlwaysAllow:允许接收所有请求。 如果集群不需要授权流程,则可以采用该策略,这也是Kubernetes的默认配置。
  • ABAC(Attribute-Based Access Control):基于属性的访问控制。 表示使用用户配置的授权规则对用户请求进行匹配和控制。
  • Webhook:通过调用外部REST服务对用户进行授权。
  • RBAC:Role-Based Access Control,基于角色的访问控制。
  • Node:是一种专用模式,用于对kubelet发出的请求进行访问控制。

用户分类

k8s用户分两种,一钟是普通用户,一种是serviceaccount服务账户

普通用户

普通用户是被外部或独立服务管理的,使用的kubectl命令则是普通用户,为Linux创建的用户

普通用户需求权限,通过role与user(或group)绑定,给用户使用

serviceaccount

serviceaccount使用kubernetes API管理的用户。它们绑定到特定的命名空间,并由api服务器自动创建或通过api调用手动创建

如果程序需求权限,通过role与serviceaccount指定,创建serviceaccount并且在资源对象钟指定serviceaccount,给程序使用

k8s角色和角色绑定

授权介绍

RBAC 的 RoleClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。 通过定义角色、绑定角色进行授权

角色

  • Role:授权特定命名空间的访问权限
  • ClusterRole:授权所有命名空间的访问权限

角色绑定

  • RoleBinding:将角色绑定到主体(即subject)
  • ClusterRoleBinding:将集群角色绑定到主体

主体(subject)

  • User:用户
  • Group:用户组
  • ServiceAccount:服务账号

图解如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMeZdQBl-1660472909214)(C:\Users\83493\AppData\Roaming\Typora\typora-user-images\1659505770340.png)]

实例

role

role资源清单详解

官方:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authorization-resources/role-v1/

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:   #标准的对象元数据。name:   #role名称。namespace:  #role权限对应的namespace。
rules:   #rules 包含了这个 Role 的所有 PolicyRule。apiGroups:   #apiGroups 是包含资源的 apiGroup 的名称。nonResourceURLs:   #nonResourceURLs 是用户应有权访问的一组部分 URL。resourceNames:   #resourceNames 是此规则所适用的资源名称白名单,空为所有资源。resources:   #resources 是此规则所适用的资源的列表。 “*” 表示所有资源。verbs:   #verbs 是适用于此规则中所包含的所有 ResourceKinds 的动作。 “*” 表示所有动作。

对某个资源类型的权限分配

编写yaml文件

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: default   #位于default命名空间name: pod-reader   #role名称
rules:
- apiGroups: [""]   # "" 标明 core API 组resources: ["pods"]   #资源对象verbs: ["get", "watch", "list"]   #权限

查看

# kubectl describe role pod-reader
Name:         pod-reader
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----pods       []                 []              [get watch list]

获取某个资源的子资源

pods 对应名字空间作用域的 Pod 资源,而 logpods 的子资源。 在 RBAC 角色表达子资源时,使用斜线(/)来分隔资源和子资源。

编写yaml文件

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: default   #位于default命名空间name: pod-and-pod-logs-reader   #role名称
rules:
- apiGroups: [""]   # "" 标明 core API 组resources: ["pods", "pods/log"]   #资源对象和资源对象的子资源verbs: ["get", "list"]   #权限

查看

# kubectl describe role pod-and-pod-logs-reader
Name:         pod-and-pod-logs-reader
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----pods/log   []                 []              [get list]pods       []                 []              [get list]

配置某一个具体资源的权限

对于某些请求,也可以通过 resourceNames 列表按名称引用资源。 在指定时,可以将请求限定为资源的单个实例。

编写yaml文件

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: default   #位于default命名空间name: default-configmap-updater   #role名称
rules:
- apiGroups: [""]resources: ["configmaps"]   # 在 HTTP 层面,用来访问 ConfigMap 资源的名称为 "configmaps"resourceNames: ["my-configmap"]   #名为my-configmap的configmap资源verbs: ["update", "get"]   #权限

查看

# kubectl describe role default-configmap-updater
Name:         default-configmap-updater
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources   Non-Resource URLs  Resource Names  Verbs---------   -----------------  --------------  -----configmaps  []                 [my-configmap]  [update get]

clusterrole

clusterrole资源清单

官方:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authorization-resources/cluster-role-v1/

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:   #标准的对象元数据。name:   #clusterrole名称。
aggregationRule:   #描述如何定位并聚合其它 ClusterRole 到此 ClusterRole。clusterRoleSelectors:   #保存了一个选择器列表,用于查找ClusterRoles和创建规则。matchLabels:   #选择运算符。
rules:   #rules 包含了这个 ClusterRole 的所有 PolicyRule。apiGroups:   #apiGroups 是包含资源的 apiGroup 的名称。nonResourceURLs:   #nonResourceURLs 是用户应有权访问的一组部分 URL。resourceNames:   #resourceNames 是此规则所适用的资源名称白名单,空为所有资源。resources:   #resources 是此规则所适用的资源的列表。“*” 表示所有资源。verbs:   #verbs 是适用于此规则中所包含的所有 ResourceKinds 的动作。 “*” 表示所有动作。

clusterrole示例

ClusterRole 可以和 Role 相同完成授权。 因为 ClusterRole 属于集群范围,所以它也可以为以下资源授予访问权限:

  • 集群范围资源(比如节点Node)

  • 非资源端点(比如 /healthz

  • 跨名字空间访问的名字空间作用域的资源(如 Pod)

    比如,你可以使用 ClusterRole 来允许某特定用户执行 kubectl get pods --all-namespaces

下面是一个 ClusterRole 的示例,可用来为任一特定名字空间中的 Secret授予读访问权限, 或者跨名字空间的访问权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制name: secret-reader   #clusterrole集群名字
rules:
- apiGroups: [""]resources: ["secrets"]   # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"verbs: ["get", "watch", "list"]   #权限

查看

# kubectl describe clusterrole secret-reader
Name:         secret-reader
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----secrets    []                 []              [get list watch]

aggregationRule聚合ClusteRole

你可以将若干 ClusterRole 聚合(Aggregate) 起来,形成一个复合的 ClusterRole。 作为集群控制面的一部分,控制器会监视带有 aggregationRule 的 ClusterRole 对象集合。aggregationRule 为控制器定义一个标签 选择算符供后者匹配 应该组合到当前 ClusterRole 的 roles 字段中的 ClusterRole 对象。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: monitoring   #clusterrole名称
aggregationRule:   #描述聚合其他clusterroleclusterRoleSelectors:   #clusterrole标签选择器- matchLabels:   #选择运算符rbac.example.com/aggregate-to-monitoring: "true"
rules: [] # 控制面自动填充这里的规则

查看

# kubectl describe clusterrole monitoring
Name:         monitoring
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----

创建一个与某个已存在的聚合 ClusterRole 的标签选择算符匹配的 ClusterRole, 这一变化会触发新的规则被添加到聚合 ClusterRole 的操作。 下面的例子中,通过创建一个标签同样为 rbac.example.com/aggregate-to-monitoring: true 的 ClusterRole,新的规则可被添加到 “monitoring” ClusterRole 中。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: monitoring-endpoints   #clusterrole名称labels:   #clusterrole标签rbac.example.com/aggregate-to-monitoring: "true"
# 当创建 "monitoring-endpoints" ClusterRole 时,
# 下面的规则会被添加到 "monitoring" ClusterRole 中
rules:
- apiGroups: [""]resources: ["services", "endpoints", "pods"]verbs: ["get", "list", "watch"]

查看monitoring-endpoints

# kubectl describe clusterrole monitoring-endpoints
Name:         monitoring-endpoints
Labels:       rbac.example.com/aggregate-to-monitoring=true
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----endpoints  []                 []              [get list watch]pods       []                 []              [get list watch]services   []                 []              [get list watch]

再次查看monitoring

# kubectl describe clusterrole monitoring
Name:         monitoring
Labels:       <none>
Annotations:  <none>
PolicyRule:Resources  Non-Resource URLs  Resource Names  Verbs---------  -----------------  --------------  -----endpoints  []                 []              [get list watch]pods       []                 []              [get list watch]services   []                 []              [get list watch]

RoleBinding

RoleBinding资源清单

官方:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authorization-resources/role-binding-v1/

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:   #标准的对象元数据。name:   #rolebinding名称。
roleRef:   #包含指向正被使用的角色的信息。apiGroup:   #被引用资源的组。kind:   #被引用的资源的类别。name:   #被引用的资源的名称。
subjects:   #角色所适用的对象的引用。apiGroup:   #apiGroup 包含被引用主体的 API 组。kind:   #被引用的对象的类别。name:   #被引用的对象的名称。namespace:   #被引用的对象的命名空间。

RoleBinding绑定Role

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pod
# 你需要在该命名空间中有一个名为 “pod-reader” 的 Role
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: Username: jane # "name" 是区分大小写的apiGroup: rbac.authorization.k8s.io
roleRef:# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系kind: Role        # 此字段必须是 Role 或 ClusterRolename: pod-reader  # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配apiGroup: rbac.authorization.k8s.io

查看

# kubectl describe rolebinding read-pods
Name:         read-pods
Labels:       <none>
Annotations:  <none>
Role:Kind:  RoleName:  pod-reader
Subjects:Kind  Name  Namespace----  ----  ---------User  jane

检查是否

# useradd jane
# cp -rf /root/.kube/ /home/jane/
# chown -R jane:jane /home/jane/
# su jane
$ kubectl config get-contexts
CURRENT   NAME      CLUSTER      AUTHINFO        NAMESPACE
*         default   kubernetes   cluster-admin   $ kubectl config set-context jane@kubernetes --cluster=kubernetes --user=jane --namespace=default
Context "jane@kubernetes" created.$ kubectl config use-context jane@kubernetes
Switched to context "jane@kubernetes".$ kubectl config get-contexts
CURRENT   NAME              CLUSTER      AUTHINFO        NAMESPACEdefault           kubernetes   cluster-admin
*         jane@kubernetes   kubernetes   jane            default

RoleBinding绑定ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定使得用户 "dave" 能够读取 "development" 名字空间中的 Secrets
# 你需要一个名为 "secret-reader" 的 ClusterRole
kind: RoleBinding
metadata:name: read-secrets# RoleBinding 的名字空间决定了访问权限的授予范围。# 这里隐含授权仅在 "development" 名字空间内的访问权限。namespace: development
subjects:
- kind: Username: dave # 'name' 是区分大小写的apiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

查看

# kubectl describe -n development rolebinding
Name:         read-secrets
Labels:       <none>
Annotations:  <none>
Role:Kind:  ClusterRoleName:  secret-reader
Subjects:Kind  Name  Namespace----  ----  ---------User  dave

ClusterRoleBinding

ClusterRoleBinding资源清单

官方:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authorization-resources/cluster-role-binding-v1/

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:   #标准对象的元数据。name:   #clusterrolebinding名称。
roleRef:   #指向正被使用的角色的信息。apiGroup:   #被引用资源的组。kind:   #被引用的资源的类别。name:   #被引用的资源的名称
subjects:   #角色所适用的对象的引用。apiGroup:   #被引用主体的 API 组。kind:   #被引用的对象的类别。name:   #被引用的对象的名称。namespace:   #被引用对象的命名空间。

ClusterRoleBinding绑定某个组

apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 Secret 资源
kind: ClusterRoleBinding
metadata:name: read-secrets-global
subjects:
- kind: Groupname: manager      # 'name' 是区分大小写的apiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

查看

# kubectl describe clusterrolebinding read-secrets-global
Name:         read-secrets-global
Labels:       <none>
Annotations:  <none>
Role:Kind:  ClusterRoleName:  secret-reader
Subjects:Kind   Name     Namespace----   ----     ---------Group  manager

ClusterRoleBinding绑定某个用户

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: user-read-secrets-global
subjects:
- kind: Username: manager-user     apiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

查看

# kubectl describe clusterrolebinding user-read-secrets-global
Name:         user-read-secrets-global
Labels:       <none>
Annotations:  <none>
Role:Kind:  ClusterRoleName:  secret-reader
Subjects:Kind  Name          Namespace----  ----          ---------User  manager-user

服务账号在 kube-system 命名空间中:

subjects:
- kind: ServiceAccountname: defaultnamespace: kube-system

在名称为 “qa” 命名空间中所有的服务账号:

subjects:
- kind: Groupname: system:serviceaccounts:qaapiGroup: rbac.authorization.k8s.io

所有的服务账号:

subjects:
- kind: Groupname: system:serviceaccountsapiGroup: rbac.authorization.k8s.io

所有认证过的用户 (版本 1.5+):

subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io

所有未认证的用户 (版本 1.5+):

subjects:
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io

所有用户 (版本 1.5+):

subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io

参考

Group
name: system:serviceaccounts
apiGroup: rbac.authorization.k8s.io


所有认证过的用户 (版本 1.5+):```javascript
subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io

所有未认证的用户 (版本 1.5+):

subjects:
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io

所有用户 (版本 1.5+):

subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io

参考

https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/#restrictions-on-role-creation-or-update

kubernetes(k8s)之rbac权限管理详解相关推荐

  1. rbac权限管理5张表_PHP之常用的RBAC权限管理详解

    文章正文 在说权限管理前,应该先知道权限管理要有哪些功能: (1).用户只能访问,指定的控制器,指定的方法 (2).用户可以存在于多个用户组里 (3).用户组可以选择,指定的控制器,指定的方法 (4) ...

  2. Shiro权限管理详解(授权和注解开发)【面试点】

    Shiro权限管理详解 1. 权限管理 1.1什么是权限管理 1.2用户身份认证 1.2.1 概念 1.2.2 用户名密码身份认证流程 1.2.3 关键对象 1.3 授权 1.3.1 概念 1.3.2 ...

  3. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  4. Linux账号和权限管理详解(超详细示例操作)!

    Linux账号和权限管理详解 一.用户账号和组账号概述 1.1 Linux基于用户身份对资源访问进行控制 1.2 用户账号 1.3 组账号 二.用户账号文件 2.1 用户账号文件 /etc/passw ...

  5. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  6. Linux—目录文件属性和权限管理详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   Linux中了解用户和用户组概念后,我们就需要对文件目录进行赋权操作,以便于文件访问权限的管控,这就涉及到文件的属性,那用户和用 ...

  7. RBAC权限模型详解

    RBAC模型概述 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是20世纪90年代研究出来的一种新模型,但其实在20世纪70年代的多用户计算时期,这种思想就 ...

  8. JAVAWEB开发之权限管理(一)——权限管理详解(权限管理原理以及方案)、不使用权限框架的原始授权方式详解

    知识清单 1.了解基于资源的权限管理方式 2. 掌握权限数据模型 3. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户 ...

  9. Shiro权限管理详解

    1权限管理1.1什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权 ...

最新文章

  1. PHP小题目 求 1*3+5*7+…+97*99的值
  2. 信号与系统:快速傅里叶变换FFT中的实际频率(奈奎斯特频率解析)
  3. centos 配置redis
  4. uwsgi+python+flask+nginx服务器部署
  5. 高效利用无标注数据:自监督学习简述
  6. 从word得到表格数据插入数据库(6位行业代码)
  7. python函数参数的作用是_python函数参数的不同
  8. Python 图形 GUI 库 pyqtgraph
  9. Android 4.0 ICS SystemUI浅析——SystemUI启动流程
  10. 《梦断代码》读书笔记——第3、4、5章
  11. TransCoder介绍
  12. PLC编程入门基础知识
  13. vtuber面部捕捉工具_Live2D纸片人出道?VTuber工具VUP了解下
  14. foxmail设置,服务器备份(很实用)
  15. c51编译器+linux,C51 开源编译器SDCC学习笔记-安装
  16. 使用 Entrust Lar…
  17. Unity 实战项目 ☀️| Unity实现 天空盒 轮播系列切换
  18. Class热替换与卸载
  19. 或是独体字吗_独体字结构 独体结构的字有哪些字?
  20. 百度地图 - 添加区划覆盖物 - 循环打点

热门文章

  1. 李力,清华大学多车协同讲座:笔记
  2. Beta版,外部测试版
  3. 【高等数学】各类函数的导数与微分求导法
  4. 金仓数据库KingbaseES服务启动方法
  5. 国家计算机二级考试常用函数,计算机二级Excel常考函数公式详解!
  6. python自动排课表_利用python爬取广西科技大学教务管理信息系统班级课表
  7. 华为Vo5G技术EPSFB
  8. bugku平台 头等舱
  9. ML之FE:PCC皮尔逊相关系数(Pearson correlation coefficient)的简介、案例应用(与spearman相关系数对比及其代码实现)之详细攻略
  10. 破茧成蝶之用户体验设计师的成长之路-设计实施