kubernetes-鉴权体系、RBAC介绍、role、rolebing、clusterrolebing示例

1,581 阅读6分钟

Kubernetes的鉴权体系

API Server中的鉴权框架及启用的鉴权模块负责鉴权

支持的鉴权模块

  • Node:专用的授权模块,它基于kubelet将要运行的Pod向kubelet进行授权;
  • ABAC:通过将属性(包括资源属性、用户属性、对象和环境属性等)组合 在一起的策略,将访问权限授予用户
    • 使用太复杂
    • 零信任场景
    • 需要鉴权引擎 配合使用
  • RBAC:基于企业内个人用户的角色来管理对计算机或网络资源的访问的鉴权方法
    • 公司内不同职位的人 有不同的权限
    • 基于角色的授权
  • Webhook:用于支持同Kubernetes外部的授权机制进行集成

另外两个特殊的鉴权模块是

  • AlwaysDeny 一直拒绝
  • AlwaysAllow 一直允许

配置方法

  • 在kube-apiserver上使用 --authorization-mode 选项进行定义
  • kubeadm部署的集群,默认启用了Node和RBAC
  • 多个模块彼此间以逗号分隔

RBAC术语

基于角色的授权

实体(Entity)

在RBAC也称为Subject,通常指的是User、Group或者是ServiceAccount

角色(Role)

承载资源操作权限的容器

资源(Resource)

在RBAC中也称为Object,指代Subject期望操作的目标,例如Secret、Pod及Service对象等

  • 仅限于/api/v1/…及/apis///…起始的路径
  • 其它路径对应的端点均被视作“非资源类请求(Non-Resource Requests)”,例如/api或/healthz等端点

动作(Actions)

Subject可以于Object上执行的特定操作,具体的可用动作取决于Kubernetes的定义

  • 资源型对象
    • 只读操作:get、list、watch等
    • 读写操作:create、update、patch、delete、deletecollection等
  • 非资源型端点仅支持get操作
    • “非资源类请求(Non-Resource Requests)”,例如/api或/healthz等端点

角色绑定(Role Binding)

将角色关联至实体上,它能够将角色具体的操作权限赋予给实体 RoleBinding ClusterRoleBinding

RBAC 的基础概念

角色的类型

Cluster级别

称为ClusterRole,定义集群范围内的资源操作权限集合, 包括

  • 集群级别
  • 名称空间级别的资源对象

Namespace级别

称为Role,定义名称空间范围内的资源操作权限集合 包括

  • 名称空间级别的资源对象

角色绑定的类型

ClusterRoleBinding

Cluster级别 可以将实体(User、Group或 ServiceAccount)关联至ClusterRole

RoleBinding

Namespace级别 可以将实体(User、Group或 ServiceAccount)关联至 Role

特殊地 可以实体(User、Group或 ServiceAccount)关联至 ClusterRole

  • 即便将Subject使用RoleBinding关联到了ClusterRole上,该角色赋予到Subject的权限
  • 也会降级到RoleBinding所属的Namespace范围之内 只会在交集内的权限 生效

权限范围的描述

image.png

RBAC默认启用后 apiserver所有的客户端, 其请求都需要得到明确的许可授权 才能执行对应的动作 内置了很多clusterrole 和clusterrolebinding

RBAC的基本工作逻辑

image.png

默认的ClusterRole及ClusterRoleBinding

启用RBAC鉴权模块时,API Server会自动创建一组ClusterRole和ClusterRoleBinding对象

  • 多数都以“system:”为前缀,也有几个面向用户的ClusterRole未使用该前缀,如cluster-admin、admin等
  • 它们都默认使用“kubernetes.io/bootstrapping: rbac-defaults”这一标签

ClusterRole的类别

都有哪些clusterrole资源

kubectl get clusterrole

image.png

1、API发现相关的角色

  • system:basic-user
  • system:discovery
  • system:public-info-viewer

2、面向用户的角色

  • cluster-admin
  • admin
  • edit
  • view

3、核心组件专用的角色

  • system:kube-scheduler
  • system:volume-scheduler
  • system:kube-controller-manager
  • system:node
  • system:node-proxier

