在K8S中,当我们试图通过API与集群资源交互时,必定经过集群资源管理对象入口kube-apiserver。显然不是随随便便来一个请求它都欢迎的,每个请求都需要经过合规检查,包括Authentication(身份验证)、Authorization(授权)和Admission Control(准入控制)。通过一系列验证后才能完成交互。

Kubernetes API 请求从发起到持久化到ETCD数据库中的过程如下:

“三个A”我们可以简单理解为:

  • Authentication你是谁?你能登录系统么?
  • Authorization你想做什么?你有相应的权限么?
  • Admission Control: 在apiserver中准入控制会以控制器插件的方式存在,类似于各类web框架中的中间件,可以在kube-apiserver的yml中添加控制器插件--enable-admission-plugins开启。

这篇小作文我们主要来学习K8S中关于认证与授权相关的知识,看看他们是如何实现的。包含如下内容:

  • K8S 通过证书认证
  • K8S 通过RBAC 授权

一、 K8S 通过证书认证


Authentication(身份认证),即核查用户能否进入K8s集群。一般来说k8s中有两类用户,普通用户和服务账户(Service Account)。

普通用户,使用者是人,即用户可以通过 kubectl 命令、或通过REST请求访问 API,但是请注意K8s不提供普通用户管理的资源对象,那所谓的普通用户哪里的?很简单只要你能通过k8s身份认证策略那么你就是一个普通用户。而Service Account 则是针对运行在 Pod 中的进程而言的。

K8S的几种验证方式:

  • Certificate
  • Token
  • OpenID
  • Web Hook

其中Certificate(证书)是在普通用户(客户端)中被广泛使用的验证方式。通过客户端证书进行身份验证时,客户端必须先获得一个有效的 x509 客户端证书,然后Kubernetes API服务器通过验证这个证书来验证你的身份。当然你的X509证书必须由集群 CA 证书签名。这其实就是HTTPS加密中的一部分,只不过是CA是K8S自签名的CA证书。

首先我们通过openssl创建一个用户私钥

openssl genrsa -out develop1.key 2048

通过user.key 生成CSR(证书签名请求),Kubernetes 使用证书中的 'subject' 的通用名称(Common Name)字段来确定用户名,Organization Name 作为组。

openssl req -new -key develop1.key -out develop1.csr -subj "/CN=develop1/O=devops"

有了CSR,我们就可以把它交给K8S admin通过集群CA签署客户端证书。kubeadm创建的集群证书对存储在master节点的 /etc/Kubernetes/pki/ 目录中,(当然如果你是admin,也可以直接通过API的方式签署证书)集群包含一个根 CA,用它签署所有集群组件相互通信所需的证书。

openssl x509 -req -in develop1.csr -CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out develop1.crt -days 30

这样我们获得了一个被集群CA签署过的证书develop1.crt

develop1.crt  develop1.csr  develop1.key

查看证书内容openssl x509 -noout -text -in develop1.crt包含CN/O,以及证书过期时间。

好了,有了证书之后,下一步我们需要配置kubecofnig使kubectl可以正常访问apiserver,关于kubeconfig可参考官方文档organize-cluster-access-kubeconfig 这里我们以配置为主。

默认情况下,kubectl 读取 $HOME/.kube/config 作为配置文件。也可以通过两种方式为 kubectl 指定配置文件:

  • 环境变量 KUBECONFIG
  • 命令行参数 --kubeconfig

现在通过kubectl来创建config中的集群入口

kubectl config set-cluster kubernetes \
--server=https://apiserver.cluster.local:6443 \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true

创建用户入口

kubectl config set-credentials develop1 \
--client-certificate=$HOME/private_key/develop1.crt \
--client-key=$HOME/private_key/develop1.key \
--embed-certs=true

创建上下文

kubectl config set-context develop1 \
--cluster=kubernetes \
--user=develop1

指定当前context

$ kubectl config set current-context develop1
Property "current-context" set.
#查看当前context,已绑定develop1
$ kubectl config current-context
develop1

通过kubectl config view查看当前的config

这样我们kubectl已经配置完毕,但是此时我们只完成了Authentication,并没有获得权限

$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "develop1" cannot list resource "pods" in API group "" in thenamespace "default"

