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
ClusterRole
与 Role
类似,但用于定义集群级别的权限规则。它不仅可以作用于集群资源(如 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 策略可以有效提升集群安全性,避免权限滥用或误操作带来的风险。