4、其它组件专用的角色

  • system:kube-dns
  • system:node-bootstrapper
  • system:node-problem-detector 节点问题探测 cpu负载 磁盘打满的问题探测
  • system:monitoring 监控相关的

5、内置控制器专用的角色

...省略

命令使用

查看clusterrole 可以执行的权限细节

kubectl get clusterrole flannel -o yaml

image.png

查看当前的clusterrolebinding 关联情况

kubectl get clusterrolebinding

kubectl get clusterrolebinding cluster-admin -o yaml

image.png

让tom成为管理员

kubectl create clusterrolebinding  make_tom_as_clusteradmin --user=tom --clusterrole=cluster-admin

image.png

tom 有权限操作了 image.png

给mason用户 绑定读权限

kubectl create role pods-reader --verb=get --verb=list --verb=watch --resource=pods

--resource 指定资源类型 --resource-name 指定对象

image.png

kubectl create rolebinding mason-as-reading --user=mason --role pods-reader

image.png

可以看到mason能够get pods image.png

但是mason 不能看别的资源 image.png

给mason用户绑定一个view权限 仅限default空间

kubectl create rolebinding mason-as-reading --user=mason --clusterrole view

mason 可以只可以查看default空间下的所有资源 image.png

给mason用户绑定一个view权限 整个集群的 名称空间都要看到

kubectl create clusterrolebinding mason-as-reading --user=mason --clusterrole view

mason 只可以查看所有空间下的所有资源 image.png

面向用户的角色

clusterrole 角色种类介绍

image.png

cluster-admin

system:masters 组 集群级别的管理权限

允许用户在目标范围内的任意资源上执行任意操作; 使用ClusterRoleBinding关联至用户时,授权操作集群及所有名称空间中任何资源; 使用RoleBinding关联至用户时,授权控制其所属名称空间中的所有资源,包括Namespace资源自身;

admin

管理员权限 名称空间级别的管理权限

  • 主要用于结合RoleBinding为 特定名称空间快速授权生成管理员用户
  • 它能够将RoleBinding所属名称空间中的大多数资源的读/写权限授予目标用户
  • 包括创建Role和RoleBinding的能力;
  • 但不支持对ResourceQuota及Namespace本身进行操作;

edit

接近于admin的权限

  • 支持对名称空间内的大多数对象进行读/写操作 包括Secret
  • 但不允许查看或修改Role及RoleBinding;

view

允许以只读方式访问名称空间中的大多数对象,但不包括Role、RoleBinding和Secret

image.png

Role 资源

命令式命令

kubectl create role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] 
# verb:允许在资源上使用的操作(verb)列表 
# resources.group/subresource:操作可施加的目标资源类型或子资源列表 
# resourcename:特定的资源对象列表,可选 

示例

kubectl create role pods-viewer --verb="get,list,watch" --resource="pods" --namespace=default

生成的资源对象的资源配置

image.png

ClusterRole和ClusterRoleBinding

命令式命令

ClusterRole:kubectl create clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename] 
ClusterRoleBinding:kubectl create clusterrolebinding NAME --clusterrole=NAME [--user=username] [--group=groupname] [-- serviceaccount=namespace:serviceaccountname] 

示例

kubectl create clusterrolebinding mason --clusterrole=view --group=developers 

资源规范

ClusterRole的资源规范同Role相似 ClusterRoleBidning的资源规范跟RoleBinding相似

案例:Prometheus Server的权限需求

将Prometheus部署运行于Kubernetes之上并监控集群时,需要使用专用的ServiceAccount运行prometheus-server相关的Pod;

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-master
  namespace: jenkins

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-master
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-master
roleRef:
  kind: ClusterRole
  name: jenkins-master
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: jenkins-master
  namespace: jenkins

案例:Jenkins Master 的权限需求

运行于Kubernetes之上的Jenkins,为了能够动态创建jenkins

github.com/iKubernetes…

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-master
  namespace: jenkins

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-master
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-master
roleRef:
  kind: ClusterRole
  name: jenkins-master
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: jenkins-master
  namespace: jenkins

promethues创建

github.com/iKubernetes…

github.com/iKubernetes…