k8s 之 Role-Based Access Control

在 Kubernetes 中,RBACRole-Based Access Control)是一个用来控制对 Kubernetes 资源访问的授权机制。它通过定义不同角色(Role)和这些角色可以访问的权限,确保只有被授权的用户或服务能够执行特定的操作。RBAC 提供了灵活的权限管理功能,适用于不同的用户、服务账户以及应用程序。

RBAC 的基本概念

Kubernetes 的 RBAC 主要包括以下几个基本概念:

  1. RoleClusterRole
  2. RoleBindingClusterRoleBinding
  3. ServiceAccount
  4. PolicyRules
1. RoleClusterRole
  • Role:定义了在某个特定命名空间内的权限。它描述了某个用户或服务账户可以对哪些资源进行哪些操作。例如,Role 可以授予用户在 default 命名空间中列出 Pods 和创建 Deployments 的权限。

    • 示例 Role

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:namespace: default  # 指定 Role 的命名空间name: pod-reader    # Role 的名称
      rules:
      - apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]
      

      上述示例中,pod-reader 角色授予用户对 default 命名空间下的 Pods 资源的 getlist 权限。

  • ClusterRole:定义了集群范围内的权限,不依赖于命名空间。ClusterRole 可以用于跨命名空间访问资源,或者在集群级别执行操作(例如管理节点、查看集群的状态等)。

    • 示例 ClusterRole

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:# ClusterRole 没有命名空间字段name: cluster-admin
      rules:
      - apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "create", "delete"]
      

      上述示例中的 cluster-admin ClusterRole 赋予用户对集群内所有 Pods 资源的管理权限。

2. RoleBindingClusterRoleBinding
  • RoleBinding:将一个 Role(命名空间级别)或 ClusterRole(集群级别)绑定到一个或多个用户、组或者服务账户上。RoleBinding 只在特定的命名空间内有效。

    • 示例 RoleBinding

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:name: read-podsnamespace: default
      subjects:
      - kind: Username: "jane"  # 绑定的主体是用户 "jane"apiGroup: rbac.authorization.k8s.io
      roleRef:kind: Rolename: pod-reader  # 绑定到名为 pod-reader 的 RoleapiGroup: rbac.authorization.k8s.io
      

      在这个例子中,用户 jane 被授权使用 default 命名空间中的 pod-reader Role,从而可以列出和查看该命名空间中的 Pods。

  • ClusterRoleBinding:将一个 ClusterRole 绑定到一个或多个用户、组或者服务账户上,作用范围是整个集群。

    • 示例 ClusterRoleBinding

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:name: admin-binding
      subjects:
      - kind: Username: "jane"apiGroup: rbac.authorization.k8s.io
      roleRef:kind: ClusterRolename: cluster-admin  # 绑定到集群管理员权限apiGroup: rbac.authorization.k8s.io
      

      这意味着 jane 用户将会获得集群管理员的权限,能够在整个集群中执行任何操作。

3. 使用 kubectl impersonate 命令模拟 jane 用户

Kubernetes 提供了 kubectl auth can-i 命令来模拟某个用户的权限。你可以使用 kubectl impersonate 来临时以 jane 用户的身份运行命令,检查她是否具有某些操作的权限。

步骤:
  1. 模拟 jane 用户执行 kubectl 命令

    使用 kubectl auth can-i 命令来检查 jane 是否有执行某个操作的权限。例如,检查她是否可以在 default 命名空间下列出 Pods:

    kubectl auth can-i list pods --namespace=default --as=jane
    

    解释:

    • --as=jane:指定以 jane 用户身份进行操作。
    • list pods --namespace=default:测试 jane 是否可以列出 default 命名空间中的 Pods。

    如果命令返回 yes,说明 jane 拥有该操作的权限;如果返回 no,说明 jane 不具有该权限。

示例输出:
$ kubectl auth can-i list pods --namespace=default --as=jane
yes

如果返回 yes,那么 jane 就能够列出 Pods,说明她有 pod-reader 角色授予的权限。

4. 检查 RoleBinding 是否生效

你还可以检查 RoleBinding 是否正确配置,确认是否已将正确的角色和主体绑定在一起。

