【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。

    yaml 复制代码
    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 的权限。

    yaml 复制代码
    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 绑定到某个用户或服务账户,在特定的命名空间内授予权限。

    yaml 复制代码
    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 绑定到用户、服务账户或用户组,以便其具有跨所有命名空间的权限。

    yaml 复制代码
    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:

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

    查看所有命名空间的 Role:

    bash 复制代码
    kubectl get roles --all-namespaces

    查看指定命名空间的 RoleBinding:

    bash 复制代码
    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

相关推荐
可乐加.糖2 小时前
腾讯云K8s容器部署SpringBoot项目实现方案
java·spring boot·容器·kubernetes·k8s·腾讯云
阿里云云原生3 小时前
不断突破极致:SPL新版数据加工能力焕新登场
云原生
运维博客团3 小时前
搭建K8S-1.23
云原生·容器·kubernetes
KubeSphere3 小时前
KubeSphere 网关组件(ingress-nginx)安全漏洞公告正式发布
kubernetes
陈苏同学4 小时前
Docker 从入门到进阶 (Win 环境) + Docker 常用命令
linux·运维·docker·容器
rider1894 小时前
【8】搭建k8s集群系列(二进制部署)之安装node节点组件(kubelet)
容器·kubernetes·kubelet
love530love5 小时前
记一次不太顺利的Docker重装
运维·docker·容器
神奇的海马体6 小时前
ZooKeeper集群部署(容器)
分布式·zookeeper·云原生
信徒_7 小时前
Kafka 在 k8s 中的消费者实例
分布式·kafka·kubernetes
从零开始学习人工智能9 小时前
Docker 镜像导出与导入:export/import vs save/load
运维·docker·容器