關於機群 Workload Identity 聯盟

本頁說明機群 Workload Identity Federation,這是用來驗證從機群工作負載傳送至 Google Cloud API 的要求。本頁面將說明工作負載的 ID 相同性、Fleet Workload Identity 聯盟的運作方式,以及大規模管理這項功能的最佳做法。

本頁面適用於平台管理員和營運人員,以及想要更有效率地大規模管理工作負載授權的資安工程師。如要進一步瞭解說明文件中提及的使用者角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

閱讀本頁面之前,請務必熟悉下列概念:

關於 Google Cloud中的聯合工作負載身分

工作負載身分聯盟是一項 Google Cloud 功能,可讓叢集中的工作負載向 Google Cloud 進行驗證,而不需下載、手動輪替及一般管理憑證。而是改用 Google Cloud產生的短期權杖進行驗證。

Workload Identity Federation for GKE 是 Workload Identity Federation 的 GKE 專屬實作項目,可提供專案層級的 Google 管理工作負載身分集區,讓在 GKE 叢集中執行的應用程式取得身分。機群工作負載身分聯盟會將 GKE 適用的工作負載身分聯盟擴展至所有機群成員叢集,無論叢集是否位於不同專案,或位於 Google Cloud外部。啟用機群 Workload Identity 聯盟後,已註冊的叢集會在機群成員資格中啟用 Workload Identity 聯盟,並透過機群範圍的 Google 管理工作負載身分識別集區取得身分。這個共用集區可讓您設定整個機群 (包括多個專案) 的 API 和其他服務驗證。 Google Cloud

在某些叢集類型上,Connect 代理程式也可以使用機群工作負載身分聯盟,向 Google Cloud 驗證機群成員資格,而且必須使用這項功能,才能使用某些跨專案的 GKE Enterprise 功能,例如 Cloud Service Mesh。

關於 workload identity pool

工作負載身分集區是集中管理應用程式身分的實體。在叢集上啟用 GKE 的工作負載身分聯盟時,叢集專案會取得 Google 管理的工作負載身分集區,該集區具有固定的專案專屬名稱。叢集中的應用程式會從 Google 管理的 workload identity 集區取得身分,以驗證 Google Cloud API 呼叫。Google 管理的工作負載身分集區採用 PROJECT_ID.svc.id.goog 語法,其中 PROJECT_ID 是叢集專案 ID。

透過 Fleet Workload Identity Federation,機群主機專案的 Google 管理工作負載身分集區,也會成為您註冊至機群的所有叢集的工作負載身分集區,無論這些叢集是否位於其他專案或 Google Cloud外部。機群中的每個叢集都會使用 FLEET_HOST_PROJECT_ID.svc.id.goog 工作負載身分集區,其中 FLEET_HOST_PROJECT_ID 是機群主機專案的專案 ID。

如果您使用團隊範圍,可以選擇為叢集設定自行管理的 IAM 工作負載身分集區,供叢集使用,Google 管理的集區則做為備用。這個自行管理的集區可讓您更明確地控管哪些工作負載會取得特定身分。

機群中的每個應用程式都會從機群的工作負載身分集區取得專屬的聯合身分,應用程式可使用該身分向Google Cloud 和您開發的其他服務進行驗證。應用程式會取得 IAM 可辨識的主體 ID。這個 ID 使用下列語法:

PREFIX://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/WORKLOAD_IDENTITY_POOL_NAME/SELECTOR

這個語法包含下列欄位:

  • PREFIXprincipalprincipalSet,取決於您在「SELECTOR」欄位中選取的 Kubernetes 資源類型。
  • FLEET_PROJECT_NUMBER:車隊主機專案的專案編號。
  • WORKLOAD_IDENTITY_POOL_NAME:車隊的工作負載身分集區。這個值取決於您在每個叢集中設定的工作負載身分識別集區,如下所示:

    • Google 管理的工作負載身分集區FLEET_HOST_PROJECT_ID.svc.id.goog

    • 自行管理的工作負載身分集區 (搶先版): POOL_NAME.global.POOL_HOST_PROJECT_NUMBER.workload.id.goog, 其中 POOL_HOST_PROJECT_NUMBER 是您建立自行管理工作負載身分集區的專案專案編號。

  • SELECTOR:資源選取器。如需支援的選取器清單,請參閱「支援的主體 ID」一節。舉例來說, subject/ns/NAMESPACE/sa/SERVICEACCOUNT 會選取特定命名空間中的特定 Kubernetes ServiceAccount。

