循序渐进kubernetes-RBAC(Role-Based Access Control)

news2025/1/31 0:36:02

文章目录

  • 概要
  • Kubernetes API
  • 了解 Kubernetes 中的 RBAC
  • Roles and Role Bindings:
  • ClusterRoles and ClusterRoleBindings
  • 检查访问权限:
  • 外部用户
  • 结论

概要

Kubernetes 是容器化应用的强大引擎,但仅仅关注部署和扩展远远不够,集群的安全同样至关重要。这时,角色权限控制(Role-Based Access Control,RBAC)就派上了用场。本文将深入了解 Kubernetes RBAC,帮助您构建精细化的安全策略,并通过实例详细展示其工作原理。

Kubernetes API

在介绍 RBAC 之前,需要明确授权模型在整个架构中的位置。
以下是向 Kubernetes 集群提交一个 Pod 的示例:

cat <<EOF |kubectl apply -f  -
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: web
spec:
  serviceAccountName: john
  containers:
  - image: nginx
    name: nginx
    ports:
    - containerPort: 8080
EOF

部署Pod 到集群:

kubectl apply -f pod.yaml

运行 kubectl apply 时,会依次执行以下步骤:

  • 从 KUBECONFIG 文件中读取配置信息。
  • 查询 API 以发现可用的 API 和对象。
  • 在客户端验证资源,检查是否存在明显错误。
  • 将包含资源定义的请求发送到 kube-apiserver。
    当 kube-apiserver 接收到请求时,不会立即将其存储到 etcd 中。
    首先,会对请求的合法性进行验证,即对请求进行身份认证。
    通过身份认证后,还会检查请求是否具备创建资源的权限。

身份和权限是两个独立的概念。
即使拥有集群访问权限,也不一定能够创建或读取所有资源。
授权通常通过基于角色的访问控制(RBAC)实现。
RBAC 提供细粒度的权限控制,用于限制用户或应用程序的操作范围。

从实际操作的角度来看,API 服务器按以下顺序执行操作:

  • A. 验证用户身份
    如果身份验证失败,返回 401 Unauthorized 并拒绝请求。
    如果身份验证通过,进入下一阶段。
  • B. 检查用户权限
    如果用户无权访问资源,返回 403 Forbidden 并拒绝请求。
    如果用户具备权限,继续处理请求。
    通过 RBAC 角色实现用户与权限的解耦

RBAC 是一种基于组织中用户角色分配资源访问权限的模型。
为更直观地理解其工作原理,可以设想从零设计一个授权系统。
要确保用户对特定资源具有写入权限,可以采用一种简单的实现方式,即创建一个包含三列的列表,例如:

| User   | Permission | Resource |
| ------ | ---------- | -------- |
| John   | read+write | app1     |
| Emily  | read       | app2     |
| Michael| read       | app2     |

在此示例中:

John 拥有对 app1 的读写权限,但无法访问 app2。
Emily 和 Michael对 app2 仅拥有读取权限,但无法访问 app1。
当用户和资源数量较少时,这种表格形式可以正常使用,但随着规模扩大,可能会显现一些局限性。

例如,如果将 Michael和 Emily 归为同一团队,并授予其对 app1 的读取权限,表中将需要新增以下条目:

| User   | Permission | Resource   |
| ------ | ---------- | ---------- |
| John   | read+write | app1       |
| Emily  | read       | app2       |
| Michael| read       | app2       |
| Emily  | read       | app1       |
| Michael| read       | app1       |

这种设计难以直接体现 Emily和 Michael因同属一个团队而拥有相同访问权限的关系。
在这里插入图片描述
可以通过在表中添加“Team”列来解决此问题,但更优的方式是拆分这些关系:

  • 定义一个通用的权限容器,即角色(Role)。
  • 不直接将权限分配给用户,而是将权限包含在反映其在组织中角色的角色中。
  • 最后,将角色与用户关联起来。

可以通过以下方式进行改进:

  • 不再使用单一表格,而是将结构拆分为两个表格:
  • 第一个表格将权限映射到角色。
  • 第二个表格将角色与身份关联起来。