可以看到develop1没有对命名空间defaultlist权限。所以接下来我们来学习Authorization授权相关内容。

二、K8S 通过RBAC 授权


RBAC(Role-Based Access Control)即基于角色的访问控制,在各类大型系统如虚拟化Vcenter、各类云服务以及众多toB软件访问控制中被大量使用。关于RBAC可参考一篇译文:[译] 基于角色的访问控制(RBAC):演进历史、设计理念及简洁实现(Tailscale, 2021)

k8s作为企业内部重要云基础设施并不希望每个使用平台的用户都可以不受限制的创建、修改和删除资源。同时伴随着集群节点、应用程序和团队数量的增加,你需要一种安全措施将用户或应用权限控制在某个范围内,这就K8S 在V1.8正式引入RBAC所要做的事(其他鉴权机制本文不涉及)。

K8S的RBAC 主要由Role、ClusterRole、RoleBinding 和 ClusterRoleBinding 等资源实现。模型如下:

Role、ClusterRole

角色是一组权限规则的集合,Role 用来定义某个命名空间内的访问权限,而ClusterRole 则是一个集群作用域的资源。为啥要用两个资源?因为Kubernetes 对象的作用域已经被划分为集群和命名空间两部分了。需要注意:角色只有授权没有禁止的操作。

构成一个Rule需要声明三部分:

  • apiGroups:资源所属的API组:"" 缺省为 core 组资源,如:extensions、apps、batch等。Kubernetes API 参考文档
  • resources:资源,如: pods、deployments、services、secrets 等。
  • verbs:动作,如: get、list、watch、create、delete、update 等。

现在我们来创建一个可以读取默认命名空间default的Role,它的api版本为:rbac.authorization.k8s.io/v1

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: develop-defualt
rules:
- apiGroups: [""] #core api组
resources: ["pods"]
verbs: ["get", "watch", "list"]

此时还没有api交互权限,所以应该通过kube-admin来创建

# kubectl apply -f role.yml
role.rbac.authorization.k8s.io/develop-defualt created
RoleBinding、ClusterRoleBinding

上面我们已经创建了一个带权限的角色,下一步就了解如何将角色关联到用户。角色绑定是将我们角色中定义好的权限赋予一个或者一组用户,即上图Sujbect。RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。

图中展示了三种绑定方式,除了常规的绑定各自作用域的角色外,RoleBinding还可以绑定集群级别的ClusterRole。有啥用呢?当我们要对namespace做授权时,通常可以创建namespace中的Role进行绑定,如果管理几百个NS则需创建相应数量的NS Role,显然不是很棒,所以我们将RoleBinding绑定到集群的ClusterRole,只需几个ClusterRole就可以将几百个NS做访问控制了。

我们将上面创建的develop-defualt角色做绑定:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: develop-rolebinding
namespace: default #授权的命名空间为default
subjects:
- kind: User
name: develop1 # 绑定develop1用户
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: develop-defualt #绑定Role
apiGroup: rbac.authorization.k8s.io

通过admin创建RoleBinding

# kubectl apply -f role-binding.yml
rolebinding.rbac.authorization.k8s.io/develop-rolebinding created

ok,此时在使用kubectl get pod时,就能获得结果了。

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-85549dcb84-nb67c 1/1 Running 0 12d
web-85549dcb84-z95sj 1/1 Running 0 12d

ServiceAccount授权和普通用户相似,这里不再赘述。有兴趣的读者可以参考官方文档学习。

以上我们对K8S中认证和授权做了基本介绍,以及对创建一个用户并授权pod读取权限做了实践。


希望小作文对你有些许帮助,如果内容有误请指正。

您可以随意转载、修改、发布本文,无需经过本人同意。通过博客阅读iqsing.github.io

