1. RBAC 基础概念

什么是 RBAC

基于角色的访问控制(RBAC,Role-Based Access Control) 是一种将权限授予“角色”而非直接授予“用户”的授权模型。在 Kubernetes 中,RBAC 通过定义 Role(角色)和 RoleBinding(角色绑定)资源对象,实现细粒度的 API 访问控制。

核心思想:用户 → 角色 → 权限。用户不直接拥有权限,而是通过绑定到某个角色来继承该角色所定义的权限集合。

关键实体:
  • Subject(主体):可以是 User、Group 或 ServiceAccount。
  • Role(角色):一组权限规则的集合,定义了对哪些资源(如 Pod、Service)可以执行哪些操作(如 get、list、create)。
  • RoleBinding(角色绑定):将 Subject 与 Role 关联起来,使主体获得角色所赋予的权限。
RBAC 核心三要素关系 Subject User / Group / SA RoleBinding 关联主体与角色 Role 权限规则集合 绑定 引用 工作流程 1. 管理员创建 Role,定义对某命名空间内资源的访问权限。 2. 创建 RoleBinding,将 User 或 ServiceAccount 绑定到该 Role。 3. 主体发起 API 请求时,Kubernetes 检查其绑定的角色是否允许该操作。

为什么 Kubernetes 需要 RBAC

Kubernetes 是一个多租户、多组件的分布式系统,API Server 是集群的唯一入口。如果没有有效的授权机制,任何拥有集群访问权限的主体都可以执行任意操作,这将带来严重的安全风险。

安全需求 RBAC 的解决方案
最小权限原则 只授予完成工作所必需的最小权限集合,避免权限滥用。
多租户隔离 通过 Namespace 级别的 Role 实现不同团队/项目之间的资源隔离。
服务账户管理 Pod 中的应用程序通过 ServiceAccount 获得精确的 API 访问权限。
审计与合规 清晰的权限绑定关系便于审计追踪,满足合规要求。
动态权限调整 修改 Role 或 RoleBinding 即可实时更新权限,无需重启组件。
最佳实践: 在 Kubernetes 1.6 之后,RBAC 已成为默认且推荐的授权模式。生产集群应始终启用 RBAC,并禁用旧版的 ABAC 或 AlwaysAllow 模式。

RBAC 与 ABAC 的区别

ABAC(Attribute-Based Access Control,基于属性的访问控制) 是 Kubernetes 早期使用的授权模式。它通过策略文件(Policy File)定义权限规则,规则基于用户属性、资源属性、环境属性等进行匹配。

下表从多个维度对比 RBAC 与 ABAC 的核心差异:

对比维度 RBAC(基于角色) ABAC(基于属性)
配置方式 通过 Kubernetes API 资源(Role、RoleBinding)动态管理 通过静态 JSON 策略文件,修改后需重启 API Server
灵活性 中等,权限通过角色组合实现 高,支持复杂的属性匹配逻辑(如用户组 + 资源标签)
管理复杂度 低,角色和绑定关系清晰直观 高,策略文件随规模增长难以维护
性能 高,基于角色缓存,匹配速度快 低,每次请求需遍历所有策略规则
审计可读性 好,角色绑定关系一目了然 差,策略文件难以快速理解权限全貌
Kubernetes 支持状态 默认启用,官方推荐 已弃用,仅用于向后兼容
RBAC vs ABAC 授权流程对比 RBAC 授权流程 API 请求 RoleBinding 查询 角色权限匹配 允许 / 拒绝 动态 API 资源,实时生效 无需重启 API Server ABAC 授权流程 API 请求 策略文件遍历 属性逐条匹配 允许 / 拒绝 静态 JSON 文件,修改需重启 策略数量多时性能下降
迁移建议: 如果集群仍在使用 ABAC,建议尽快迁移到 RBAC。迁移过程可以分步进行:先创建对应的 Role 和 RoleBinding,确认权限正确后,再移除 ABAC 策略文件并重启 API Server。Kubernetes 支持同时启用多种授权模式(如 RBAC + ABAC),但最终权限取各模式的并集。

RBAC 的两种作用域

Kubernetes RBAC 提供了两种作用域的角色资源,以适应不同的隔离需求:

  • Role(角色):作用于特定 Namespace,只能授权该 Namespace 内的资源(如 Pod、Service、Deployment)。
  • ClusterRole(集群角色):作用于整个集群,可以授权集群范围的资源(如 Node、PersistentVolume、Namespace)以及所有 Namespace 中的资源。

对应的绑定资源也分为两种:

  • RoleBinding:将 Role 或 ClusterRole 绑定到主体,但绑定的权限仍限定在 RoleBinding 所在的 Namespace 内。
  • ClusterRoleBinding:将 ClusterRole 绑定到主体,授予集群级别的权限。
常见组合场景:
  • 使用 Role + RoleBinding:授予某个用户对特定 Namespace 的管理权限。
  • 使用 ClusterRole + RoleBinding:授予某个用户查看所有 Namespace 中 Pod 的权限(通过 ClusterRole 定义权限,RoleBinding 限定可访问的 Namespace)。
  • 使用 ClusterRole + ClusterRoleBinding:授予集群管理员对所有资源的完全控制权限。