| Role   | Permission | Resource   |
| ------ | ---------- | ---------- |
|admin   | read+write | app1       |
|viewer  | read       | app2       |


| User   | Role      | 
| ------ | ----------|
|John    | admin     | 
|Emily   | viewer    | 
|Michael | viewer    | 

当需要将 Mo 设置为 app1 的管理员时,可以通过以下方式将角色分配给用户:

| User   | Role            | 
| ------ | ----------------|
|John    | admin           | 
|Emily   | reviewer        | 
|Michael | viewer,admin    | 

通过使用角色将用户与权限解耦,可以简化大型组织中涉及众多用户和权限的安全管理。
在这里插入图片描述

了解 Kubernetes 中的 RBAC

Kubernetes (K8s) 中的 RBAC(基于角色的访问控制)是一种安全机制,用于定义和实施对集群中各类资源的细粒度访问控制策略,是管理和保护 Kubernetes API 服务器及集群资源访问的重要组成部分。
RBAC 通过定义角色(Role)和角色绑定(Role Binding),用于指定对特定 Kubernetes 资源(如 Pod、Service、ConfigMap)及命名空间级别允许执行的action(verbs)。以下是 RBAC 的一些核心概念:

  • 角色(Roles):角色是定义在特定命名空间内,允许对某个资源执行的操作集合。例如,可以创建一个角色,允许在特定命名空间中对 Pod 执行读取和列出操作。
  • 角色绑定(Role Bindings):角色绑定将角色与一个或多个用户、组或服务账户关联,指定哪些主体可以执行角色中定义的操作。例如,可以将角色绑定到特定用户或用户组。
  • 集群角色(ClusterRoles):与角色仅限于单一命名空间不同,集群角色不受命名空间限制。集群角色定义了对集群级资源(如节点或持久卷)执行的操作。
  • 集群角色绑定(ClusterRoleBindings):集群角色绑定将集群角色与用户、组或服务账户关联,类似于角色绑定。它们确定哪些主体可以访问所有命名空间中的集群级资源。

通过使用 RBAC,可以创建一个细粒度的访问控制系统,符合组织的安全需求。这确保了用户、应用程序和服务拥有执行任务所需的适当访问权限,同时保持 Kubernetes 集群的整体安全。

基于角色的访问控制(Role-Based Access Control)是防止未经授权访问的保护屏障!这种安全机制可以为 Kubernetes 资源创建高度精细的访问策略。通过它,可以为用户、应用程序和服务分配恰到好处的权限,同时确保集群的安全性不受威胁。

Roles and Role Bindings:

角色(Roles)用于为命名空间中的特定资源定义访问策略。角色绑定(Role Bindings)将角色与用户、用户组或服务账户关联,明确访问权限的分配关系。
示例:
1.首先创建一个service account

cat <<EOF|kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: john
  namespace: web
EOF

2.定义一个名为“pod-reader-role”的角色。

cat <<EOF |kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: web
  name: pod-reader-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

说明:
此 YAML 文件定义了一个名为 “pod-reader-role” 的角色,适用于 “web” 命名空间,授权对 “pods” 执行 “get” 和 “list” 操作。
3.定义一个名为“pod-reader-role-binding”的角色绑定,并将其绑定到“web”命名空间中的服务用户“john”。

cat <<EOF |kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader-role-binding
  namespace: web
subjects:
- kind: ServiceAccount
  name: john
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader-role
  apiGroup: rbac.authorization.k8s.io
EOF

说明:
该 YAML 文件创建了一个名为 “pod-reader-role-binding” 的角色绑定(Role Binding),将 “pod-reader-role” 角色与 “web” 命名空间中的用户 “john” 关联起来。用户 “john” 现在拥有了 “pod-reader-role” 的权限。

ClusterRoles and ClusterRoleBindings

集群角色(ClusterRoles)和集群角色绑定(ClusterRoleBindings)将 RBAC 扩展至整个集群,允许对集群级资源的访问权限进行管理。
1.定义一个名为“node-reader-cluster-role”的clusterrole

cat <<EOF |kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader-cluster-role
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]
EOF

