当前位置: 首页 > news >正文

第十一篇:细粒度权限控制(RBAC)

 

官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

RBAC授权模式

RBAC(Role-Based Access Control):基于角色的访问控制机制,它通过为特定资源定义操作权限,并将这些权限绑定到用户、组或服务账户,来精细化管理集群资源的访问授权

  • 角色为中心:权限封装在 角色 中,绑定给 主体。
  • 精细授权:权限可细化到资源、API组、操作和名称空间。
  • 最小权限原则:默认无权限,必须显式授予所需的最小权限。
  • 动态更新:授权规则可动态更新,无需重启组件。
  • 资源可审计:所有授权配置都是API对象,易于查看和管理

RBAC API类型

image

 

 

在 RBAC 中,角色权限只能添加权限,无法定义“拒绝”规则

在 RBAC API 中,一个角色包含一组相关权限的规则。角色可以用 Role 来定义到某个命名空间(namespace)上, 或者用 ClusterRole 来定义到整个集群作用域(所有namespace)。

一个 Role 只可以用来对某一命名空间中的资源赋予访问权限。

k8s-RBAC-verbs操作类型

操作类型API 对应操作描述示例命令
get GET 获取单个资源的详细信息 kubectl get pod nginx-1 -o yaml
watch WATCH 监听资源的变化(实时更新) kubectl get pods -w
list LIST 列出命名空间内的所有资源 kubectl get pods
create CREATE 创建新资源 kubectl create -f pod.yaml
update PUT 更新整个资源 kubectl replace -f pod.yaml
patch PATCH 部分更新资源 kubectl patch pod nginx --type='merge' -p='{"spec": {"containers": [...]}}'
delete DELETE 删除单个资源 kubectl delete pod nginx
deletecollection DELETE 批量删除多个资源 kubectl delete pods --all
***** 所有操作 对该资源拥有所有权限 授予完全控制权

常用权限组合:

  • 只读权限:["get", "list", "watch"]
  • 读写权限:["get", "list", "watch", "create", "update", "patch", "delete"]
  • 完全控制:["*"] 或 ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"]

 

 

# 启动基于角色访问控制(RBAC)的 API Server 的授权配置
[root@k8s-master01 ~]# grep -e "--authorization" /usr/lib/systemd/system/kube-apiserver.service --authorization-mode=Node,RBAC  \

 

kubectl get roles,rolebindings -n <namespace># 查看所有角色(Role)和集群角色(ClusterRole)
kubectl get roles,clusterroles --all-namespaces# 查看所有角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)
kubectl get rolebindings,clusterrolebindings --all-namespaces

 

Role示例

命令空间资源:pod,doployment,service

kubectl api-resources --namespaced=true

[root@k8s-master01 rbac]# kubectl create namespace kube-rbac

[root@k8s-master01 rbac]# cat pod-reader.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: kube-rbacname: pod-reader
rules:
- apiGroups: [""]  # 指定要授权的API组(一般指定一个空字符串)resources: ["pods"]  # 指定要授权的资源类型verbs: ["get", "watch", "list"]  # 允许的操作类型

 

ClusterRole示例

ClusterRole 能够授权的三种特殊权限类型

集群范围资源:全局唯一,不属于任何命名空间的资源(Node、pv、storageclass)

非资源端点:不是kubernetes API对象的HTTP端点

curl -k https://api-server:6443/healthz
curl -k https://api-server:6443/livez
curl -k https://api-server:6443/readyz

跨命令空间访问:虽然是命名空间资源,但是可以访问所有命名空间

[root@k8s-master01 rbac]# cat ops-engineer.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: ops-engineer
rules:
# 1. 集群范围资源
- apiGroups: [""]resources: ["nodes", "persistentvolumes"]verbs: ["get", "list", "watch"]# 2. 跨命名空间访问
- apiGroups: [""]resources: ["pods", "services", "events"]verbs: ["get", "list", "watch"]# 3. 非资源端点(监控用)
- nonResourceURLs: ["/healthz", "/metrics"]verbs: ["get"]
[root@k8s-master01 rbac]# kubectl get clusterroles |grep ops-engineer
ops-engineer                                         2025-12-08T03:30:13Z

 

 