步骤:
  1. 查看 RoleBinding

    使用以下命令检查 RoleBinding 是否正确绑定了角色:

    kubectl get rolebinding read-pods --namespace=default -o yaml
    

    输出应类似于:

    kind: RoleBinding
    metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"RoleBinding","metadata":{"annotations":{},"name":"read-pods","namespace":"default"},"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"Role","name":"pod-reader"},"subjects":[{"apiGroup":"rbac.authorization.k8s.io","kind":"User","name":"jane"}]}creationTimestamp: "2024-12-04T06:31:39Z"name: read-podsnamespace: defaultresourceVersion: "188345"uid: 283615ff-8e9b-4e25-a6e8-7e5bcbbd582f
    roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: pod-reader
    subjects:
    - apiGroup: rbac.authorization.k8s.iokind: Username: jane
    
  2. 检查 Role 配置

    确保 pod-reader 角色已正确配置,并且具有正确的权限。使用以下命令检查 pod-reader 角色:

    kubectl get role pod-reader --namespace=default -o yaml
    

    输出应类似于:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"pod-reader","namespace":"default"},"rules":[{"apiGroups":[""],"resources":["pods"],"verbs":["get","list"]}]}creationTimestamp: "2024-12-04T06:31:33Z"name: pod-readernamespace: defaultresourceVersion: "188338"uid: 78e25dfb-4bd2-41da-af5f-4b812caa7cbf
    rules:
    - apiGroups:- ""resources:- podsverbs:- get- list
    

    确保角色 pod-reader 确实有对 pods 资源的 getlist 权限。

5. ServiceAccount
  • ServiceAccount:通常用于为 Kubernetes 中运行的 Pod 提供身份验证。通过给 Pod 分配一个 ServiceAccount,可以控制 Pod 对 API 服务器的访问权限。例如,Pod 可以被配置为使用一个特定的 ServiceAccount,该账户可能拥有对某些资源的特定权限。

    • 示例 ServiceAccount

      apiVersion: v1
      kind: ServiceAccount
      metadata:name: my-app-service-accountnamespace: default
      

      你可以为 Pod 分配这个 ServiceAccount,从而使 Pod 拥有该账户的权限。

5. 测试 Pod 的 ServiceAccount 权限

在 Kubernetes 中,ServiceAccount 是一种用于为 Pod 或应用程序提供身份认证的机制。当一个 Pod 被分配一个 ServiceAccount 时,Kubernetes 会将与该账户关联的权限授予该 Pod,从而允许它与 Kubernetes API 进行交互。

要测试一个 Pod 的 ServiceAccount 权限,通常是通过以下几个步骤来检查它是否有正确的权限来执行某些操作(如查看、创建或删除资源等)。我们可以通过以下步骤测试 ServiceAccount 的权限:

  1. 确保 Pod 使用了正确的 ServiceAccount

    首先,确保 Pod 使用了您所创建的 ServiceAccount。可以在 Pod 的 YAML 文件中指定 serviceAccountName 来确保 Pod 使用该账户。

    例如,假设您有一个 ServiceAccount 名为 my-app-service-account,然后在 Pod 配置中引用它:

    apiVersion: v1
    kind: Pod
    metadata:name: my-app-pod
    spec:serviceAccountName: my-app-service-account  # 绑定 ServiceAccountcontainers:- name: my-app-containerimage: nginx
    
  2. 为 ServiceAccount 配置适当的 RBAC 权限

    为了让 my-app-service-account 拥有访问权限,您需要使用 RBAC 配置为其授予特定的角色(RoleClusterRole)和操作权限(如 getlistcreate 等)。以下是一个示例,假设您希望 my-app-service-account 有权限列出 Pods 资源:

    • Role(命名空间级别权限):

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:name: pod-readernamespace: default
      rules:
      - apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]
      
    • RoleBinding(将 Role 绑定到 ServiceAccount):

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:name: read-podsnamespace: default
      subjects:
      - kind: ServiceAccountname: my-app-service-accountnamespace: default
      roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
      

    在这个示例中,pod-reader 角色允许 my-app-service-account 列出和获取 default 命名空间中的 Pods 资源。

  3. 测试 ServiceAccount 权限

    现在,您可以通过以下方式来测试 my-app-service-account 是否具有足够的权限:

    • 使用 kubectl auth can-i 命令

      使用 kubectl auth can-i 命令模拟 ServiceAccount 执行操作。这个命令会帮助您测试 ServiceAccount 是否有权限执行某个操作。

      kubectl auth can-i list pods --namespace=default --as=system:serviceaccount:default:my-app-service-account
      

      这里:

      • list pods --namespace=default:检查 my-app-service-account 是否有权限列出 default 命名空间下的 Pods。
      • --as=system:serviceaccount:default:my-app-service-account:模拟以 my-app-service-account 身份执行操作。

      如果返回 yes,则说明 ServiceAccount 有权限列出 Pods。如果返回 no,则说明没有该权限。

      示例输出

      $ kubectl auth can-i list pods --namespace=default --as=system:serviceaccount:default:my-app-service-account
      yes
      
    • 直接在 Pod 中测试权限

      你可以手动为该 Pod 指定一个 ServiceAccount。创建一个 YAML 文件,修改 ServiceAccount 后再应用

      apiVersion: v1
      kind: Pod
      metadata:name: debug
      spec:serviceAccountName: my-app-service-accountcontainers:- name: debugimage: bitnami/kubectl:latestcommand: ["/bin/sh"]stdin: truetty: true
      kubectl exec -it debug -n default -- /bin/sh
      

      在这里插入图片描述

