Kubernetes K8S之鉴权概述与RBAC详解

K8S认证与授权

认证「Authentication」

认证有如下几种方式:

1、HTTP Token认证:通过一个Token来识别合法用户。

HTTP Token的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串来表达客户的一种方式。每一个Token对应一个用户名,存储在API Server能访问的文件中。当客户端发起API调用请求时,需要在HTTP Header里放入Token。

2、HTTP Base认证:通过用户名+密码的方式认证

用户名:密码 用base64算法进行编码后的字符串放在HTTP Request中的Heather Authorization 域里发送给服务端,服务端收到后进行解码,获取用户名和密码。

3、最严格的HTTPS证书认证:基于CA根证书签名的客户端身份认证方式

授权「Authorization」

认证只是确认通信的双方都是可信的,可以相互通信。而授权是确定请求方有哪些资源的权限。API Server目前支持如下几种授权策略(通过API Server的启动参数 --authorization-mode 设置)

  • AlwaysDeny:表示拒绝所有请求。仅用于测试
  • AlwaysAllow:表示允许所有请求。如果有集群不需要授权流程,则可以采用该策略
  • Node:节点授权是一种特殊用途的授权模式,专门授权由 kubelet 发出的 API 请求
  • Webhook:是一种 HTTP 回调模式,允许使用远程 REST 端点管理授权
  • ABAC:基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  • RBAC:基于角色的访问控制,默认使用该规则

RBAC授权模式

RBAC(Role-Based Access Control)基于角色的访问控制,在Kubernetes 1.5 中引入,现为默认标准。相对其他访问控制方式,拥有如下优势:

1、对集群中的资源和非资源均拥有完整的覆盖

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

3、可以在运行时进行操作,无需重启API Server

RBAC API类型

RBAC API 所声明的四种顶级类型【Role、ClusterRole、RoleBinding 和 ClusterRoleBinding】。用户可以像与其他 API 资源交互一样,(通过 kubectl API 调用等方式)与这些资源交互。

Role 和 ClusterRole

在 RBAC API 中,一个角色包含一组相关权限的规则。权限是纯粹累加的(不存在拒绝某操作的规则),即只能给权限累加,不存在给了XX权限,然后去掉XX01权限的情况。角色可以用 Role 来定义到某个命名空间(namespace)上, 或者用 ClusterRole 来定义到整个集群作用域(所有namespace)。

一个 Role 只可以用来对某一命名空间中的资源赋予访问权限。

Role示例:

定义到名称为 “default” 的命名空间,可以用来授予对该命名空间中的 Pods 的读取权限:

1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: Role
3 metadata:
4 name: pod-reader
5 namespace: default
6 rules:
7 - apiGroups: [""] # "" 指定核心 API 组
8 resources: ["pods"]
9 verbs: ["get", "watch", "list"]

ClusterRole 可以授予的权限和 Role 相同,但是因为 ClusterRole 属于集群范围,所以它也可以授予以下访问权限:

  • 集群范围资源 (比如 nodes访问)
  • 非资源端点(比如 “/healthz” 访问)
  • 跨命名空间访问的有名称空间作用域的资源(如 Pods),比如运行命令kubectl get pods --all-namespaces 时需要此能力
ClusterRole示例

可用来对某特定命名空间下的 Secrets 的读取操作授权,或者跨所有名称空间执行授权(取决于它是如何绑定的):

1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 name: secret-reader
5 # 此处的 "namespace" 被省略掉是因为 ClusterRoles 是没有命名空间的。
6 rules:
7 - apiGroups: [""]
8 resources: ["secrets"]
9 verbs: ["get", "watch", "list"]

RoleBinding 和 ClusterRoleBinding

角色绑定(RoleBinding)是将角色中定义的权限赋予一个用户或者一组用户。 它包含若干主体【subjects】(users、groups或 service accounts)的列表和对这些主体所获得的角色引用。

可以使用 RoleBinding 在指定的命名空间中执行授权,或者在集群范围的命名空间使用 ClusterRoleBinding 来执行授权。

一个 RoleBinding 可以引用同一的命名空间中的 Role。

RoleBinding示例

将 “pod-reader” 角色授予在 “default” 命名空间中的用户 “jane”; 这样,用户 “jane” 就具有了读取 “default” 命名空间中 pods 的权限。

在下面的例子中,角色绑定使用 roleRef 将用户 “jane” 绑定到前文创建的角色 Role,其名称是 pod-reader。

 1 apiVersion: rbac.authorization.k8s.io/v1