RoleBinding

[root@k8s-master01 rbac]# cat read-pods-rolebinding.yaml 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-pods-rolebindingnamespace: kube-rbac
subjects:  # 配置绑定对象,可以配置多个
- kind: User  # 绑定对象的类别(User、Group、Service Account)name: jiang  # 绑定对象的名字apiGroup: rbac.authorization.k8s.io
roleRef:  # 绑定的类别kind: Role  # kind:指定权限来源(Role或ClusterRole)name: pod-reader  # name:Role或ClusterRole的名字apiGroup: rbac.authorization.k8s.io  # API组名
kubectl auth can-i create pods --namespace kube-rbac --as jiangkubectl auth can-i:RBAC权限检查命令
create pods:要检查的 操作 + 资源
--as jiang:模拟用户身份

 

[root@k8s-master01 rbac]# kubectl get rolebinding  -n kube-rbac
NAME                    ROLE              AGE
read-pods-rolebinding   Role/pod-reader   12m[root@k8s-master01 rbac]# kubectl describe rolebinding read-pods-rolebinding -n kube-rbac
Name:         read-pods-rolebinding
Labels:       <none>
Annotations:  <none>
Role:Kind:  RoleName:  pod-reader
Subjects:Kind  Name  Namespace----  ----  ---------User  jiang

 

常见的几种Role书写

# 允许读取在核心 API 组下的 "pods"
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]# 允许读取名称为 "my-config" 的 ConfigMap
rules:
- apiGroups: [""]resources: ["configmaps"]  # 资源类型resourceNames: ["my-config"]  # 资源名称verbs: ["get"]

 

对主体的引用

RoleBinding 或者 ClusterRoleBinding 可绑定角色到某主体(Subject) 上, 主体可以是组,用户或者服务账户

# 对于名称为 alice@example.com 的用户
subjects:
- kind: Username: "alice@example.com"apiGroup: rbac.authorization.k8s.io# 对于名称为 frontend-admins 的用户组
subjects:
- kind: Groupname: "frontend-admins"apiGroup: rbac.authorization.k8s.io# 对于某个名称空间中的某个服务账户
subjects:
- kind: ServiceAccountname: <服务账户名称>namespace: <命名空间名称># 对于某个名称空间中的所有服务账户
subjects:
- kind: Groupname: system:serviceaccounts:<名称空间的名称>apiGroup: rbac.authorization.k8s.io

 

Kubernetes默认ClusterRole权限

默认 ClusterRole默认绑定描述
cluster-admin system:masters 组 - ClusterRoleBinding:完全控制集群和所有命名空间
- RoleBinding:完全控制所在命名空间(包括命名空间本身)
admin - RoleBinding:命名空间内大多数资源的读写权限
- 可创建角色和角色绑定
- 不可操作:资源配额、命名空间本身、v1.22+ 的 EndpointSlices
edit - RoleBinding:命名空间内大多数对象的读写权限
- 可访问 Secret、以任何 ServiceAccount 运行 Pod
- 不可操作:角色/角色绑定、v1.22+ 的 EndpointSlices
view - RoleBinding:命名空间内大多数对象的只读权限
- 不可查看:角色/角色绑定、Secret(防止特权提升)

命令行工具

https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/#command-line-utilities

# 创建Role对象/ClusterRole对象
kubectl create role 对象名 --verb=get --verb=list --verb=watch --resource=pods  \
--resource-name=resourceNames kubectl create clusterrole 对象名 --verb=get,list,watch --resource=pods \
--resource-name=resourceNames

# 创建rolebinding/clusterrolebinding
kubectl create rolebinding rolebinding名 --clusterrole=admin --user=bob --namespace=acme
kubectl create clusterrolebinding rolebinding名 --clusterrole=cluster-admin --user=root

 

