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 关联起来,使主体获得角色所赋予的权限。
为什么 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 支持状态 | 默认启用,官方推荐 | 已弃用,仅用于向后兼容 |
迁移建议: 如果集群仍在使用 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:授予集群管理员对所有资源的完全控制权限。