当前位置: 首页 > news >正文

【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?

RBAC (Role-Based Access Control) 是 Kubernetes 中用于控制访问权限的机制。

  • 通过 RBAC,管理员可以细粒度地控制用户和服务账户对 Kubernetes 资源的访问权限。
  • RBAC 的核心思想是根据角色(Role)来授予权限,角色可以是用户、组或服务账户。

1. RBAC 组件简介

在 Kubernetes 中,RBAC 基于以下几个重要的资源:

  • Role:定义了在特定命名空间内的权限。例如,某个用户可以读取某个命名空间中的 Pod,但不能修改它们。
  • ClusterRole:与 Role 类似,但它适用于集群级别的资源。ClusterRole 可以赋予跨所有命名空间的权限,或者集群级别的权限(例如访问节点、查看集群状态等)。
  • RoleBinding:将 Role 或 ClusterRole 与一个用户或服务账户(ServiceAccount)绑定,并且指定该用户或服务账户可以在指定的命名空间中执行的操作。
  • ClusterRoleBinding:将 ClusterRole 与一个用户、服务账户或用户组绑定,并赋予该角色跨集群的权限。

2. RBAC 权限的授予流程

RBAC 权限授予包括以下步骤:

  1. 定义 Role 或 ClusterRole:定义某个角色所拥有的权限(可以是资源的 getlistcreateupdatedelete 权限)。
  2. 创建 RoleBinding 或 ClusterRoleBinding:将用户或服务账户与某个 Role 或 ClusterRole 绑定,从而赋予其相应的权限。

3. 创建和配置 RBAC 资源

1. 定义 Role 和 ClusterRole
  • Role 示例:限制一个用户只能在某个命名空间内查看 Pods 和 Deployments。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: mynamespace  # 适用于某个命名空间
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list"]
    
  • ClusterRole 示例:授予用户访问集群内所有命名空间的 Pods 和 Deployments 的权限。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cluster-pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list"]
    
2. 绑定 Role 或 ClusterRole
  • RoleBinding:将 Role 绑定到某个用户或服务账户,在特定的命名空间内授予权限。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-pods-binding
      namespace: mynamespace  # 绑定到特定命名空间
    subjects:
    - kind: User
      name: "johndoe"  # 被绑定的用户
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader  # 绑定到之前定义的 Role
      apiGroup: rbac.authorization.k8s.io
    
  • ClusterRoleBinding:将 ClusterRole 绑定到用户、服务账户或用户组,以便其具有跨所有命名空间的权限。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: cluster-read-pods-binding
    subjects:
    - kind: User
      name: "johndoe"  # 被绑定的用户
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: cluster-pod-reader  # 绑定到之前定义的 ClusterRole
      apiGroup: rbac.authorization.k8s.io
    

4. 管理 Kubernetes 权限

  • 查看当前权限:使用 kubectl auth can-i 命令查看某个用户、服务账户或角色是否有某项操作权限。例如,查看 johndoe 用户是否可以查看 Pods:

    kubectl auth can-i get pods --as johndoe
    
  • 查看 Role 和 RoleBinding:可以通过 kubectl get 命令查看所有 Role 和 RoleBinding。

    查看所有命名空间的 Role:

    kubectl get roles --all-namespaces
    

    查看指定命名空间的 RoleBinding:

    kubectl get rolebindings -n mynamespace
    
  • 更新权限:如果需要修改某个用户的权限,只需编辑对应的 Role 或 ClusterRole,或者更新 RoleBinding 或 ClusterRoleBinding。修改后,Kubernetes 会自动生效。

  • 调试权限问题:当用户或服务账户无法访问资源时,可以使用 kubectl describe 命令查看 RBAC 配置并检查是否有误,或者使用 kubectl auth can-i 命令来测试权限。

5. 权限控制策略

  • 最小权限原则:只授予必要的权限,避免过多的权限分配。通过精细化的 Role 和 ClusterRole,可以确保每个用户或服务账户仅能执行其职责所需的操作。
  • Role 和 ClusterRole 的区别
    • Role 适用于命名空间级别的权限管理,而 ClusterRole 则是集群级别的权限管理,可以跨命名空间。
    • 如果一个应用需要跨多个命名空间的权限,则使用 ClusterRole 和 ClusterRoleBinding;如果只是需要在某个特定命名空间内进行管理,则使用 Role 和 RoleBinding。

总结

  • RBAC 是 Kubernetes 中重要的权限控制机制,可以通过 RoleClusterRoleRoleBindingClusterRoleBinding 资源来管理集群内的访问权限。
  • 通过定义适当的角色和角色绑定,可以控制用户、服务账户或组对 Kubernetes 资源的访问权限。
  • 最小权限原则应始终作为权限管理的最佳实践,以确保安全性并减少潜在的风险。

https://github.com/0voice

http://www.dtcms.com/a/113304.html

相关文章:

  • MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务
  • HTTP/2:新一代网络协议的变革与优势
  • 借 DCMM 东风,提升数据管理价值生产力
  • BugKu Simple_SSTI_2
  • 【UE5 C++课程系列笔记】31——创建Json并保存为文件
  • 横扫SQL面试——TopN问题
  • 团体设计程序天梯赛L2-025 # 分而治之
  • Maven使用
  • 3535 数组分割
  • Python 数据库选型指南(架构师视角)
  • BUUCTF-web刷题篇(12)
  • 智能体和RPA都需要程序思维,如何使用影刀的变量?
  • HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context
  • Python解决“数字插入”问题
  • 英语听力4.5
  • 6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
  • Python作业3 字符田字格绘制
  • C语言之标准库中的常用api
  • 必刷算法100题之计算右侧小于当前元素的个数
  • 【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)
  • Linux数据库:【数据库基础】【库的操作】【表的操作】
  • [SAP SD] 常用事务码
  • Linux的/proc/sys/net/ipv6/conf/(all,default,interfaceName具体网络接口名称)/ 笔记250405
  • 国产系统统信uos和麒麟v10在线打开word给表格赋值
  • HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口
  • ConstructorResolver
  • Day2-2:前端项目uniapp壁纸实战
  • HashMap 底层原理详解
  • C++学习之LINUX网络编程-套接字通信基础
  • JWT认证服务