说明:
ClusterRole 定义了集群范围内的权限,用于控制对 Kubernetes 集群中资源的访问。上面的 YAML 文件定义了一个名为 “node-reader-cluster-role” 的 ClusterRole,允许对 “nodes” 资源执行 “get” 和 “list” 操作,用于读取节点信息。
2.定义一个名为“node-reader-cluster-binding”的集群角色绑定,并将其绑定到服务用户“admin”。

cat <<EOF |kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: node-reader-cluster-binding
subjects:
- kind: ServiceAccount
  name: admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: node-reader-cluster-role
  apiGroup: rbac.authorization.k8s.io
EOF

说明:
在这个 YAML 文件中,名为“node-reader-cluster-binding”的集群角色绑定将“node-reader-cluster-role”集群角色与集群级的用户“admin”关联起来。通过这个绑定,用户“admin”获得了“node-reader-cluster-role”集群角色中定义的权限,从而能够在整个集群中管理节点。

检查访问权限:

配置 RBAC 后,可通过 kubectl auth can-i 命令验证权限,确保角色具备所需的操作权限。
示例:

  1. 验证 “john” 是否有权限在 “webapp” 命名空间中列出 pods
 $ kubectl auth can-i list pods --as=system:serviceaccount:web:john -n web
yes

2.执行list pods验证

$ kubectl exec -it -n web nginx -- bash
$ curl -k -s -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/web/pods|jq  '.items[].metadata.name'
"my-pod"
"nginx"
"redis-77598f9f86-g4dqg"
"redis-77598f9f86-hpmsh"
"service-python-7f7c9d4fc4-jhp4d"
"webserver-5f9579b5b5-4vj77"
"webserver-5f9579b5b5-qw2m4"

外部用户

1.创建user
在 Kubernetes 中,User 和 ServiceAccount 是独立的概念。一个 User 通常由外部身份管理系统(如 LDAP、OIDC)认证,而 ServiceAccount 是 Kubernetes 内置的一种资源,用于为应用程序或 Pod 提供身份。它们没有直接的关联机制,但可以通过为 User 和 ServiceAccount 配置相同的 RoleBinding 或 ClusterRoleBinding,让它们具有相同的权限,从而达到“关联”目的。

cat <<EOF |kubectl apply -f -
> apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: shared-access-binding
  namespace: web
subjects:
- kind: User
  name: john  # External user
  apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
  name: john     # ServiceAccount
  namespace: web
roleRef:
  kind: Role
  name: pod-reader-role
  apiGroup: rbac.authorization.k8s.io
> EOF

2.验证权限

$ kubectl auth can-i list pods --as=john -n web
yes

3.执行list pods验证

$ sa_john_token=$(kubectl create token john -n web)
$ echo $sa_john_token
eyJhbGciOiJSUzI1NiIsImtpZCI6ImxMVXQ2cTI1cnJFeWVEa0hpWW9SS2oxemRwUVBPWWY3Y0NPZDEtWXViajAifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzM3NzA0NzUxLCJpYXQiOjE3Mzc3MDExNTEsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiZjhjYzY3ZWQtYWQ2Mi00OGQ5LTgyNDQtMjg5NDExYTEwODBiIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJ3ZWIiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiam9obiIsInVpZCI6IjQxMWU5NzU5LTI0ZDItNDEyMy04MTNmLTEyNTdjYzhmNzE4ZCJ9fSwibmJmIjoxNzM3NzAxMTUxLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6d2ViOmpvaG4ifQ.PZPhGJ9djwI0DaTgHGqoQ0nrov2Cokw1WObL42H-TOcRE9SCAgHaxGgIkjAqgJYja5djmjk-SNneSoPD1jq9PTp2NaXBxCfLMHHCfe2QyN0eB3DiV7SFQ2IWZVBFYa6c8ufNFdm85oOPzmcXZDU-T59xpOR6OqgREWhSAQ4LRyFDC-TAqXf1YncKV2i2rItn1OlgNENdqwD2dBYVM9CZvlCt5za7ZwfYcUve1DD9_rZK0VC1Jnc_I8zf8M7mOrucAiZOLXcaFBfFNMPIWa1t1k2EWbnkt8kLFmDkESJ2S1oMHdbpKPZzspFGAtJDMKMHa9W1T3A92kPz_uSGPkRgVg
$ curl -k -s -H "Authorization: Bearer $sa_john_token" https://172.19.6.5:6443/api/v1/namespaces/web/pods | jq '.items[].metadata.name'
"my-pod"
"nginx"
"redis-77598f9f86-g4dqg"
"redis-77598f9f86-hpmsh"
"service-python-7f7c9d4fc4-jhp4d"
"webserver-5f9579b5b5-4vj77"
"webserver-5f9579b5b5-qw2m4"

