RBAC 基础回顾:Kubernetes RBAC 核心概念

在深入 Serverless 控制面之前,必须重新夯实 Kubernetes RBAC 的四个核心构建块。它们是所有策略命中率与误报分析的底层语言。理解这些原语之间的绑定关系与作用域差异,是后续进行策略审计与复核的前提。

2.1 核心资源对象:Role 与 ClusterRole

Role 和 ClusterRole 定义了“能做什么”——即一组权限规则集合。两者的区别仅在于作用域:Role 作用于特定命名空间,ClusterRole 作用于整个集群(包括所有命名空间与集群级别资源)。

特性 Role ClusterRole
作用域 单个命名空间 整个集群(所有命名空间 + 集群资源)
可授权资源 命名空间内资源(Pod、Service、Deployment 等) 所有资源,包括 Node、PersistentVolume、ClusterRole 自身、非资源端点(/healthz)
复用方式 只能通过 RoleBinding 绑定到同一命名空间的 Subject 可通过 RoleBinding(绑定后仅生效于该命名空间)或 ClusterRoleBinding(全局生效)
典型场景 应用服务账号的细粒度权限隔离 集群管理员、监控组件、跨命名空间读取器
关键认知:ClusterRole 通过 RoleBinding 绑定时,其权限会被“裁剪”到目标命名空间内。这是 Serverless 控制面中实现“全局策略模板 + 租户级生效”的核心机制。

2.2 绑定机制:RoleBinding 与 ClusterRoleBinding

绑定是连接“权限集合”(Role/ClusterRole)与“身份”(Subject)的桥梁。绑定决定了谁获得这些权限。

  • RoleBinding:将 Role 或 ClusterRole 授予 Subject,且权限范围限定在 RoleBinding 所在的命名空间。即使绑定了 ClusterRole,权限也会被限制在该命名空间内。
  • ClusterRoleBinding:仅能将 ClusterRole 授予 Subject,且权限范围覆盖整个集群。不能绑定 Role。
# RoleBinding 示例:将集群级别的 ClusterRole 限制到特定命名空间
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: serverless-pod-reader
  namespace: tenant-alpha
subjects:
- kind: ServiceAccount
  name: serverless-worker
  namespace: tenant-alpha
roleRef:
  kind: ClusterRole
  name: pod-reader        # 全局定义的 ClusterRole
  apiGroup: rbac.authorization.k8s.io
误报高发区:审计日志中经常出现“ClusterRole 被 RoleBinding 引用但权限超出预期”的误判。实际上 RoleBinding 会自动降级作用域,但静态分析工具往往忽略这一语义,导致误报。

2.3 Subject 类型与识别

Subject 是“谁”在请求权限。Kubernetes RBAC 支持三种 Subject 类型:

  • User:通常由外部身份提供商(OIDC、LDAP)管理,Kubernetes 本身不创建 User 对象。
  • Group:一组用户的逻辑集合,常用于绑定组织角色(如 system:serviceaccounts)。
  • ServiceAccount:由 Kubernetes 管理的命名空间级身份,是 Pod 内进程的默认身份。Serverless 控制面中 90% 的请求来自 ServiceAccount。

2.4 Resource 规则与请求匹配逻辑

RBAC 策略的命中判定基于请求属性与规则字段的精确匹配。一个典型的规则包含以下维度:

规则字段 说明 匹配示例
apiGroups API 组,空字符串表示核心组 [""] 匹配 Pod;["apps"] 匹配 Deployment
resources 资源类型,支持通配符 * ["pods"] 或 ["pods/log"] 子资源
verbs 操作动词,如 get、list、create、delete ["get", "list"] 允许只读
resourceNames 可选,限定到具体资源实例 ["my-pod-*"] 仅匹配特定 Pod
# 一个典型的 Serverless 控制面 ClusterRole 规则片段
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["serverless.example.com"]
  resources: ["functions", "functions/status"]
  verbs: ["create", "update", "patch", "delete"]

2.5 核心概念关系图

下图展示了 RBAC 四个核心对象之间的绑定关系与作用域传递路径:

Kubernetes RBAC 核心概念关系图 Kubernetes RBAC 核心概念关系图 Role 命名空间级权限 ClusterRole 集群级权限 RoleBinding 绑定到命名空间 ClusterRoleBinding 绑定到整个集群 Subject User / Group / SA 引用 可引用(作用域降级) 引用 绑定 绑定 作用域传递规则 • RoleBinding + Role → 权限限制在 RoleBinding 所在命名空间 • RoleBinding + ClusterRole → 权限被降级到 RoleBinding 所在命名空间 • ClusterRoleBinding + ClusterRole → 权限全局生效,不受命名空间限制

2.6 策略命中率与误报的根源

基于上述核心概念,可以归纳出 RBAC 策略审计中常见的两类问题:

  • 命中率偏低:通常因为 Role/ClusterRole 中定义的 resources 或 verbs 与请求不匹配(如缺少子资源 pods/log),或 resourceNames 限制过严。
  • 误报高发:静态分析工具常忽略 RoleBinding 对 ClusterRole 的作用域降级语义,将“全局可读”误判为“越权访问”;此外,system:authenticated 等隐式 Group 绑定也容易被遗漏。
Serverless 控制面建议:优先使用 ClusterRole 定义通用策略模板,再通过 RoleBinding 绑定到各租户命名空间。这样既能复用策略定义,又能通过命名空间隔离实现租户级权限边界,同时降低策略数量膨胀带来的审计复杂度。