整個 Fleet 共用 Fleet Workload Identity 集區,因此您可以授予 Fleet 中任何位置的應用程式 (包括其他專案或雲端) 存取相同資源的權限,不必為每個叢集管理存取權。

關於身分相同性

與其他支援機群的功能一樣,機群 Workload Identity 聯盟也依賴相同性原則,也就是將不同叢集中具有相同名稱和命名空間的 Kubernetes 物件視為相同。如要進一步瞭解機群的相同性一般原則,請參閱「相同性」。

使用單一專案的 GKE 適用的工作負載身分聯盟時,身分相同性適用於該專案中所有共用主體 ID 的實體。不過,使用機群 Workload Identity Federation 時,無論叢集專案為何,只要實體共用主體 ID,這個身分相同性就會隱含套用至整個機群。

舉例來說,假設某個應用程式的後端部署在同一機群中的多個叢集。如果您將角色授予主體 ID,該 ID 會選取 backend Kubernetes 命名空間中的 default Kubernetes ServiceAccount,則該命名空間中任何使用該 ServiceAccount 的應用程式都會取得相同存取權。

如果 Fleet 只在 Fleet 主機專案中執行叢集,身分識別相同性的影響與 GKE 適用的 Workload Identity Federation 相同。不過,如果機群中的叢集在其他專案或Google Cloud以外執行,這種隱含的 ID 相同性會擴及機群中的所有已註冊叢集。

多用戶群或混合信任環境中的身分一致性

根據預設,機群會使用機群主機專案的 Google 管理工作負載身分集區,為機群中的工作負載提供身分。機群主機專案中的所有叢集 (包括未註冊至機群的獨立叢集),都會使用這個工作負載身分集區。在混合信任環境中,這些獨立叢集會執行具有不同信任模型的工作負載,而這種隱含的身分相同性可能會導致非預期的存取權。

您可以使用「團隊範圍」和「機群命名空間」,透過機群管理這個多租戶模型。團隊範圍可讓您指定部分機群資源 (例如叢集),供機構中的特定團隊使用。機群命名空間可讓您在特定團隊範圍內定義 Kubernetes 命名空間,確保特定團隊只能在團隊範圍內的命名空間中執行工作負載。詳情請參閱「機群團隊管理作業簡介」。

如果您使用團隊範圍,可以為機群中的特定叢集設定專屬的工作負載身分集區,取代 Google 管理的工作負載身分集區,藉此減輕多租戶機群中身分相同所造成的複雜性。因此,這些工作負載的主體 ID 與專案中獨立叢集的主體 ID 明顯不同。這項明確的身分相同性功能可讓管理員進一步控管身分相同性的適用範圍。

機群中的身分相同模型會根據您是否只使用 Google 管理的 Workload Identity 集區,或設定自行管理的 Workload Identity 集區,而有以下變化:

  • 隱含身分相同:機群中的所有工作負載都使用 Google 管理的工作負載身分集區。因此,凡是共用相同主體 ID 的工作負載,都會隱含共用相同存取權。
  • 明確的身分相同性 (預先發布版):您可以為 Fleet 中的團隊範圍設定自行管理的工作負載身分集區。只有在您將叢集設定為針對特定機群命名空間使用自行管理的集區時,自行管理的集區才會為工作負載提供身分。在其他 Kubernetes 命名空間和叢集中執行的工作負載無法使用自行管理的集區。

    因此,使用自行管理集區的工作負載身分識別一致性,與只能使用 Google 管理的工作負載身分識別集區的工作負載身分識別一致性不同。

適合使用自行管理的 Workload Identity 集區的時機

如果每個叢集的信任程度相似,且相同實體部署的應用程式相同,請使用 Google 管理的工作負載身分集區。舉例來說,團隊專屬的機群在每個區域都有叢集,且每個叢集都會部署複製的應用程式。

