1. 概述

在计算机安全领域,基于角色的访问控制(Role-Based Access Control,RBAC)是一种根据系统中实体的角色和职责来限制访问权限的机制。例如,系统中的管理员角色通常比访客角色拥有更高的权限。

本文将介绍 Kubernetes 中的 RBAC 机制。Kubernetes 通过 RBAC 实现了细粒度的权限控制,是保障集群安全的重要手段之一。

2. Kubernetes 中的 RBAC

Kubernetes 的 RBAC 机制支持实施最小权限原则(Principle of Least Privilege),即用户或服务只应被授予完成其任务所需的最小权限。这可以显著降低因凭证泄露带来的安全风险。

Kubernetes 提供了如下核心 API 对象用于实现 RBAC:

  • Role / ClusterRole:定义权限规则(允许对哪些资源执行哪些操作)
  • RoleBinding / ClusterRoleBinding:将权限绑定到具体用户、组或服务账户

3. 命名空间级别 vs 集群级别

在 Kubernetes 中,资源可以分为两类作用域:

类型 描述 示例资源
命名空间作用域 仅在特定命名空间中存在 Pod, Service, Deployment
集群作用域 全局存在,跨所有命名空间 Node, PersistentVolume, Namespace

⚠️ 注意:

  • Role 可用于定义命名空间作用域和集群作用域资源的权限
  • ClusterRole 仅用于定义集群作用域资源的权限

4. Role

Role 是 Kubernetes 中用于定义命名空间级别权限规则的资源对象。每个规则中可以指定允许操作的资源类型(resource)和操作类型(verb),规则只能是“允许”,不支持“拒绝”。

4.1 创建 Role

以下是一个 Role 示例,授予用户在 dev 命名空间中查看 Pod 和 Service 的权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dev-intern
  namespace: dev
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch"]

使用命令创建:

kubectl create role dev-intern --verb=get,list,watch --resource=pods,service --namespace=dev

✅ 推荐做法:使用 YAML 声明式创建,便于版本控制和复用

4.2 通配符使用

  • resources: ["*"] 表示所有资源
  • verbs: ["*"] 表示所有操作

示例:授予命名空间中所有资源的 list 权限

rules:
- apiGroups: [""]
  resources: ["*"]
  verbs: ["list"]

⚠️ 警告:通配符应谨慎使用,避免权限过大,违背最小权限原则

5. ClusterRole

ClusterRoleRole 类似,但用于定义集群级别的权限规则。它不仅可以作用于集群资源(如 Node),也可以作用于命名空间资源,但其权限将覆盖整个集群。

示例:授予查看 Node 和 Pod 的权限

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin-intern
rules:
- apiGroups: [""]
  resources: ["nodes", "pods"]
  verbs: ["get", "list"]

⚠️ 注意:ClusterRole 不指定 namespace 字段

6. Binding

RBAC 的核心在于将角色绑定到具体的“主体”(Subject),即用户、组或服务账户。

6.1 RoleBinding

RoleBinding 用于将角色绑定到特定命名空间中的主体。

示例:将用户 john 绑定到 dev-intern 角色

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-intern-binding
  namespace: dev
subjects:
- kind: User
  name: john
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: dev-intern
  apiGroup: rbac.authorization.k8s.io

也可以绑定 ClusterRole,此时权限仅限于当前命名空间:

roleRef:
  kind: ClusterRole
  name: cluster-admin-intern

6.2 ClusterRoleBinding

ClusterRoleBinding 用于将角色绑定到整个集群中的主体。

示例:将用户 jane 绑定到集群级别的 cluster-admin-intern 角色

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-intern-cluster-binding
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin-intern

⚠️ 注意:如果绑定的是 Role,其命名空间设置将被忽略

7. 总结

本文介绍了 Kubernetes 中的 RBAC 机制,包括:

✅ 核心对象:

  • Role:命名空间级别权限定义
  • ClusterRole:集群级别权限定义
  • RoleBinding:将权限绑定到命名空间中的主体
  • ClusterRoleBinding:将权限绑定到整个集群中的主体

✅ 使用建议:

  • 遵循最小权限原则,避免使用通配符
  • 推荐使用 YAML 声明式方式管理权限对象
  • 明确区分命名空间与集群作用域资源

RBAC 是 Kubernetes 安全体系的重要组成部分,合理配置 RBAC 策略可以有效提升集群安全性,避免权限滥用或误操作带来的风险。


原始标题:Role-Based Access Control in Kubernetes