在 Kubernetes 中,不当的权限配置可能比服务中断带来更深远的安全风险。RBAC(基于角色的访问控制)是 Kubernetes 核心的安全模型,几乎所有的生产集群都必须依赖它来实现精细化的权限管理。
本文将深入解析 RBAC 的核心机制,并通过可直接用于生产环境的实战示例,帮助你彻底掌握这一关键的安全基石。
一、RBAC 的核心价值:解决了什么问题?
RBAC,全称 Role-Based Access Control,其核心是清晰地定义并回答一个三元组问题:
- 谁 (Subject) 可以对
- 什么资源 (Resource) 执行
- 哪些操作 (Verb)。
在 Kubernetes 上下文中,这三个元素具体化为:
- 谁:用户 (User)、服务账户 (ServiceAccount) 或用户组 (Group)。
- 什么资源:Pod、Deployment、Service、ConfigMap 等各种 API 资源。
- 哪些操作:
get、list、create、update、delete 等 API 动词。
RBAC 的设计目标始终遵循 最小权限原则,即只授予主体完成其任务所必需的最小权限集,这是构建安全 Kubernetes 集群的黄金准则。
二、RBAC 的四大核心对象
1. Role / ClusterRole —— 定义权限规则
Role 和 ClusterRole 用于声明一组权限规则,定义了“能干什么”。其核心区别在于作用域:
- Role:命名空间 (Namespace) 级别,仅在其所属的命名空间内生效。
- ClusterRole:集群级别,权限作用于整个集群。
权限规则在 rules 字段中定义:
rules:
- apiGroups: [""] # 资源所属的 API 组,核心资源(如 Pod)为 “”
resources: ["pods"] # 资源类型
verbs: ["get", "list"] # 允许的操作
2. RoleBinding / ClusterRoleBinding —— 建立授权关系
RoleBinding 和 ClusterRoleBinding 用于将 Role 或 ClusterRole 的权限授予主体,定义了“把权限给谁”。
- RoleBinding:将命名空间内的 Role 或集群内的 ClusterRole 权限授予主体,主体获得的权限作用域受 Binding 所在的命名空间限制。
- ClusterRoleBinding:将 ClusterRole 的权限授予主体,权限在整个集群范围内生效。
3. Subject —— 被授权的对象
授权的主体可以是:
- User:外部用户(通常由证书或外部身份提供商管理)。
- Group:用户组。
- ServiceAccount:Pod 内部使用的服务账户。这是生产环境中最常见的授权主体。
4. Verb —— 允许的操作动作
常见的操作动词包括:
- 读操作:
get(获取单个资源)、list(列出资源)、watch(监听资源变化)。
- 写操作:
create(创建)、update(更新)、patch(部分更新)。
- 删除操作:
delete(删除)。
三、一个完整的 RBAC 授权流程
整个授权流程可以简化为一条清晰的链:
Role/ClusterRole (定义权限) → Binding (建立绑定) → Subject (获得权限)
流程示意如下:
ServiceAccount (主体)
↓
RoleBinding / ClusterRoleBinding (绑定)
↓
Role / ClusterRole (权限规则)
四、实战一:为 Pod 配置命名空间级别的只读权限
假设我们需要为 dev 命名空间中的一个 Pod 授予仅能读取当前命名空间下 Pod 信息的权限。
步骤 1:创建 Role(定义权限)
在 dev 命名空间创建一个名为 pod-reader 的 Role。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: dev
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
步骤 2:创建 ServiceAccount(创建主体)
在 dev 命名空间创建服务账户 app-sa,Pod 将使用此账户进行身份认证。
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-sa
namespace: dev
步骤 3:创建 RoleBinding(绑定权限)
将 pod-reader Role 的权限授予 app-sa 这个 ServiceAccount。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: ServiceAccount
name: app-sa
namespace: dev
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
步骤 4:在 Pod 中指定 ServiceAccount
创建 Pod 时,必须显式指定使用我们刚授权的 app-sa。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
namespace: dev
spec:
serviceAccountName: app-sa # 关键:指定服务账户
containers:
- name: myapp
image: nginx
最终效果:
- ✅ 该 Pod 内的应用可以成功执行
kubectl get pods -n dev。
- ❌ 无法执行
delete 或 create pod 的操作。
- ❌ 无法访问
dev 以外的其他命名空间中的资源。
这种利用 ServiceAccount 为工作负载赋权的模式,是 云原生 架构下实现安全访问的通用实践。
五、实战二:创建集群级别的只读账号
此场景常用于为运维或审计人员创建一个拥有全局只读权限的账号。
步骤 1:创建 ClusterRole(定义集群级权限)
创建一个名为 view-all 的 ClusterRole,允许对所有资源进行只读操作。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view-all
rules:
- apiGroups: ["*"] # 匹配所有 API 组
resources: ["*"] # 匹配所有资源
verbs: ["get", "list", "watch"] # 仅限读操作
步骤 2:创建 ClusterRoleBinding(进行全局授权)
将 view-all ClusterRole 的权限授予一个用户 dev-user。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: view-all-binding
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view-all
apiGroup: rbac.authorization.k8s.io
效果:用户 dev-user 可以在任何命名空间查看几乎所有资源,但无法进行任何修改。此类账号非常适合用于监控、审计或日常巡检。
六、RBAC 配置中常见的五大陷阱
- 误用 ClusterRoleBinding:轻易使用
ClusterRoleBinding 会将 ClusterRole 的权限全局授予,可能导致权限过度扩散。生产环境应优先考虑使用 RoleBinding 在命名空间级别进行授权。
- 忽略
apiGroups:不同资源属于不同的 API 组。例如,核心资源(Pod, Service)在 “” (空字符串) 组,而 Deployment 在 “apps” 组。配置错误会导致权限完全不生效。
- Pod 未指定 ServiceAccount:如果 Pod 的
spec 中没有明确指定 serviceAccountName,则会默认使用 default 服务账户,其权限可能不符合预期,从而导致应用运行失败。
- 直接授予
cluster-admin:为了方便,直接给服务账户绑定 cluster-admin 这个内置的超级管理员角色是极其危险的行为,严重违背最小权限原则,为集群安全埋下巨大隐患。
- 忽视内置集群角色:Kubernetes 预置了许多实用的 ClusterRole,如
view(只读)、edit(读写非权限资源)、admin(命名空间管理员)。在满足需求时,应优先使用这些内置角色,而非从头自定义。
七、总结:构建安全的权限地基
掌握 Kubernetes RBAC,关键在于理解并实践以下四点:
- Role/ClusterRole 定义能力:明确划定可操作资源和动作。
- Binding 决定归属:准确地将权限赋予给特定的用户、组或服务账户。
- 命名空间隔离风险:充分利用命名空间进行权限边界划分,是限制爆炸半径的有效手段。
- 慎用超级权限:能不使用
cluster-admin,就永远不要使用。
良好的 RBAC 权限配置 是 Kubernetes 集群安全的基石,从开发测试环境开始规划并严格执行,是保障生产系统稳定与数据安全不可或缺的环节。