建立 Cloud IAM 政策

本頁面說明如何在 Google Kubernetes Engine 中建立 Cloud Identity and Access Managemen (Cloud IAM) 政策以供授權。

總覽

所有的 Google Cloud Platform (GCP)、GKE 和 Kubernetes API 呼叫都要求提出要求的帳戶需具有必要權限。根據預設,除了您以外,沒有人可以存取您的專案或專案資源。您可以使用 Cloud Identity and Access Management (IAM) 角色來管理可存取您專案的對象,也可以控制對方所能執行的動作。Cloud IAM 權限會和 Kubernetes RBAC 一同運作,後者可會提供精細的存取權控制功能給叢集或命名空間中的特定物件。Cloud IAM 更注重 GCP 專案和機構層級的權限,但會提供多個 GKE 專用的預先定義角色。

如要將 GCP 專案的存取權授予使用者和服務帳戶,您可以將其新增為專案團隊成員,然後分配角色給團隊成員。角色會定義帳戶可以存取哪些 GCP 資源,以及可以執行哪些操作。

在 GKE 中,可以使用 Cloud IAM 來管理哪些使用者和服務帳戶可以存取您的叢集,並在其中執行作業。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

與 Kubernetes RBAC 的互動

Kubernetes 的原生角色型存取控管 (RBAC) 系統也可以管理您的叢集存取權。RBAC 用於控制叢集和命名空間層級的存取,而 Cloud IAM 則適用於專案層級。

Cloud IAM 與 RBAC 可以協同合作,實體必須擁有其中一個層級的完整權限才能使用您叢集中的資源。

Cloud IAM 角色

以下幾節說明 GCP 提供的 Cloud IAM 角色。

預先定義的 GKE 角色

Cloud IAM 提供預先定義的角色,這些角色會授予特定 GCP 資源的存取權,防止其他資源遭到未經授權的存取。

Cloud IAM 提供下列預先定義的 GKE 角色:

Kubernetes Engine 角色

角色 名稱 說明 權限 最低資源
roles/
container.admin
Kubernetes Engine 管理員 提供容器叢集和相關 Kubernetes API 物件的完整管理權。 container.*
resourcemanager.projects.get resourcemanager.projects.list
專案
roles/
container.clusterAdmin
Kubernetes Engine 叢集管理員 提供容器叢集的管理權。 container.clusters.create
container.clusters.delete container.clusters.get container.clusters.list container.clusters.update container.operations.* resourcemanager.projects.get resourcemanager.projects.list
專案
roles/
container.clusterViewer
Kubernetes Engine 叢集檢視器 具備 Kubernetes 叢集的唯讀存取權。 container.clusters.get
container.clusters.list resourcemanager.projects.get resourcemanager.projects.list
roles/
container.developer
Kubernetes Engine 開發人員 提供容器叢集中 Kubernetes API 物件的完整存取權。 container.apiServices.*
container.backendConfigs.* container.bindings.* container.certificateSigningRequests.create container.certificateSigningRequests.delete container.certificateSigningRequests.get container.certificateSigningRequests.list container.certificateSigningRequests.update container.certificateSigningRequests.updateStatus container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.* container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.* container.csiDrivers.* container.csiNodes.* container.customResourceDefinitions.* container.daemonSets.* container.deployments.* container.endpoints.* container.events.* container.horizontalPodAutoscalers.* container.ingresses.* container.initializerConfigurations.* container.jobs.* container.limitRanges.* container.localSubjectAccessReviews.* container.namespaces.* container.networkPolicies.* container.nodes.* container.persistentVolumeClaims.* container.persistentVolumes.* container.petSets.* container.podDisruptionBudgets.* container.podPresets.* container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.* container.pods.* container.replicaSets.* container.replicationControllers.* container.resourceQuotas.* container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.runtimeClasses.* container.scheduledJobs.* container.secrets.* container.selfSubjectAccessReviews.* container.serviceAccounts.* container.services.* container.statefulSets.* container.storageClasses.* container.subjectAccessReviews.* container.thirdPartyObjects.* container.thirdPartyResources.* container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
專案
roles/
container.hostServiceAgentUser
Kubernetes Engine 託管服務代理程式使用者 具有 Kubernetes Engine 託管服務代理程式的使用權限。 compute.firewalls.get
container.hostServiceAgent.*
roles/
container.viewer
Kubernetes Engine 檢視器 提供 GKE 資源的唯讀存取權。 container.apiServices.get
container.apiServices.list container.backendConfigs.get container.backendConfigs.list container.bindings.get container.bindings.list container.certificateSigningRequests.get container.certificateSigningRequests.list container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.get container.configMaps.list container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.get container.cronJobs.getStatus container.cronJobs.list container.csiDrivers.get container.csiDrivers.list container.csiNodes.get container.csiNodes.list container.customResourceDefinitions.get container.customResourceDefinitions.list container.daemonSets.get container.daemonSets.getStatus container.daemonSets.list container.deployments.get container.deployments.getStatus container.deployments.list container.endpoints.get container.endpoints.list container.events.get container.events.list container.horizontalPodAutoscalers.get container.horizontalPodAutoscalers.getStatus container.horizontalPodAutoscalers.list container.ingresses.get container.ingresses.getStatus container.ingresses.list container.initializerConfigurations.get container.initializerConfigurations.list container.jobs.get container.jobs.getStatus container.jobs.list container.limitRanges.get container.limitRanges.list container.namespaces.get container.namespaces.getStatus container.namespaces.list container.networkPolicies.get container.networkPolicies.list container.nodes.get container.nodes.getStatus container.nodes.list container.operations.* container.persistentVolumeClaims.get container.persistentVolumeClaims.getStatus container.persistentVolumeClaims.list container.persistentVolumes.get container.persistentVolumes.getStatus container.persistentVolumes.list container.petSets.get container.petSets.list container.podDisruptionBudgets.get container.podDisruptionBudgets.getStatus container.podDisruptionBudgets.list container.podPresets.get container.podPresets.list container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.get container.podTemplates.list container.pods.get container.pods.getStatus container.pods.list container.replicaSets.get container.replicaSets.getScale container.replicaSets.getStatus container.replicaSets.list container.replicationControllers.get container.replicationControllers.getScale container.replicationControllers.getStatus container.replicationControllers.list container.resourceQuotas.get container.resourceQuotas.getStatus container.resourceQuotas.list container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.runtimeClasses.get container.runtimeClasses.list container.scheduledJobs.get container.scheduledJobs.list container.serviceAccounts.get container.serviceAccounts.list container.services.get container.services.getStatus container.services.list container.statefulSets.get container.statefulSets.getStatus container.statefulSets.list container.storageClasses.get container.storageClasses.list container.thirdPartyObjects.get container.thirdPartyObjects.list container.thirdPartyResources.get container.thirdPartyResources.list container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
專案

