什麼是 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
實務建議
- 善用內建 ClusterRole:大部分場景用
admin、edit、view就夠了,不需要從頭定義 Role。 - 避免濫用 cluster-admin:只給真正需要的管理員帳號,日常操作使用限縮過的角色。
- 善用權限降級模式:定義一個 ClusterRole,搭配 RoleBinding 在不同命名空間復用,減少重複定義。
- 定期審查權限:用
kubectl auth can-i指令檢查使用者的實際權限,確保沒有過度授權。
小結
RBAC 是 Kubernetes 安全模型的核心。掌握 Role/ClusterRole 的差異、三種綁定組合,以及善用內建角色,就能為叢集建立合理的權限管理架構。下一篇會接著介紹如何對 ServiceAccount 進行 RBAC 綁定,以及透過 Dashboard 驗證權限。

發佈留言