【Kubernetes】K8s 的鉴权管理(一):基于角色的访问控制(RBAC 鉴权)

发布于:2024-09-18 ⋅ 阅读:(131) ⋅ 点赞:(0)

K8s 的安全认证》系列,共包含以下文章:

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

1.Kubernetes 的鉴权管理

客户端请求通过认证阶段后,将进入鉴权阶段。这个阶段将包含两个内容:

  • 1️⃣ 审查客户端请求的属性
  • 2️⃣ 确定请求的操作

1.1 审查客户端请求的属性

Kubernetes 审查客户端请求的属性 主要包括以下几个方面。

  • 用户与组:经过认证的用户名和所属组名的列表。
  • API 和动作:对 Kubernetes 资源的操作,如 createlistget 等请求动词。
  • 请求路径和动作:指示各种非 Kubernetes 资源的路径(如 /api),以及对该路径执行的 HTTP 操作(如 GET、POST、PUT 等)。
  • 命名空间:正在访问的 Kubernetes 对象的命名空间。

1.2 确定请求的操作

确定请求的操作 是指,确定对 Kubernetes 资源对象的请求动词或 HTTP 操作,以及该动词或 HTTP 操作是针对单个资源还是一组资源。

下表列举常见的请求动词与 HTTP 操作,以及它们的对应关系。

请求动词 HTTP 操作
create POST
getlist GET、HEAD
update PUT
patch PATCH
deletedeletecollection DELETE

根据 Kubernetes 鉴权时使用的模块,可以将 Kubernetes 的鉴权分为以下 4 4 4 种方式:

  • 基于 角色 的访问控制(RBAC 鉴权)
  • 基于 属性 的访问控制(ABAC 鉴权)
  • 基于 节点 的访问控制(Node 鉴权)
  • 基于 Webhook 的访问控制

基于角色的访问控制(RBAC 鉴权)是最重要的鉴权方式。

2.基于角色的访问控制(RBAC 鉴权)

基于角色的访问控制Role-Based Access ControlRBAC),通过为用户赋予不同的角色来控制其访问 Kubernetes 集群资源。它允许用户动态配置不同的角色策略。基于角色的访问控制需要使用 rbac.authorization.k8s.io API 组来执行。

2.1 基于角色的访问控制中的概念

在基于角色的访问控制中涉及 3 3 3 个非常重要的概念:角色角色绑定主体

2.1.1 角色

角色 是一组权限的集合。Kubernetes 中的角色分为两种:Role 和 ClusterRole。

  • Role 是某个命名空间中对象访问权限的集合。因此,在创建 Role 时,必须指定 Role 所属的命名空间。
  • ClusterRole 是访问某个命名空间的权限的集合。

2.1.2 角色绑定

将包含各种权限的角色授予给一个主体,这个过程被叫作 角色绑定。因为角色分为 Role 和 ClusterRole,所以角色绑定分为 RoleBindingClusterRoleBinding

2.1.3 主体

使用角色的用户被叫作 主体Subject)。它可以是一个用户(User)、一个用户组(Group),也可以是一个服务账号(ServiceAccount)。

角色与角色绑定存在 3 3 3 种关系:RoleBind-RoleClusterRoleBind-ClusterRoleRoleBind-ClusterRole,如下图所示。
在这里插入图片描述
下面解释了这 3 3 3 种关系的区别:

  • User A 通过 RoleBinding 绑定到了 Role 上。因此,它就拥有了命名空间 A 的操作权限。
  • 在集群 B 上有两个命名空间:命名空间 A 和命名空间 B。User B 通过 ClusterRolebinding 绑定到 ClusterRole 上,因此它拥有了集群的操作权限(即访问命名空间 A 和命名空间 B)。
  • User C 在使用 RoleBind 和 ClusterRole 进行绑定时,仅能获取当前名称空间的所有权限(即 User C 只能访问命名空间 A)。

角色角色绑定主体 之间的约束关系如下图所示。
在这里插入图片描述

2.2 实现基于角色的访问控制

下面来演示如何实现基于角色的访问控制。这里将实现 Jerry 用户只能对 mydemo 命名空间拥有读取 Pod 的权限。

