使用 RBAC 進行身份驗證和授權
基於角色的存取控制的設定
基於角色的存取控制(RBAC,Role-Based Access Control)是 Kubernetes 提供的一種存取控制機制,用於管理和控制對 Kubernetes 資源的存取。RBAC 允許你為用戶、群組或服務帳戶分配特定角色,從而限制它們在 Cluster 中可以執行的操作。這一天的課程將深入探討如何設定 RBAC 來進行身份驗證和授權,確保 Kubernetes Cluster 的安全性。
RBAC 的基本概念
Role(角色):
- 角色定義了用戶或服務帳戶可以對 Kubernetes 資源執行的操作。這些操作包括 CRUD(創建、讀取、更新、刪除)操作。
- 角色可以在命名空間範圍內生效(Role),也可以在整個 Cluster 範圍內生效(ClusterRole)。
RoleBinding(角色綁定):
- 角色綁定將一個角色(Role 或 ClusterRole)與用戶、組或服務帳戶綁定,從而授予它們特定的權限。
- 角色綁定可以在命名空間內生效(RoleBinding),或在整個 Cluster 範圍內生效(ClusterRoleBinding)。
Subject(主體):
- 主體是指將要授予權限的實體,可以是用戶(User)、群組(Group)或服務帳戶(ServiceAccount)。
RBAC 的流程示意圖
Kubernetes 的 RBAC (Role-Based Access Control) 涉及四個核心組件:Role、ClusterRole、RoleBinding、和 ClusterRoleBinding。這四個組件之間的關係決定了如何在特定範圍內(如 Namespace)或全域範圍內分配資源存取權限。流程圖示意圖如下:
+--------------------------------------------------+
| Resources/Verbs (e.g., Pod, get,list, create) |
+--------------------------------------------------+
| |
| |
v v
+------------------+ +--------------------+
| Role | | ClusterRole |
| (Namespace Scope)| | (Cluster Scope) |
+------------------+ +--------------------+
| |
| |
v v
+------------------+ +--------------------+
| RoleBinding | | ClusterRoleBinding|
| (Namespace Scope)| | (Cluster Scope) |
+------------------+ +--------------------+
| |
| |
v v
+-------------------------------------------------+
| Subjects (User, Group, Service Account) |
+-------------------------------------------------+
說明
Role (Namespace Scope):
Role是在特定 Namespace 中的權限集合。它定義了哪些資源(如 Pods)可以被操作,以及具體哪些操作(如get、list)被允許。
ClusterRole (Cluster Scope):
ClusterRole是全域範圍內的權限集合,它可以用於所有 Namespace,或者針對全Cluster範圍的資源進行定義。
RoleBinding (Namespace Scope):
RoleBinding將Role綁定到具體的主體(如使用者、群組或服務帳戶)中,使這些主體在指定的 Namespace 中擁有相應的權限。
ClusterRoleBinding (Cluster Scope):
ClusterRoleBinding將ClusterRole綁定到全Cluster的主體上,使這些主體在全 Cluster 範圍內擁有指定的權限。
Subjects (User, Group, Service Account):
- 這些主體可以是具體的使用者、使用者群組或 Kubernetes 中的服務帳戶。透過
RoleBinding或ClusterRoleBinding,他們被賦予了對特定資源進行操作的權限。
- 這些主體可以是具體的使用者、使用者群組或 Kubernetes 中的服務帳戶。透過
流程解析
Role和ClusterRole定義了權限的範圍(Namespace 限定或全 Cluster)。RoleBinding和ClusterRoleBinding則將這些權限分配給特定的主體。- 最終,這些主體就可以在指定範圍內對 Kubernetes 資源進行操作。
我們展示了 Kubernetes RBAC 的核心概念,並強調了權限如何被具體分配和應用。這種方式可以靈活地控制誰能對 Kubernetes 資源執行什麼操作,從而提高 Cluster 的安全性。
RBAC 的設定步驟
接下來就帶著大家按部就班的進行演練。
1. 創建一個命名空間角色(Role)
以下是一個簡單的 YAML 範例,該角色允許在 default 命名空間中讀取 Pod 資源:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
apiGroups: [""]表示資源來自核心 API 組。resources: ["pods"]定義了這個角色管理的資源類型為 Pods。verbs: ["get", "list", "watch"]指定了允許的操作。
2. 創建一個角色綁定(RoleBinding)
將上述角色綁定到特定的服務帳戶,使其能夠在 default 命名空間中執行 Pod 的讀取操作:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: pod-reader-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
subjects定義了要授權的主體,這裡是pod-reader-sa服務帳戶。roleRef將這個角色綁定到之前定義的pod-reader角色。
3. 創建一個 Cluster 角色(ClusterRole)
Cluster 角色用於定義跨命名空間的全域權限。例如,以下範例允許讀取 Cluster 中所有命名空間的 Pod 資源:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
4. 創建Cluster角色綁定(ClusterRoleBinding)
將 Cluster 角色綁定到一個具體的用戶,使其擁有全域讀取 Pod 的權限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-all-pods
subjects:
- kind: User
name: jane-doe
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-pod-reader
apiGroup: rbac.authorization.k8s.io
RBAC 的最佳實踐
最小權限原則:
- 授權時,僅為用戶或服務帳戶分配其執行任務所需的最小權限,避免授予過多的權限。
命名空間隔離:
- 使用命名空間來隔離不同應用或團隊,並通過角色和角色綁定限制它們的存取範圍。
定期稽核和更新:
- 定期審查 RBAC 設定,確保角色和權限設置仍然符合當前的安全需求。隨著業務需求的變化,及時更新角色和角色綁定。
監控和記錄:
- 啟用和監控 Kubernetes API Server 的稽核紀錄,這有助於檢測潛在的安全威脅或未經授權的存取嘗試。
總結
RBAC 是 Kubernetes 中控制 Cluster 和資源存取的重要機制。通過正確地設定角色和角色綁定,你可以有效地管理用戶和應用程式的存取權限,從而提高整個 Cluster 的安全性和合規性。在接下來的課程中,我們將探討 Operators 及其在應用程式自動化管理中的作用,這是進一步提升 Kubernetes 運維效率的關鍵。