6. PolicyRules
  • PolicyRules:在 RoleClusterRole 中定义的一组规则,用来描述哪些资源、哪些操作是允许的。PolicyRules 使用 apiGroupsresourcesverbs 来定义具体的权限。

    • apiGroups:指定资源属于哪个 API 组。例如,"" 代表 Core API 组,apps 代表部署等资源。

    • resources:指定资源类型,如 podsdeploymentsservices 等。

    • verbs:指定允许的操作,如 get(获取)、list(列出)、create(创建)、delete(删除)等。

    • 示例 PolicyRules

      rules:
      - apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]
      - apiGroups: ["apps"]resources: ["deployments"]verbs: ["create", "delete"]
      

      在这个示例中,定义了两条规则:

      • pods 资源,允许 getlist 操作。
      • deployments 资源,允许 createdelete 操作。

RBAC 使用场景

  • 控制集群资源访问:通过 RoleClusterRole 控制用户或服务账户对 Kubernetes 资源的访问权限。例如,限制某个用户只能查看 Pods,而不能修改或删除。
  • 服务账户:为不同的应用程序、服务或者 Pod 创建专用的服务账户,并绑定适当的角色,确保它们只有执行任务所需的最小权限。
  • 权限最小化:通过精细的权限控制,遵循 最小权限原则,使得用户、服务账户或者应用程序只能访问它们执行任务所需的资源。

常见命令

  • 查看角色和角色绑定:

    kubectl get roles
    kubectl get rolebindings
    kubectl get clusterroles
    kubectl get clusterrolebindings
    
  • 创建和应用 RBAC 资源:

    kubectl apply -f role.yaml
    kubectl apply -f rolebinding.yaml
    

总结

Kubernetes 的 RBAC 通过 RoleClusterRole 来定义不同的权限,并通过 RoleBindingClusterRoleBinding 来将这些权限绑定到特定的用户、组或服务账户。RBAC 提供了一种细粒度的访问控制机制,帮助管理员确保集群资源的安全性,并且根据不同的需求授予相应的权限。

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

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

相关文章

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中,我们的Cypher都用的是字符串,字符串拼接简单,但存在写错的风险,对于一些比较懒的开发者,甚至觉得之间写字符串还更自在快速,也确实,但如果在后期需要…

数据科学与大数据之间的区别

什么是数据科学? 数据科学是一个跨学科领域,它将统计学和计算方法相结合,旨在从数据中提取见解和知识。它涉及收集、处理、分析以及解读数据,以揭示可用于为决策过程提供依据并推动创新的模式、趋势和关系。 数据科学涵盖了广泛…

neo4j如何存储关于liquidity structure的层次和关联结构

在 Neo4j 中存储关于流动性结构(liquidity structure)的层次和关联结构非常适合,因为 Neo4j 是一个基于图的数据库,能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…

七牛云成功保存但无法显示和访问{“error“:“download token not specified“}

在使用七牛云存储图片时,前端通过链接访问图片时遇到错误: {"error":"download token not specified"} 具体表现为: 后端通过 access_key 和 secret_key 生成了上传和下载的 Token。前端将域名与 res.key 拼接后生成图…

智慧银行反欺诈大数据管控平台方案(四)

智慧银行反欺诈大数据管控平台的核心内容,是通过整合多维度、多层次的金融交易信息,利用先进的大数据分析、机器学习与人工智能算法,构建一个系统性、实时性和智能化的反欺诈管控网络,旨在提供全面、高效、精准的风险评估机制。该…

jmeter基础_打开1个jmeter脚本(.jmx文件)