kubectl auth can-i create pods --namespace kube-rbac --as jiangkubectl auth can-i:RBAC权限检查命令
create pods:要检查的 操作 + 资源
--as jiang:模拟用户身份

 

聚合ClusterRole

聚合ClusterRole是Kubernetes中的一种特殊ClusterRole,它可以通过标签选择器(labelSelector)自动聚合其他ClusterRole的规则,实现权限规则的动态组合和复用。

[root@k8s-master01 ~]# kubectl create -f monitoring.yaml ^C
[root@k8s-master01 ~]# kubectl get clusterrole monitoring
NAME         CREATED AT
monitoring   2025-12-08T09:45:52Z
[root@k8s-master01 ~]# kubectl get clusterrole monitoring -oyaml |grep rules
rules: null

[root@k8s-master01 ~]# kubectl create -f monitoring-endpoints.yaml

[root@k8s-master01 ~]# kubectl get clusterrole monitoring -oyaml |grep -A 5

 

如何进行授权

image

image

RBAC企业实战:不同用户不同权限

用户yuan可以查看default、kube-system命名空间下的Pod的日志

用户jiang可以查看default命名空间下的Pod中执行的命令,并且可以删除Pod

 

http://www.rkmt.cn/news/77763.html

相关文章:

  • 2025年权威盘点:十大优质机床钣金外壳生产商,评价高的机床钣金外壳口碑推荐榜睿意达发展迅速,实力雄厚
  • A*
  • AlexNet论文阅读笔记
  • 2025压铸油温机制造厂TOP5权威推荐:技术参数与性能评测
  • 2025年实验室反应釜厂家TOP5推荐,实验室反应釜认证厂家
  • 2025年知名电缆生产厂家推荐:十大知名品牌实力解析及选购指南名单(12月新版)
  • 2025年中国工业节能设备五大生产厂家推荐:河南丰华实力凸显
  • 2025年重庆电力总包资质代办和转让服务哪家强?五大权威机构
  • 2025年12月考公考编机构信赖之选:考公考编/培训机构/单位/辅导单位/线上单位/机构/学校/课程,北京国培众信领跑,这些机构用实力助你上岸
  • 2025家用座椅电梯品牌TOP5权威测评:附无障碍座椅电梯价
  • 2025天津电缆品牌榜:消防/耐火/防火/阻燃B1级/矿物质防火等电缆优质厂家全解析
  • AWS Reliability Security Benchmark:哪家海外云服务器最稳最安全?
  • 2025年PLC控制柜品牌实力榜:十大厂家深度解析,水处理变频控制柜/室外电气控制柜/自动化变频控制柜/电气自动控制柜PLC控制柜厂家排行榜
  • 17.基础语法-图片和音频存储原理
  • 2025年中国五大卡压式碳钢消防管知名厂家推荐:看哪家实力强
  • 数据采集与融合技术第四次作业
  • 2025泡沫轻质混凝土厂家TOP5权威推荐:甄选优质厂商,助
  • R 语言通俗详解:小白也能懂的 “数据处理 可视化神器”如何安装
  • AWS Reliability Cost Optimization:企业如何兼顾稳定性与预算?
  • 2025年农药生产厂家TOP10品牌,专业防治死苗烂根、土传病害
  • 2025年浙江泡沫轻质混凝土企业推荐:泡沫轻质混凝土加工厂哪
  • 2025 湛江企业购买商标平台必看指南!从效率到安全的平台横向对比
  • AWS Quick Start 上云指南:哪家海外云服务器最适合初学者?
  • ImageMagick支持webp格式
  • 江门购买商标平台防坑指南:2025 靠谱平台怎么选?认准这 6 个平台
  • 2025年湖南厂房火灾原因鉴定公司权威推荐:光伏火灾原因鉴定/火灾第三方鉴定/冷库火灾原因鉴定服务商精选
  • 深入浅出红黑树:C++ 完整实现与核心原理剖析 - 实践
  • 2025.12.8总结,mongodb的启动
  • 降ai率免费网站:提升内容原创性的实用工具
  • 线下活动速递丨AI 原生应用开源开发者沙龙杭州站