RBAC的工作原理,以及如何限制特定用户访问

RBAC(Role-Based Access Control)工作原理

RBAC 是基于角色的访问控制模型,通过 角色(Role)权限(Permission) 的抽象层实现细粒度权限管理。其核心思想是:

  1. 角色定义权限 :将一组权限(如 get podcreate deployment)打包成一个角色。

  2. 用户绑定角色:将用户或用户组与角色关联,间接获得角色对应的权限。

  3. 动态验证:当用户发起请求时,系统自动检查其绑定的角色是否包含所需操作的权限。

Kubernetes 中的核心资源
资源类型 描述
Role 定义命名空间内的权限(非集群级)
ClusterRole 定义集群级权限(所有命名空间有效)
RoleBinding Role 绑定到用户/用户组(命名空间内)
ClusterRoleBinding ClusterRole 绑定到用户/用户组(集群级)

如何限制用户只能查看特定命名空间的 Pod?

步骤 1:创建 Role(定义权限)
复制代码
# 创建名为 "pod-reader" 的 Role,允许在 `default` 命名空间内查看 Pod
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]  # 只允许查看,不允许创建/删除
步骤 2:创建 RoleBinding(绑定用户)
复制代码
# 将用户 "alice" 绑定到 "pod-reader" 角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: alice-pod-reader
subjects:
- kind: User
  name: alice
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
步骤 3:应用配置
复制代码
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml

验证权限

  1. 检查用户权限

    复制代码
    kubectl auth can-i get pods --namespace=default  # 应返回 "yes"
    kubectl auth can-i create pods --namespace=default  # 应返回 "no"
  2. 尝试访问其他命名空间

    复制代码
    kubectl auth can-i get pods --namespace=another-ns  # 默认返回 "no"(除非显式授权)

进阶控制(可选)

1. 限制多个命名空间
复制代码
# 创建跨多个命名空间的 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: multi-namespace-pod-reader
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
  namespaces: ["default", "test"]  # 仅允许访问指定命名空间
2. 结合 Group 管理批量用户
复制代码
# 将用户组绑定到 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-team-pod-reader
subjects:
- kind: Group
  name: developers
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

关键原理总结

  1. 最小权限原则 :仅授予必要的操作权限(如 get vs *)。

  2. 作用域隔离 :通过 namespace 字段限制资源范围(Role)或使用 ClusterRole 实现全局权限。

  3. 动态策略:权限生效无需重启服务,实时更新。

通过 RBAC,可以灵活实现类似以下场景的权限控制: • 开发人员只能访问自己项目的 Pod。 • 运维人员可以管理所有命名空间的资源。 • 审计人员仅能查看日志和事件。

相关推荐
QuiteCoder2 小时前
【Linux】软硬连接与动静态库
linux·运维·服务器
꧁༺朝花夕逝༻꧂2 小时前
Linux基础--用户管理
linux·运维
木二2 小时前
附035.Kubernetes_v1.25.3高可用部署架构二
云原生·kubernetes
Narutolxy3 小时前
Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析20250309
运维·ubuntu·docker
明明跟你说过3 小时前
在【k8s】中部署Jenkins的实践指南
运维·ci/cd·云原生·容器·kubernetes·jenkins
酥暮沐3 小时前
K8S 集群搭建——cri-dockerd版
linux·容器·kubernetes
a_j583 小时前
k8s面试题总结(十)
云原生·容器·kubernetes
一条闲鱼_mytube4 小时前
[Kubernetes] 7控制平面组件
java·平面·kubernetes
琪琪花4 小时前
sshfs 将远程服务器上的文件系统挂载到本地目录
linux·运维·服务器