创建 mydemo 命名空间,并在该命名空间中创建 Pod。

kubectl create ns mydemo
kubectl create deployment nginx --image=nginx --replicas=3 -n mydemo

查看 mydemo 命名空间中的 Pod 信息。

kubectl get pods -n mydemo

输出的信息如下:

在这里插入图片描述

生成 只有读取 Pod 权限的角色 的描述信息。

kubectl create role mydemo-pod-reader-role --verb=get,list,watch --resource=pods --dry-run -o yaml

在生成的描述信息中增加 namespace: mydemo 字段,并将描述信息保存为 mydemo-pod-reader-role.yaml 文件。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: mydemo-pod-reader-role
  namespace: mydemo
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

创建 mydemo-pod-reader-role 角色。

kubectl apply -f mydemo-pod-reader-role.yaml

查看 mydemo 命名空间中的角色信息。

kubectl get role -n mydemo

输出的信息如下:

在这里插入图片描述

编辑 mydemo-pod-reader-rolebinding.yaml 文件进行角色绑定,将主体与角色进行绑定。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: mydemo-pod-reader-rolebinding
  namespace: mydemo
subjects:
- kind: User
  #名字大小写敏感
  name: Jerry
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  # 名字必须与Role或者ClusterRole的名字一致
  name: mydemo-pod-reader-role 
  apiGroup: rbac.authorization.k8s.io

🚀 这里的主体是用户名称(即 Jerry),绑定的角色是 mydemo-pod-reader-role

执行 kubectl apply -f 命令。

kubectl apply -f mydemo-pod-reader-rolebinding.yaml

查看 mydemo 命名空间中的角色信息与角色绑定信息。

kubectl get role,rolebinding -n mydemo

输出的信息如下:

在这里插入图片描述

创建 Jerry 用户和认证证书。

# 生成用户的私钥
openssl genrsa -out Jerry.key 2048

# 使用刚生成的私钥创建证书,并在 -subj 中指定用户和组。证书文件格式: 用户名.csr
openssl req -new -key Jerry.key -out Jerry.csr -subj "/CN=Jerry/O=mydemo"

# 在 /etc/kubernetes/pki 目录下,找到 Kubernetes 集群的证书 ca.crt 和 ca.key
# 生成最终的证书 Jerry.crt,有效期为 30 天
openssl x509 -req -in Jerry.csr -CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-out Jerry.crt -days 30

在这里插入图片描述

Jerry 用户的凭证加入 kubeconfig

kubectl config set-credentials Jerry --client-key=Jerry.key --client-certificate=Jerry.crt

在这里插入图片描述

查看 config 文件,看是否把密钥的内容写进去了,以便在命令行中切换用户。

tail ~/.kube/config

输出的信息如下:

在这里插入图片描述

创建用户上下文对象 Jerry-contex

kubectl config set-context Jerry-context --cluster=kubernetes --namespace=mydemo --user=Jerry

切换到 Jerry 用户。

kubectl config use-context Jerry-context

输出的信息如下:

在这里插入图片描述

🚀 在 Kubernetes 中进行用户切换的常用命令有:

  • 回到管理员:kubectl config use-context kubernetes-admin@kubernetes
  • 获取所有用户的 context 列表:kubectl config get-contexts
  • 获取当前用户的 context 信息:kubectl config current-context

测试 Jerry 用户能否读取 mydemo 命名空间中的 Pod 信息。

kubectl get pod -n mydemo

如果能够正常读取 mydemo 命名空间中的 Pod 信息,则输出如下信息:

在这里插入图片描述

执行以下命令测试 Jerry 用户能否在 mydemo 命名空间中创建 Pod:

kubectl create deployment Jerry-nginx --image=nginx --replicas=3 -n mydemo

这时将出现以下错误信息:

error: failed to create deployment: 
deployments.apps is forbidden: 
User "Jerry" cannot create resource "deployments" in API group "apps" in the namespace "mydemo"

在这里插入图片描述

按照相同的方法创建 Tom 用户和认证证书,并切换到 Tom 用户,测试 Tom 用户能否读取 mydemo 命名空间中的 Pod 信息。


网站公告

今日签到

点亮在社区的每一天
去签到