建立 Cloud IAM 政策

本頁面說明如何在 Google Kubernetes Engine 中建立 Cloud 身分與存取權管理 (Cloud IAM) 政策或授權。

總覽

所有的 Google Cloud Platform (GCP)、GKE 和 Kubernetes API 呼叫都要求提出要求的帳戶需具有必要權限。根據預設,除了您或有資料夾和組織層級政策授予權限的其他人之外,任何人只要未經驗證與授權,就不能存取您的專案或專案資源。您可以使用 Cloud IAM 來管理誰可以存取您的專案,以及他們可以執行的動作。

如要授予使用者和服務帳戶您的 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 用於控制叢集和命名空間層級的存取,而 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.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.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.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.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
專案

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

Cloud IAM 原始角色

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

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

服務帳戶使用者角色

服務帳戶使用者授予使用者透過 GCP 服務帳戶來完成特定作業的權限。在 GKE 中,需建立或更新叢集的使用者可能需要這個角色。您可以根據實體需要的存取權層級,將「服務帳戶使用者」角色與其他角色配對。

例如,若身分是叢集管理員角色的使用者需要建立叢集,就需要存取該從集結點的服務帳戶。將該服務帳戶 Cloud IAM 政策的服務帳戶使用者角色權限授予使用者,可以確定使用者有權使用該服務帳戶:

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
服務帳戶
角色 名稱 說明 權限 最低資源

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

「代管服務代理程式使用者角色」只能在共用虛擬私人雲端叢集中使用。

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

自訂角色

如果預先定義的角色不符合需求,可以建立自訂角色,這類角色具有您所定義的權限。

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

Cloud IAM 角色授予的權限

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

gcloud

如要查看特定角色授予的權限,請執行下列指令。[ROLE] 是任何 Cloud IAM 角色。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 IAM 政策

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

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

範例

以下為 Cloud IAM 與 GKE 搭配運作的部分範例:

  • 公司來了一位新進員工。必須將這位員工加入 GCP 專案,但他只能查看專案叢集及其他 GCP 資源。專案擁有者指派了專案層級的「檢視者」角色給他,其中包含查看專案及專案資源需要的 compute.projects.get 權限。
  • 這位員工服務於營運部門,需要使用 gcloud 或 Google Cloud Platform 主控台更新叢集。這項操作需要 container.clusters.update 權限,所以專案擁有者指派「叢集管理員」角色給他。現在這位員工有「叢集管理員」和「檢視者」角色。
  • 這位員工必須調查某項部署為何出現問題,需要執行 kubectl get pods 來查看執行於叢集中的 Pod。這位員工具有「檢視者」角色,這個角色已有這項權限。
  • 這位員工必須建立新的叢集。專案擁有者將「服務帳戶使用者」角色授予這位員工,讓他的帳戶可以存取 GKE 的預設服務帳戶。

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件