Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的訪問控制)是一種用于管理用戶和服務賬戶對集群資源訪問權限的機制。RBAC 允許管理員通過定義角色(Role)和角色綁定(RoleBinding)來精確控制誰可以在哪些資源上執行哪些操作。
RBAC 的核心概念
-
Role:
-
定義了一組權限,指定了可以對哪些資源執行哪些操作。
-
Role 是命名空間(Namespace)級別的,即它只適用于特定的命名空間。
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:namespace: defaultname: pod-reader rules: - apiGroups: [""] # "" 表示核心 API 組resources: ["pods"]verbs: ["get", "watch", "list"]
這個 Role 允許用戶在
default
命名空間中獲取、查看和列出 Pod。
-
-
ClusterRole:
-
類似于 Role,但它是集群級別的,適用于整個集群,而不僅僅是某個命名空間。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: cluster-admin rules: - apiGroups: [""]resources: ["*"]verbs: ["*"]
這個 ClusterRole 允許用戶對所有資源執行所有操作。
-
-
RoleBinding:
-
將 Role 或 ClusterRole 綁定到用戶、組或服務賬戶(ServiceAccount)。
-
RoleBinding 是命名空間級別的,即它只適用于特定的命名空間。
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:name: read-podsnamespace: default subjects: - kind: Username: aliceapiGroup: rbac.authorization.k8s.io roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
這個 RoleBinding 將
pod-reader
Role 綁定到用戶alice
,允許她在default
命名空間中讀取 Pod。
-
-
ClusterRoleBinding:
-
類似于 RoleBinding,但它是集群級別的,適用于整個集群。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: cluster-admin-binding subjects: - kind: Username: adminapiGroup: rbac.authorization.k8s.io roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io
這個 ClusterRoleBinding 將
cluster-admin
ClusterRole 綁定到用戶admin
,允許她對整個集群中的所有資源執行所有操作。
-
RBAC 的常見操作
-
創建 Role 和 RoleBinding:
-
使用
kubectl create role
和kubectl create rolebinding
命令可以快速創建 Role 和 RoleBinding。kubectl create role pod-reader --verb=get,list,watch --resource=pods kubectl create rolebinding read-pods --role=pod-reader --user=alice
-
-
查看 Role 和 RoleBinding:
-
使用
kubectl get role
和kubectl get rolebinding
命令可以查看現有的 Role 和 RoleBinding。kubectl get role -n default kubectl get rolebinding -n default
-
-
刪除 Role 和 RoleBinding:
-
使用
kubectl delete role
和kubectl delete rolebinding
命令可以刪除 Role 和 RoleBinding。kubectl delete role pod-reader -n default kubectl delete rolebinding read-pods -n default
-
RBAC 的最佳實踐
- 最小權限原則:
- 只授予用戶或服務賬戶完成其任務所需的最小權限。
- 避免使用過于寬泛的權限,如
cluster-admin
,除非確實需要。
- 使用命名空間隔離:
- 將不同的應用或團隊分配到不同的命名空間,并使用 Role 和 RoleBinding 來控制權限。
- 定期審計權限:
- 定期檢查 Role 和 RoleBinding,確保沒有不必要的權限被授予。
- 使用 ServiceAccount:
- 為每個應用或服務創建專用的 ServiceAccount,并為其分配適當的權限,而不是使用默認的 ServiceAccount。
總結
RBAC 是 Kubernetes 中管理訪問控制的重要機制,通過定義 Role、ClusterRole、RoleBinding 和 ClusterRoleBinding,管理員可以精確控制用戶和服務賬戶對集群資源的訪問權限。遵循最小權限原則和最佳實踐,可以有效地提高集群的安全性。