课程大纲 方法1.菜单栏“打开” 菜单栏“文件” - “打开” (或快捷键,mac为“⌘ O”),打开文件选择窗口 - 选择脚本文件,点击“open”,即可打开脚本。 方法2.工具栏“打开”图标 工具栏点击“打开”图标&…

STM32 BootLoader 刷新项目 (十三) Python上位机介绍

STM32 BootLoader 刷新项目 (十三) Python上位机介绍 大家好,这是我们STM32 BootLoader的最后一篇文章了,讲述用Python写的上位机,也更新了半年时间了,谢谢大家的支持,到目前为止,已经更新了12篇文章了&am…

ArUco识别定位原理

1. ArUco是什么 ArUco marker是一种汉明码方格图。它由一个宽的黑边和一个内部的二进制矩阵组成,黑色的边界有利于快速检测到图像,Marker ID是他的二进制矩阵编码,Marker size是图片的大小。黑色方块对应0,白色方块对应1&#xf…

每天五分钟机器学习:平行和重合

本文重点 在前面的课程中,我们学习了超平面分离定理,这里面有一个超平面的概念,那么本文学习下,什么情况下超平面是重合的,什么情况下超平面是平行的,这对后面我们学习支持向量机特别重要。 超平面的定义 超平面是指在n维空间中,余维度为1的子空间,即超平面是n维空间…

【学习总结|DAY011】Java数组、二维数组

一、数组概述 在Java编程中,数组是一种用于存储固定大小同类型元素的集合。它提供了随机访问元素的能力,使得处理大量数据变得更加高效。 二、一维数组 1. 定义与初始化 一维数组是最简单的数组形式,其定义方式如下: dataTyp…

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…

uniapp页面不跳转问题!(使用uni.$u.route或者原生uni.navigateTo)页面跳转ios无效果(既不报错也不跳转页面)

1.问题描述: 通常使用添加事件来触发页面跳转都没问题,但是现在业务需求,在一个方法中自动去携带参数跳转到另外一个页面,android真机无问题,就ios一直无法跳转过去! 2.解决方法: 2.1 必须使用setTimeout来延迟跳转 2.2 setTimeout的延迟时间必须要大于300 不要问为什么…

递归 算法

递归、搜索与回溯算法 1. 汉诺塔2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点5. Pow(x,n)-快速幂 1. 汉诺塔 题目链接: 面试题 08.06. 汉诺塔问题 解题思路: 首先观察有一个、两个、三个盘子时的情况,手…

深度学习常用指标

1. 混淆矩阵(误差矩阵) 2. 准确率(overall accuracy) 代表了所有预测正确的样本占所有预测样本总数的比例 这里分类正确代表了正样本被正确分类为正样本,负样本被正确分类为负样本 3. 平均精度(average…

黑马JavaWeb-day06、07、08(SQL部分) _

文章目录 MYSQL概述数据模型SQL简介SQL分类 DDL数据库操作表操作 DML增(INSERT)改(UPDATE)删(DELETE) DQL基本查询条件查询(where)分组查询(group by)排序查询…

D87【python 接口自动化学习】- pytest基础用法

day87 pytest运行参数 -m -k 学习日期:20241203 学习目标:pytest基础用法 -- pytest运行参数-m -k 学习笔记: 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例,markers最好使用英文 [pytest] testpaths./te…

【嘟嘟早教卡】 小程序源码分享带后台管理

【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成,后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片,基本大部分家庭都买过认知卡片,我按照…

黑马微服务开发与实战学习笔记_MybatisPlus_P1介绍与快速入门

系列博客目录 文章目录 系列博客目录MybatisPlus介绍快速入门Part1:入门案例Part1.1:MyBatis项目Part1.2:实现MP Part2:常见注解Part2.1:约定Part2.2:常见注解 Part3:常见配置MyBatisPlus使用的基本流程是什么? MybatisPlus介绍 在Mybatis上加了Plus,表示对Mybati…

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质(Materials) 定义了场景中对象的表面属性,包括颜色、金属度、粗糙度、透明度等等;可以在材质编辑器中可视化地创建和编辑材质;虚幻引擎的渲染管线的着色器是用高级着色语言(…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解,每一步都十分的细致,如果你感兴趣希望多多点赞收藏关注支持 简介:文章对爬虫展开多方面剖析。起始于爬虫的基本概念,即依特定规则在网络抓取信息的程序或脚本,在搜索引擎信息提取上作…