← 返回上一頁
Kubernetes

Kubernetes RBAC 授權全解析:Role、ClusterRole 與綁定實戰教學

本頁目錄

什麼是 RBAC?

RBAC(Role-Based Access Control,基於角色的存取控制)是 Kubernetes 中最主要的授權機制。它的核心思想是:權限綁定在角色上,角色再綁定到使用者。這樣就不用為每個使用者分別管理權限,只需要管理好角色的定義就好。

使用 kubeadm 安裝的叢集預設就啟用了 RBAC,可以在 API Server 的啟動參數中確認:

--authorization-mode=Node,RBAC

RBAC 的四種資源物件

資源 作用域 說明
Role 命名空間級別 定義某個命名空間內的權限
ClusterRole 叢集級別 定義叢集範圍的權限(包含非命名空間資源如 Node、PV)
RoleBinding 命名空間級別 將 Role 或 ClusterRole 綁定到主體
ClusterRoleBinding 叢集級別 將 ClusterRole 綁定到主體,授予叢集級別權限

主體(Subject)可以是三種類型:User、Group、ServiceAccount。

綁定的三種組合模式

理解這三種組合方式是掌握 RBAC 的關鍵:

組合 效果
Subject → RoleBinding → Role 取得特定命名空間的 Role 權限
Subject → ClusterRoleBinding → ClusterRole 取得叢集級別的 ClusterRole 權限
Subject → RoleBinding → ClusterRole 權限降級:只取得該 RoleBinding 所在命名空間的 ClusterRole 權限

第三種組合特別實用——你可以定義一個通用的 ClusterRole,然後透過 RoleBinding 在不同命名空間中重複使用,避免每個命名空間都要建立相同的 Role。

rules 規則的參數說明

  • apiGroups:API 群組列表(空字串 "" 代表核心群組)
  • resources:資源類型(如 pods、deployments、services)
  • resourceNames:限制到特定名稱的資源
  • verbs:允許的操作(get、list、watch、create、update、patch、delete)

實戰範例一:建立 Role 和 RoleBinding

建立一個只允許在 default 命名空間中讀取 Pod 和 Service 的角色,並綁定給使用者 tom:

# Role 定義
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pods-reader
rules:
- apiGroups: [""]
  resources: ["pods", "services", "pods/log"]
  verbs: ["get", "list", "watch"]

---
# RoleBinding 定義
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tom-pods-reader
  namespace: default
subjects:
- kind: User
  name: tom
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pods-reader
  apiGroup: rbac.authorization.k8s.io

驗證結果:

# tom 可以查看 pod 和 svc
$ kubectl get pod --kubeconfig=/tmp/mykubeconfig     # 成功
$ kubectl get svc --kubeconfig=/tmp/mykubeconfig      # 成功

# 但不能查看 deployment 或 node
$ kubectl get deployment --kubeconfig=/tmp/mykubeconfig  # Forbidden
$ kubectl get nodes --kubeconfig=/tmp/mykubeconfig       # Forbidden

內建的管理員角色

Kubernetes 預設提供了幾個常用的 ClusterRole:

ClusterRole 作用域 權限範圍
admin 命名空間級別 所有命名空間資源的完整操作權限
cluster-admin 叢集級別 所有資源的完整操作權限(超級管理員)
edit 命名空間級別 讀寫大部分資源,但不能管理角色和綁定
view 命名空間級別 唯讀權限

實戰範例二:綁定 admin ClusterRole

# 綁定 ClusterRole admin 給 tom(叢集範圍)
$ kubectl create clusterrolebinding tom-admin \
    --user=tom --clusterrole=admin

# tom 現在可以存取所有命名空間的資源
$ kubectl get pod -n kube-system --kubeconfig=/tmp/mykubeconfig  # 成功

# 但 Node、PV 等叢集級別資源仍無權限
$ kubectl get node --kubeconfig=/tmp/mykubeconfig  # Forbidden

實戰範例三:綁定 cluster-admin 取得超級管理員權限

$ kubectl create clusterrolebinding tom-cluster-admin \
    --user=tom --clusterrole=cluster-admin

# 現在 tom 擁有叢集所有權限
$ kubectl get node --kubeconfig=/tmp/mykubeconfig  # 成功
$ kubectl get pv --kubeconfig=/tmp/mykubeconfig    # 成功

安全提醒:cluster-admin 是透過 system:masters 群組授權的。如果在建立使用者證書時指定了 /O=system:masters,該使用者就會自動擁有超級管理員權限,請特別注意。

實戰範例四:權限降級 — RoleBinding 綁定 ClusterRole

這是一個很好的設計模式:用 RoleBinding 去綁定 ClusterRole,讓使用者只在指定的命名空間擁有該 ClusterRole 的權限:

# 讓 tom 只在 dev 命名空間有 admin 權限
$ kubectl create rolebinding tom-admin \
    --user=tom -n dev --clusterrole=admin

# tom 可以存取 dev 命名空間
$ kubectl get pod -n dev --kubeconfig=/tmp/mykubeconfig   # 成功

# 但不能存取其他命名空間
$ kubectl get pod -n default --kubeconfig=/tmp/mykubeconfig  # Forbidden

實務建議

  1. 善用內建 ClusterRole:大部分場景用 admin、edit、view 就夠了,不需要從頭定義 Role。
  2. 避免濫用 cluster-admin:只給真正需要的管理員帳號,日常操作使用限縮過的角色。
  3. 善用權限降級模式:定義一個 ClusterRole,搭配 RoleBinding 在不同命名空間復用,減少重複定義。
  4. 定期審查權限:用 kubectl auth can-i 指令檢查使用者的實際權限,確保沒有過度授權。

小結

RBAC 是 Kubernetes 安全模型的核心。掌握 Role/ClusterRole 的差異、三種綁定組合,以及善用內建角色,就能為叢集建立合理的權限管理架構。下一篇會接著介紹如何對 ServiceAccount 進行 RBAC 綁定,以及透過 Dashboard 驗證權限。

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料。