當容器服務控制臺預置的ClusterRole無法滿足您的權限要求時,您可以通過自定義ClusterRole和Role實現更精細化的RBAC權限配置,使您能夠根據業務需求和安全要求靈活定制權限策略。本文將為您介紹如何自定義RBAC權限配置。
自定義RBAC權限策略說明
您可以根據以下資源的策略說明,自定義創建Role和ClusterRole的YAML清單,來實現對ACK集群資源的精細訪問控制。
Role(命名空間角色)
以下YAML示例定義了一個名為my-role
的Role,賦予其在default命名空間中對Pod資源的讀取權限。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules: # 權限規則的列表。
- apiGroups: [""] # 資源所屬的API組。
resources: ["pods"] # 定義pod資源類型。
verbs: ["get", "list"] # 定義執行的get、list權限策略。
ClusterRole(集群角色)
以下YAML示例定義了一個名為my-clusterrole
的ClusterRole,賦予其對集群中的Pods和Services資源的讀取權限。
ClusterRole是集群維度的資源,YAML中若指定命名空間參數視為無效。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules: # 權限規則的列表。
- apiGroups: [""] # 資源所屬的API組。
resources: ["pods"] # 定義pod資源類型。
verbs: ["get", "list"] # 定義執行的get、list權限策略。
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
您可以根據以下常見資源類型的策略說明,為不同資源創建自定義RBAC權限,以實現對RAM用戶或角色在集群資源上更精細的訪問控制。
常見資源類型的策略說明
讀取權限
get
:讀取指定資源的詳細信息。list
:獲取資源集合的列表。watch
:監控資源的變化,實時接收更新。
寫入權限
create
:創建新的資源實例。update
:修改已存在的資源。patch
:對已存在的資源進行部分修改。delete
:刪除指定的資源。
資源名稱 | 資源類型(resources) | 所屬API組(apiGroups) | 權限策略(verbs) |
Pods | resources: ["pods"] |
|
|
Service | resources: ["services"] | apiGroups: [""] |
|
ConfigMaps | resources: ["configmaps"] | apiGroups: [""] |
|
Secrets | resources: ["secrets"] | apiGroups: [""] |
|
PersistentVolumes | resources: ["persistentvolumes"] | apiGroups: [""] |
|
PersistentVolumeClaim | resources: ["persistentvolumeclaims"] | apiGroups: [""] |
|
NameSpaces | resources: ["namespaces"] | apiGroups: [""] |
|
Deployments | resources: ["deployments"] | apiGroups: ["apps"] |
|
DaemonSet | resources: ["daemonsets"] | apiGroups: ["apps"] |
|
StatefulSet | resources: ["statefulsets"] | apiGroups: ["apps"] |
|
Ingresses | resources: ["ingresses"] | apiGroups: ["networking.k8s.io"] |
|
Networkpolicies | resources: ["networkpolicies"] | apiGroups: ["networking.k8s.io"] |
|
Jobs | resources: ["jobs"] | apiGroups: ["batch"] |
|
CronJobs | resources: ["cronjobs"] | apiGroups: ["batch"] |
|
StorageClasses | resources: ["storageclasses"] | apiGroups: ["storage.k8s.io"] |
|
HorizontalPodAutoscalers | resources: ["horizontalpodautoscalers"] | apiGroups: ["autoscaling"] |
|
操作步驟
您可以通過控制臺或kubectl
使用自定義RBAC權限。
當前容器服務 Kubernetes 版控制臺操作方式僅支持自定義ClusterRole角色與集群內RBAC權限的綁定,如果您需要使用自定義Role角色進行權限綁定,可使用kubectl
命令完成。
控制臺
步驟一:創建自定義RBAC權限
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在角色頁面,單擊Cluster Role頁簽。然后單擊創建。
在創建YAML面板輸入自定義策略的YAML內容,單擊確定即可創建ClusterRole。
此步驟以ClusterRole(集群角色)的YAML為例,創建完成后,可在Cluster Role頁簽查看自定義權限my-clusterrole。
步驟二:使用自定義RBAC權限進行授權
登錄容器服務管理控制臺,在左側導航欄選擇授權管理。
在授權管理頁面配置管理權限。
為RAM用戶授權
單擊RAM 用戶頁簽,在RAM用戶列表中,單擊目標RAM用戶右側的管理權限,進入權限管理頁面,您也可以選擇多個目標RAM用戶進行批量授權。
為RAM角色授權
單擊RAM 角色頁簽,輸入RAM 角色名稱,然后單擊管理權限,進入權限管理頁面。
說明RAM角色支持手動輸入,也支持在下拉列表中選擇。您可以單擊RAM角色右側空白框,將會顯示已有的RAM角色列表,然后從列表中選擇已有的RAM角色進行授權。
單擊+添加權限,在添加權限框中,選擇已創建ClusterRole的集群和需要授權的命名空間,然后在權限管理中選擇自定義,接著在右邊的下拉框中,選擇my-clusterrole,然后單擊提交授權。
kubectl
步驟一:創建自定義RBAC權限
使用以下示例應用的YAML內容,創建名為my-clusterrole.yaml文件。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole namespace: default rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"]
執行以下命令,部署ClusterRole。
kubectl apply -f my-clusterrole.yaml
步驟二:獲取授權對象ID
為RAM用戶授權,需要通過RAM用戶名稱獲取UserId,詳情請參見GetUser - 查詢RAM用戶的詳細信息。
為RAM角色授權,需要通過RAM角色名稱獲取RoleId,詳情請參見GetRole - 獲取角色信息。
步驟三:使用自定義RBAC權限授權
使用以下示例應用的YAML內容,創建名為my-clusterrole-binding.yaml文件。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-clusterrole-binding subjects: - kind: User name: "20811XXXXXXXXX2288" # 步驟二中獲取授權對象的UserId或RoleId。 roleRef: kind: ClusterRole name: my-clusterrole apiGroup: rbac.authorization.k8s.io
執行以下命令,部署ClusterRoleBinding。
kubectl apply -f my-clusterrole-binding.yaml
目標RAM用戶被授予自定義RBAC權限后,通過獲取目標集群KubeConfig并通過kubectl工具連接集群,以驗證其權限。