在下列情境中,建議您為機群設定自行管理的工作負載身分集區:

  • 機群中的多個信任層級:您執行的叢集具有多個信任層級。舉例來說,假設財務團隊和前端團隊在同一個機群中都有叢集。透過自行管理的 workload identity pool,您可以依機群命名空間,為每個團隊區隔存取權授權。也就是說,即使前端叢集的叢集管理員沒有明確權限,也無法在機群命名空間中取得身分。
  • 專案中的信任等級不一:機群主專案執行的獨立叢集,可能與機群叢集的信任等級不同。根據預設,這些獨立叢集會使用機群主機專案的 Google 代管工作負載身分集區。無論機群叢集專案為何,機群叢集也會使用這個工作負載身分集區。為 Fleet 設定自行管理的 Workload Identity 集區,可確保自行管理集區的存取權授權,不會意外授予獨立叢集的存取權。
  • 團隊範圍最佳做法:您已使用機群團隊管理功能,並想實作建議的最佳做法,授予工作負載存取權。設定自行管理的工作負載身分集區後,您就能在團隊範圍內,將特定 Fleet 命名空間中的工作負載存取權授予團隊,而不必將存取權授予在相同叢集中執行工作負載的其他團隊範圍。

機群 Workload Identity 聯盟的運作方式

以下各節說明機群 Workload Identity Federation 的運作方式,包括驗證憑證的流程和支援的 IAM 主體 ID。

憑證流程

如要讓特定命名空間中的應用程式使用機群 Workload Identity Federation 進行驗證,請執行下列操作:

  1. 在該命名空間中部署包含下列資訊的 ConfigMap:

    • 叢集的工作負載身分集區和身分提供者。
    • Kubernetes 將 ServiceAccount 權杖掛接至每個 Pod 的路徑。這個權杖是已簽署的 JSON Web Token (JWT)。

    這個 ConfigMap 可做為工作負載的應用程式預設憑證 (ADC) 檔案。

  2. 建立 IAM 允許政策,將叢集中主體 (例如命名空間中的 ServiceAccount) 的主體 ID 存取權授予特定Google Cloud 資源。

  3. 請確保命名空間中的工作負載在 Pod 規格中具有下列設定:

    • GOOGLE_APPLICATION_CREDENTIALS 環境變數已設為 Pod 中 ConfigMap 的掛接路徑。
    • 包含 ServiceAccount 權杖和您建立的 ConfigMap 的投影磁碟區,掛接在您於 GOOGLE_APPLICATION_CREDENTIALS 環境變數中指定的相同路徑。
    • 容器中的磁碟區掛接,會參照投影磁碟區。

當工作負載發出 Google Cloud API 呼叫時,會發生下列步驟:

  1. Google Cloud 驗證程式庫會使用應用程式預設憑證 (ADC) 尋找憑證。ADC 會檢查您在 GOOGLE_APPLICATION_CREDENTIALS 環境變數中指定的路徑,尋找驗證權杖。
  2. ADC 驗證程式庫會使用 ConfigMap 中的資料,將您掛接至 Pod 的 ServiceAccount JWT,換成來自安全權杖服務的短期聯盟存取權杖,該權杖會參照工作負載的主體 ID。
  3. ADC 會在 API 要求中加入同盟存取權杖。
  4. IAM 允許政策會授權主體 ID 對 Google Cloud 資源執行所要求的作業。

機群 Workload Identity 聯盟支援的主體 ID

下表說明您可以在 IAM 允許政策中使用的選取器,以參照車隊中的主體:

主體 ID 類型 語法
使用特定 Kubernetes ServiceAccount 的所有 Pod 依名稱選取 ServiceAccount:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

更改下列內容:

  • PROJECT_NUMBER:您的專案編號 (數字)。如要取得專案編號,請參閱「識別專案」。
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • NAMESPACE:Kubernetes 命名空間。
  • SERVICEACCOUNT:Kubernetes ServiceAccount 名稱。

Select the ServiceAccount by UID:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

更改下列內容:

  • PROJECT_NUMBER:您的專案編號 (數字)。如要取得專案編號,請參閱「識別專案」。
  • PROJECT_ID:您的 Fleet 專案 ID。
  • SERVICEACCOUNT_UID:API 伺服器中 ServiceAccount 物件的 UID。

後續步驟