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

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

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

  1. 角色定义权限 :将一组权限(如 get pod、create 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。 • 运维人员可以管理所有命名空间的资源。 • 审计人员仅能查看日志和事件。

相关推荐
我是koten5 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
RuoyiOffice12 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
风吹稻子13 小时前
etcd备份与恢复:删了 etcd.yaml,容器为什么还在跑?——一次 K8s 控制面死锁排查实录
kubernetes
修己xj13 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
weirong16 小时前
Operator 的测试该写到哪一层?139 个用例之后我划的三条线
kubernetes
xbzb18 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮18 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
逐流人19 小时前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
我不会起名字32220 小时前
K8s Pod 反复重启 CrashLoopBackOff:从 exit code 到根因的 5 步排查
云原生·容器·kubernetes·k8s
瑞克-桑切斯20 小时前
ERP 企业生产管理系统部署手册
运维·docker·云原生·容器·eureka