结论

Kubernetes RBAC 是实现集群访问控制的重要机制。通过合理配置 Role、RoleBinding、ClusterRole 和 ClusterRoleBinding,可以有效管理用户权限与系统安全之间的关系。定期测试和验证权限配置,有助于保持 Kubernetes 环境的稳定性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2286667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记

paper&#xff1a;2303.06859 GitHub&#xff1a;lixinustc/Causal-IR-DIL: Distortion invariant feature learning for image restoration from a causality perspective 2023 CVPR 目录 摘要 1、介绍 1.1 图像修复任务 1.2 失真不变表示学习 1.3 因果效应估计的挑战…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图&#xff0c;但是底层依赖了yahboomcar_bringup做底层的数据处理&#xff0c;所以先把依赖的工程导入。 程序启动后&#xff0c;会订阅imu和odom数据&#xff0c;过滤掉一部分的imu数据后&#xff0c;然后与odom数据进行融合&#xff0c;最后输出一个…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景&#xff1a;DemoScene&#xff08;Unity 2019.4.0f1项目环境&#xff09; Player物体上的CharacterController2D&#xff0c;Mask添加Wall层…

mybatis(134/134)完结

一级缓存&#xff08;默认情况下开启&#xff09;同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 &#xff1a;同一个sqlsessionfactory&#xff0c;sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件&#xff1a;方便进行分页&#x…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网&#xff08;IoT&#xff09;短距无线通信生态系统中&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输&#xff0c;最高能满足2Mbps的数据传输速率&…

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查&#xff0c;较基础&#xff0c;因此直接导入代码。 地址表 一个用户可以有多个地址&#xff0c;同时有一个地址为默认地址。用户还可为地址添加例如&q…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

MySQL分表自动化创建的实现方案(存储过程、事件调度器)

《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中&#xff0c;随着数据量的不断增长&#xff0c;单表存储数据可能会面临性能瓶颈&#xff0c;例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略&#xff0c;它将数据分散存储在多…

接口技术-第6次作业

目录 作业内容 解答 1.假设在一个系统中&#xff0c;8255A的端口地址为184H-187H&#xff0c;A口工作于方式1输出&#xff0c;B口工作于方式1输入&#xff0c;禁止中断&#xff0c;C口剩余的两根线PC5&#xff0c;PC4位输入&#xff0c;如下图所示&#xff0c;试编写初始化…

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令&#xff0c;我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后&#xff0c;启动我们的linux&#xff0c;输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…

CSS(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…

对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;企业与顾客之间的交互方式变得日益多样化&#xff0c;移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验&#xff0c;同时也为企业积累了大量的顾客行为数据。本文旨在…

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…

UE AController

定义和功能 AController是一种特定于游戏的控制器&#xff0c;在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入&#xff0c;并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色&#xff0c;增强游戏设计…

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…

51单片机开发:定时器中断

目标&#xff1a;利用定时器中断&#xff0c;每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示&#xff0c;要使用定时器中断T0&#xff0c;须开启TE0、ET0。&#xff1a; 系统中断号如下图所示&#xff1a;定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

深度学习框架应用开发:基于 TensorFlow 的函数求导分析

深度学习框架应用开发&#xff1a;基于 TensorFlow 的函数求导分析 在深度学习的世界里&#xff0c;梯度计算是优化算法的核心。而 TensorFlow 作为一款强大的深度学习框架&#xff0c;为我们提供了简洁而强大的工具来进行自动求导操作&#xff0c;这极大地简化了深度学习模型的…