【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

相关推荐
掘根3 小时前
【即时通讯系统】项目框架与微服务拆分设计
微服务·云原生·架构
杭州杭州杭州3 小时前
Docker
运维·docker·容器
一体化运维管理平台4 小时前
容器监控难题破解:美信监控易全面支持K8s、Docker
云原生·容器·kubernetes
江畔何人初4 小时前
service发现
linux·运维·云原生
造夢先森5 小时前
Clawdbot(OpenClaw)安装部署教程
人工智能·微服务·云原生
qiubinwei5 小时前
kubeadm部署K8S集群(踩坑实录)
云原生·容器·kubernetes
牛奶咖啡135 小时前
Prometheus+Grafana构建云原生分布式监控系统(十三)_Prometheus数据模型及其PromQL
云原生·prometheus·prometheus数据类型·promql使用场景·promql表达式解析·promql数据类型·监控系统的方法论与指标
等什么君!6 小时前
Docker 数据卷:MySQL 数据同步实战
运维·docker·容器
礼拜天没时间.6 小时前
《Docker实战入门与部署指南:从核心概念到网络与数据管理》:环境准备与Docker安装
运维·网络·docker·容器·centos
张小凡vip6 小时前
Kubernetes---存储方案:Rook自动结合Ceph
ceph·容器·kubernetes