2 # 此角色绑定,使得用户 "jane" 能够读取 "default" 命名空间中的 Pods
3 kind: RoleBinding
4 metadata:
5 name: read-pods
6 namespace: default
7 subjects:
8 - kind: User
9 name: jane # 名称大小写敏感
10 apiGroup: rbac.authorization.k8s.io
11 roleRef:
12 kind: Role #this must be Role or ClusterRole
13 name: pod-reader # 这里的名称必须与你想要绑定的 Role 或 ClusterRole 名称一致
14 apiGroup: rbac.authorization.k8s.io

roleRef 里的内容决定了实际创建绑定的方法。kind 可以是 Role 或 ClusterRole,name 是你要引用的 Role 或 ClusterRole 的名称。

RoleBinding 也可以引用 ClusterRole,这可以允许管理者在 整个集群中定义一组通用的角色,然后在多个命名空间中重用它们。

RoleBinding示例2

下面的例子,RoleBinding 引用的是 ClusterRole, “dave” (subjects区分大小写)将只可以读取在”development” 名称空间( RoleBinding 的命名空间)中的”secrets” 。

 1 apiVersion: rbac.authorization.k8s.io/v1
2 # 这个角色绑定允许 "dave" 用户在 "development" 命名空间中有读取 secrets 的权限。
3 kind: RoleBinding
4 metadata:
5 name: read-secrets
6 namespace: development # 这里只授予 "development" 命名空间的权限。
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

最后,ClusterRoleBinding 可用来在集群级别并对所有命名空间执行授权。

ClusterRoleBinding示例
 1 apiVersion: rbac.authorization.k8s.io/v1
2 # 这个集群角色绑定允许 "manager" 组中的任何用户读取任意命名空间中 "secrets"。
3 kind: ClusterRoleBinding
4 metadata:
5 name: read-secrets-global
6 subjects:
7 - kind: Group
8 name: manager # 名称区分大小写
9 apiGroup: rbac.authorization.k8s.io
10 roleRef:
11 kind: ClusterRole
12 name: secret-reader
13 apiGroup: rbac.authorization.k8s.io

当我们创建binding后,则不能修改binding所引用的Role或ClusterRole。尝试修改会导致验证错误;如果要改变binding的roleRef,那么应该删除该binding对象并且创建一个新的用来替换原来的。

Referring to resources【资源引用】

Kubernetes集群内一些资源一般以其名称字符串来表示,这些字符串一般会在API的URL地址中出现;同时某些资源也会包含子资源,例如pod的logs资源就属于pods的子资源,API中URL样例如下:

GET /api/v1/namespaces/{namespace}/pods/{name}/log

在这种情况下,”pods” 是有名称空间的资源,而 “log” 是 pods 的子资源。在 RBAC 角色中,使用”/“分隔资源和子资源。

允许一个主体(subject)要同时读取 pods 和 pod logs,你可以这么写:

1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: Role
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"]

对于某些请求,也可以通过 resourceNames 列表按名称引用资源。

例如:在指定时,可以将请求类型限制到资源的单个实例。限制只可以 “get” 和 “update” 到单个configmap,则可以这么写:

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

需要注意的是,create 请求不能被 resourceName 限制,因为在鉴权时还不知道对象名称。 另一个例外是 deletecollection。

Referring to subjects【主体引用】

RoleBinding或ClusterRoleBinding绑定一个role到主体(subjects)。主体(subjects)可以是groups,users或ServiceAccounts。

Kubernetes将用户名表示为字符串。这些可以是:普通名称,比如“alice” ;邮件风格的名字,比如“bob@example.com” ;或表示为字符串的数字用户id。

注意:前缀 system: 是保留给Kubernetes系统使用的,因此应该确保不会出现名称以system: 开头的用户或组。除了这个特殊的前缀,RBAC授权系统不要求用户名使用任何格式。

ServiceAccounts具有前缀为system:serviceaccount: 的名称,属于具有前缀为system:serviceaccounts:的名称的组。

RoleBinding的示例

下面的示例只是展示 RoleBinding 中 subjects 的部分。

用户的名称为 “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

默认service account在 kube-system 命名空间中:

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

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

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

在任意名称空间的所有service accounts:

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

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

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

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

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

所有用户 (版本 1.5+):

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

准入控制