如要瞭解各個 Cloud IAM 角色授予的權限,請參閱 Cloud IAM 角色授予的權限

Cloud IAM 原始角色

Cloud IAM 原始角色授予使用者所有 GCP 資源的全域、專案層級存取權。為保護您的專案和叢集安全,請盡可能使用預先定義的角色

如要進一步瞭解原始角色的更多資訊,請參閱 Cloud Identity and Access Management 說明文件中的原始角色

服務帳戶使用者角色

服務帳戶使用者會授予 GCP 使用者帳戶執行動作的權限,就如同服務帳戶執行動作。

  • 向使用者授予專案iam.serviceAccountUser 使用者角色,可讓使用者獲得授予專案中所有服務帳戶的全數角色 (包括日後建立的服務帳戶)。

  • 向使用者授予特定服務帳戶的 iam.serviceAccountUser 角色,可讓使用者獲得授予該服務帳戶的所有角色。

如要進一步瞭解 ServiceAccountUser 角色,請參閱 Cloud IAM 說明文件中的 ServiceAccountUser

以下指令顯示的是授予服務帳戶使用者角色的語法:

gcloud iam service-accounts add-iam-policy-binding \
  [SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com \
  --member=user:[USER] \
  --role=roles/iam.serviceAccountUser
roles/
iam.serviceAccountUser
服務帳戶使用者 能夠以服務帳戶執行作業。 iam.serviceAccounts.actAs
iam.serviceAccounts.get
iam.serviceAccounts.list
resourcemanager.projects.get
resourcemanager.projects.list
服務帳戶
角色 名稱 說明 權限 最低資源

託管服務代理程式使用者角色

「託管服務代理程式使用者」角色只能在共用 VPC 叢集中使用。

roles/
container.hostServiceAgentUser
Kubernetes Engine 託管服務代理程式使用者 具備 Kubernetes Engine 託管服務代理程式的存取權限。 compute.firewalls.get
container.hostServiceAgent.*
角色 名稱 說明 權限 最低資源

自訂角色

如果預先定義的角色不符合您的需求,您可以建立自訂角色並加入您定義的權限。

如要瞭解如何建立及指派自訂角色,請參閱建立及管理自訂角色

查看 Cloud Identity and Access Management 角色授予的權限

您可以使用 gcloud 指令列工具或 GCP 主控台查看各角色授予的權限。

gcloud

如要查看特定角色授予的權限,請執行下列指令。[ROLE] 是任何一個 Cloud Identity and Access Management 角色。GKE 角色的前置字串是 roles/container.

gcloud iam roles describe roles/[ROLE]

例如:

gcloud iam roles describe roles/container.admin

主控台

如要查看特定角色授予的權限,請執行下列步驟:

  1. 造訪 GCP 主控台「身分與存取權管理」(IAM) 選單中的「Roles」(角色) 區段。

    造訪身分與存取權管理選單

  2. 在「Filter table」(篩選資料表) 欄位中輸入「GKE」。

  3. 選取需要的角色。

管理 Cloud Identity and Access Management 角色

如要瞭解如何管理人類使用者的 Cloud IAM 角色和權限,請參閱 Cloud IAM 說明文件中的授予、變更及撤銷專案成員的存取權

關於「服務帳戶」,請參閱為服務帳戶授予角色

範例

以下為 Cloud Identity and Access Management 與 GKE 搭配運作的部分範例:

  • 公司來了一位新進員工。必須將這位員工加入 GCP 專案,但他只能查看專案叢集及其他 GCP 資源。專案擁有者指派了專案層級的 Compute 檢視者角色給他,這個角色提供的是唯讀存取權,可取得和列出屬於 Compute Engine 資源的節點。
  • 這位員工服務於營運部門,需要使用 gcloud 或 Google Cloud Platform 主控台更新叢集。這項操作需要 container.clusters.update 權限,所以專案擁有者指派 Kubernetes Engine 叢集管理員角色給他。該員工現在擁有 Kubernetes Engine 叢集管理員和 Compute Viewer 這兩個角色授予的權限。
  • 這位員工必須調查某項部署為何出現問題,需要執行 kubectl get pods 來查看執行於叢集中的 Pod。該員工已經具有 Compute Viewer 角色,權限不足以列出 Pod。該員工還需要擁有具備 Kubernetes Engine 檢視者角色。
  • 這位員工必須建立新的叢集。專案擁有者將 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 服務帳戶的服務帳戶使用者角色授予該員工,如此他的帳戶就能存取 Compute Engine 的預設服務帳戶了。這個服務帳戶具有編輯者角色,提供了一組豐富的權限。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件