k8s 基于RBAC的认证、授权介绍和实践的更多相关文章

  1. 任务35:JWT 认证授权介绍

    任务35:JWT 认证授权介绍 应用场景主要是移动端或者PC端前后分离的场景 直接对客户端API的请求 例如访问admin/Index 没有权限返回403. 需要客户端手动的再发动请求,这是一个拿to ...

  2. Spring Cloud下基于OAUTH2+ZUUL认证授权的实现

    Spring Cloud下基于OAUTH2认证授权的实现 在Spring Cloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认 ...

  3. .Net Core权限认证基于Cookie的认证&授权.Scheme、Policy扩展

    在身份认证中,如果某个Action需要权限才能访问,最开始的想法就是,哪个Action需要权限才能访问,我们写个特性标注到上面即可,[TypeFilter(typeof(CustomAuthorize ...

  4. k8s基于RBAC的访问控制(用户授权)

    kubernetes的API Server常用的授权插件有:   Node.ABAC.RBAC.Webhook我们重点说一下RBAC的访问控制逻辑RBAC(Role base access contr ...

  5. ASP.NET Core JWT认证授权介绍

    using JWTWebApi.Models; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetC ...

  6. 【认证与授权】2、基于session的认证方式

    这一篇将通过一个简单的web项目实现基于Session的认证授权方式,也是以往传统项目的做法. 先来复习一下流程 用户认证通过以后,在服务端生成用户相关的数据保存在当前会话(Session)中,发给客 ...

  7. 基于.NetCore3.1系列 ——认证授权方案之Swagger加锁

    一.前言 在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用.这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员.而在后续的内容中,为了对a ...

  8. Kubernetes 基于 RBAC 的授权(十六)

    目录 一.RBAC介绍 1.1.角色和集群角色 1.2.RoleBinding 和 ClusterRoleBinding 1.3.资源 1.4.主体 二.命令行工具 2.1.kubectl creat ...

  9. 普通程序员看k8s基于角色的访问控制(RBAC)

    一.知识准备 ● 上一节描述了k8s的账户管理,本文描述基于角色的访问控制 ● 网上RBAC的文章非常多,具体概念大神们也解释得很详细,本文没有站在高屋建瓴的角度去描述RBAC,而是站在一个普通程序员 ...

随机推荐

  1. c++设计模式概述之工厂

    类写的不规范,原因: 缩短篇幅,实际中请不要这样写. 欢迎指正 工厂模式,如其名,想象下现实生活中的工厂,比如Apple的组装工厂,小米产品的组装工厂,华为设备的组装工厂.对我们用户而言,不需要知道他 ...

  2. win10使用cmake配置fmt生成vs2015解决方案(fmt version 7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 本文仅为参考,请以实际情况为准, fmt版本: 7.0.1 准备 下载源码fmt : htt ...

  3. 写在LeetCode刷题600题

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 从2015年9月刷题至今,我终于在LeetCode刷够600道题了.从刚开始的Java语 ...

  4. 【LeetCode】560. Subarray Sum Equals K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. CS5213设计说明书|Capstone CS5213|CS5213设计参考电路

    Capstone CS5213是一款HDMI到VGA转换器结合了HDMI输入接口和模拟RGB DAC输出且带支持片上音频数模转换器.CS5213芯片设计简单,整体芯片尺寸精悍,外围电路集成优化度较高, ...

  6. SpringMVC+Spring+Mybatis实现登录注册Demo

    使用环境:MyEclipse/Eclipse + Tomcat + MySql. 使用技术:SpringMVC + Spring + Mybatis. 实现效果 登录页面: 密码错误提示 登录成功后 ...

  7. Java初学者作业——分析计费规则后,编写程序输入乘坐出租车的时间和里程数,计算里程价格

    返回本章节 返回作业目录 需求说明: 某城市的出租车计费规则如下: 在 7:00 - 23:00 之间,3km 以内收取起步价 10 元,超过 3km 每 km 收取 2 元. 如果不在这个时间段,在 ...

  8. HTML网页设计基础笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 HTML网页设计基础笔记 • [第1章 HTML5基础] 第2章 HTML网页设计基础笔记 • [第2章 排列页面内容] 第3章 ...

  9. x86-2-保护模式

    x86-2-保护模式 操作系统负责计算机上的所有软件和硬件的管理,它可以百分百操作计算机的所有内容.但是,操作系统上编写的用户程序却应当有所限制,只允许用户程序访问属于自己程序的内容,不然整个生态就很 ...

  10. 数三角count(归类)

    评测方式:文本比较 题目描述 这是一个数三角的游戏.长度为1或SQRT(2)的小木棍放在一个网格上.如图所示,有水平的,垂直的或对角的.对角放置的木棍可以交叉. avatar 将木棍随意地放在网格上得 ...