准入控制是API Server的插件集合,通过添加不同的插件,实现额外的准入控制规则。甚至于API Server的一些主要的功能都需要通过Admission Controllers实现,比如:ServiceAccount。

查看哪些插件是默认启用的:

kube-apiserver -h | grep enable-admission-plugins

在 1.17 中,它们是:

1 NamespaceLifecycle, LimitRanger, ServiceAccount,
2 TaintNodesByCondition, Priority, DefaultTolerationSeconds,
3 DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize,
4 MutatingAdmissionWebhook, ValidatingAdmissionWebhook, RuntimeClass, ResourceQuota
部分插件功能:

NamespaceLifecycle

该准入控制器禁止在一个正在被终止的 Namespace 中创建新对象,并确保使用不存在的 Namespace 的请求被拒绝。该准入控制器还会禁止删除三个系统保留的命名空间,即 default、kube-system 和 kube-public。

删除 Namespace 会触发删除该命名空间中所有对象(pod、services 等)的一系列操作。为了确保这个过程的完整性,我们强烈建议启用这个准入控制器。

LimitRanger

该准入控制器会观察传入的请求,并确保它不会违反 Namespace 中 LimitRange 对象枚举的任何约束。

ServiceAccount

该准入控制器实现了 serviceAccounts 的自动化。 如果打算使用 Kubernetes 的 ServiceAccount 对象,强烈建议您使用这个准入控制器。

ResourceQuota

该准入控制器会监测传入的请求,并确保它不违反任何一个 Namespace 中的 ResourceQuota 对象中枚举出来的约束。

相关阅读

1、官网:使用 RBAC 鉴权


Kubernetes K8S之鉴权RBAC详解的更多相关文章

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

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

  2. Kubernetes K8S之调度器kube-scheduler详解

    Kubernetes K8S之调度器kube-scheduler概述与详解 kube-scheduler调度概述 在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 节点上,然后 ...

  3. Kubernetes K8S之资源控制器StatefulSets详解

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

  4. kubernetes运行应用2之DaemonSet详解

    kubernetes运行应用1之Deployment详解   查看daemonset 如下,k8s自身的 DaemonSet kube-flannel-ds和kube-proxy分别负责在每个结点上运 ...

  5. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  6. Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, In ...

  7. K8s创建pod yaml文件详解

    kubernetes创建pod的yaml文件,参数说明 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 ...

  8. Kubernetes集群PV和PVC详解

    Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...

  9. k8s集群搭建过程详解

    准备工作 安装CentOS7虚拟机 略 安装Docker 略 关闭CentOS7自带的防火墙服务 systemctl disable firewalld systemctl stop firewall ...

随机推荐

  1. SQL SERVER数据库内 FOR XML PATH 函数用法

    把自己点点滴滴的学习记录下来!!!! 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(TBJTXXCE)用来存放就诊患者信息,表结构 ...

  2. ABBYY FineReader 14扫描和保存文档

    在ABBYY FineReader 14中您可以使用扫描"新建任务"窗口选项卡上的内置任务创建各种格式的数字文档.本文介绍使用FineReader 14扫描和保存文档的方法. 1. ...

  3. 教你用Camtasia制作精美片头

    大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...

  4. 如何用Vegas完成视频编辑中的自动跟踪换图

    Vegas作为一款专业的视频剪辑软件,剪辑速度快捷,拥有各种实用工具和特效,同样也可以为用户实现视频换图的需求.今天小编就为大家讲解,如何利用Vegas自动跟踪进行换图,让视频能够更加便捷的呈现. 本 ...

  5. Golang 实现 Redis(7): Redis 集群与一致性 Hash

    本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...

  6. Java集合【3】-- iterable接口超级详细解析

    目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...

  7. Android source code compile error: “Try increasing heap size with java option '-Xmx<size>'”

    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" ./pr ...

  8. redis 客户端

    输入缓冲区: 客户端状态的输入缓冲区用于保存客户端发送的命令请求: typedef struct redisClient{ //... sds querybuf; //... }redisClient ...

  9. 【mq读书笔记】mq消息发送

    钩子的注册: DefaultMQProducerImpl#registerSendMessageHook注册钩子处理类,可注册多个. public SendResult sendMessage( fi ...

  10. JS 使用xlsx.core.js 数据导出到excel

    /* 通用导出数据 需要引入 xlsx.core.js * data:数据 * th:表头 * filename:导出表格名称 */ var data = []; var th = [ [" ...