設定 Workload Identity Federation 與其他身分提供者

本指南說明如何將 Workload Identity Federation 與其他身分提供者 (IdP) 搭配使用。

如要向 Google Cloud驗證身分,您可以讓工作負載使用 Workload Identity 聯盟,將環境專屬憑證換成短期憑證 Google Cloud。

在 Google Cloud 以外執行的工作負載可能可以存取現有的環境專屬憑證,例如:

  • 工作負載或許可以從識別資訊提供者 (IdP) 取得 OpenID Connect (OIDC) 聲明權杖。

  • 工作負載或許可以從識別資訊提供者 (IdP) 取得 SAML 聲明權杖。

使用 Workload Identity 聯盟可協助您減少需要輪替的憑證數量

下列各節說明如何搭配使用工作負載身分聯盟與支援 OpenID Connect (OIDC) 或 SAML 驗證通訊協定的 IdP。

準備外部 IdP

每個 IdP 只需要執行一次這些步驟。

開始之前,請確認外部 IdP 符合下列規定:

OIDC

  • IdP 支援 OpenID Connect 1.0。

  • IdP 具有核發者 URI。

  • 您可以使用下列其中一種方式,提供 IdP 的 JWK,用於驗證 OIDC 聲明權杖:

    • 以 SSL 和 TLS 保護的 OIDC 中繼資料端點。端點網址開頭必須是 https://,且端點可透過網際網路公開存取。 Google Cloud不支援以自行簽署憑證保護的端點。

      Google Cloud 會使用這些端點下載 IdP 的 JWK,並使用這個金鑰集驗證權杖。

    • 直接上傳至 Google Cloud的 OIDC JWKS 檔案。使用這個方法時,端點不必公開存取。系統不支援 JWK 內的 x5cx5t 欄位,因此上傳前必須移除。

SAML

  • IdP 支援 SAML 2.0。

  • IdP 會提供 SAML SP 中繼資料文件,說明 SAML 服務供應商設定,並包含 IdP 的簽署憑證。

    Google Cloud 會使用這項憑證驗證 SAML 宣告和回應。

  • SAML X.509 簽署金鑰規定如下:

    • 包裝在 X.509 v3 憑證中的 RSA 公開金鑰。

    • 憑證有效性規定:

      • notBefore:時間戳記,不得晚於 7 天後
      • notAfter:時間戳記,不得超過 25 年
    • 建議使用的演算法:

工作負載身分識別集區提供者一次最多可設定三個簽署金鑰。如果有多個金鑰, Google Cloud會逐一迭代,並嘗試使用每個未過期的金鑰來完成權杖交換要求。

為確保安全,我們強烈建議您不要將同一組金鑰與其他服務共用。

如果您的 IdP 符合這些條件,請按照下列步驟操作:

OIDC

設定 IdP,讓工作負載可以取得符合下列條件的 ID 權杖:

  • 符記是使用 RS256ES256 演算法簽署。
  • 權杖包含 aud 聲明,且值如下:

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID
    

    更改下列內容:

    • PROJECT_NUMBER:用於建立 workload identity pool 的 Google Cloud 專案專案編號
    • POOL_ID:您選擇的 ID,用於識別 workload identity pool。日後建立工作負載身分集區時,必須使用相同的 ID。
    • WORKLOAD_PROVIDER_ID:您選擇的 ID,用於識別 workload identity pool 提供者。稍後建立 workload identity pool 提供者時,您必須使用相同的 ID。

    或者,您可以將工作負載身分集區提供者設定為預期自訂目標對象。

  • 權杖包含未來的 exp 聲明和過去的 iat 聲明。

    exp 的值必須大於 iat 的值,且最多相差 24 小時。

一般來說,執行權杖交換時最好使用 ID 權杖,因為 ID 權杖會反映使用者身分。如果您決定改用存取權杖,請確認存取權杖符合下列額外規定:

  • 存取權杖採用 JSON Web Token 格式
  • 存取權杖包含 ISSUER 聲明,因此網址 ISSUER/.well-known/openid-configuration 會指向 IdP 的 OIDC 中繼資料端點。

  • 如要上傳本機 JWK 金鑰,請參閱「管理 OIDC JWK」。

SAML

設定 IdP,讓 SAML 聲明包含符合下列條件的元素:

  • Issuer 元素,且該元素已設為在 workload identity pool 提供者中設定的實體 ID。核發者格式必須省略或設為 urn:oasis:names:tc:SAML:2.0:nameid-format:entity
  • 具有下列屬性的 Subject 元素:
    • NameID 元素。
    • Method 設為 urn:oasis:names:tc:SAML:2.0:cm:bearerSubjectConfirmation 元素。
    • SubjectConfirmationData 元素,其中 NotOnOrAfter 設為未來的時間戳記,且沒有 NotBefore 值。
  • 含有下列項目的 Conditions 元素:

    • NotBefore 遭省略或設為過去的日期。
    • NotOnOrAfter省略或在未來。
    • 格式如下的 Audience

      https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID
      

      更改下列內容:

      • PROJECT_NUMBER:用於建立 workload identity pool 的 Google Cloud 專案專案編號
      • POOL_ID:您選擇的 ID,用於識別 workload identity pool。日後建立工作負載身分集區時,必須使用相同的 ID。
      • WORKLOAD_PROVIDER_ID:您選擇的 ID,用於識別 workload identity pool 提供者。稍後建立 Workload Identity 集區供應商時,必須使用相同的 ID。
  • 至少一個 AuthnStatement 元素。

  • 時間戳記在未來發生的 SessionNotOnOrAfter 元素。或者,也可以省略這個元素。

如要將 SAML 判斷陳述式封裝在 SAML 回應中,SAML 回應必須包含:

  • 正好一個符合 SAML 判斷準則的判斷結果,如本節稍早所述。
  • IssueInstant 屬性的值是過去不到 1 小時的時間。
  • StatusCode urn:oasis:names:tc:SAML:2.0:status:Success

SAML 聲明、回應或兩者都必須簽署。

設定 Workload Identity 聯盟

每個 IdP 只需要執行一次這些步驟。然後,您可以在多個工作負載和多個 Google Cloud 專案中使用相同的工作負載身分識別集區和提供者。

如要開始設定 Workload Identity 聯盟,請按照下列步驟操作:

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. 建議您 使用專案管理 workload identity pool 和提供者
  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.

    Enable the APIs

管理自行上傳的 OIDC JWK (選用)

本節說明如何在 workload identity pool OIDC 提供者中,管理自行上傳的 OIDC JWK。

建立供應商並上傳 OIDC JWK

如要建立 OIDC JWK,請參閱 JWT、JWS、JWE、JWK 和 JWA 實作

如要在建立工作負載身分集區提供者時上傳 OIDC JWK 檔案,請執行 gcloud iam workload-identity-pools providers create-oidc 指令,並使用 --jwk-json-path="JWK_JSON_PATH"。將 JWK_JSON_PATH 替換為 JWKs JSON 檔案的路徑。

這項作業會使用檔案中的金鑰建立上傳的金鑰。

更新 OIDC JWK

如要更新 OIDC JWK,請搭配 --jwk-json-path="JWK_JSON_PATH" 執行 gcloud iam workload-identity-pools providers update-oidc 指令。將 JWK_JSON_PATH 替換為 JWKs JSON 檔案的路徑。

這項作業會將檔案中的金鑰,取代所有現有上傳的金鑰。您無法還原已取代的金鑰。

刪除所有上傳的 OIDC JWK

如要刪除所有上傳的 OIDC JWK,並返回使用簽發者 URI 擷取金鑰,請執行 gcloud iam workload-identity-pools providers update-oidc 指令搭配 --jwk-json-path="JWK_JSON_PATH"。將 JWK_JSON_PATH 替換為空白檔案的路徑。使用 --issuer-uri 旗標設定簽發者 URI。

這項作業會刪除所有現有上傳金鑰,並改用檔案中的金鑰。刪除的金鑰無法復原。

定義屬性對應和條件

IdP 發出的 OIDC 權杖或 SAML 聲明可能包含多個屬性,您必須決定要在 Google Cloud中使用哪個屬性做為主體 ID (google.subject)。

你也可以視需要對應其他屬性。 然後在授予資源存取權時,參照這些屬性。

OIDC

屬性對應可以使用外部 IdP 發布的 ID 權杖或存取權杖中內嵌的聲明。

您必須將其中一項聲明對應至 google.subject,才能識別不重複的使用者。為防範假冒威脅,請選擇具有無法變更的專屬值的聲明。

許多 IdP 會使用不變的專屬 ID 填入 sub 聲明。對於這些 IdP,請考慮將 sub 聲明對應至 google.subject

google.subject=assertion.sub

請避免使用「email」等聲明。電子郵件地址通常可以重新指派或變更,因此無法做為使用者的永久唯一識別碼。

SAML

屬性對應可使用外部 IdP 簽發的聲明中內嵌的 <Subject><Attribute> 元素。您可以使用下列關鍵字參照 SAML 屬性:

  • assertion.subject 包含 <Subject> 元素中找到的已驗證使用者 NameID
  • assertion.attributes['ATTRIBUTE_NAME'] 包含同名 <Attribute> 的值清單。

您必須將其中一項聲明對應至 google.subject,才能識別不重複的使用者。為防範偽造威脅,請選擇具有無法變更的不重複值的聲明。

許多 IdP 會在 NameId 中填入專屬且不可變更的 ID。對於這些 IdP,請考慮將 NameId 屬性對應至 google.subject

google.subject=assertion.subject

請避免使用類似 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress 的屬性。電子郵件地址通常可以重新指派或變更,因此無法做為使用者永久的專屬識別碼。

視需要定義屬性條件。 屬性條件是 CEL 運算式,可檢查判斷結果屬性和目標屬性。如果屬性條件評估為特定憑證的 true,系統就會接受該憑證。否則系統會拒絕認證。

OIDC

您可以使用屬性條件,限制哪些使用者可透過 Workload Identity 聯盟取得短期 Google Cloud權杖。

舉例來說,下列條件會限制存取權,只允許含有自訂 service_account 聲明且值為 true 的權杖:

assertion.service_account==true

SAML

您可以使用屬性條件,限制哪些使用者可透過 Workload Identity 聯盟取得短期 Google Cloud權杖。

舉例來說,下列條件會限制存取含有自訂 https://example.com/SAML/Attributes/AllowGcpFederation 屬性且值為 true 的判斷:

assertion.attributes['https://example.com/SAML/Attributes/AllowGcpFederation'][0]=='true'

建立工作負載身分集區和提供者

必要的角色

如要取得設定 Workload Identity 聯盟所需的權限,請要求管理員授予您專案的下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

或者,IAM 擁有者 (roles/owner) 基本角色也包含設定身分識別聯盟的權限。您不應在正式版環境中授予基本角色,但可以在開發或測試環境中授予。

您已收集建立 workload identity pool 和提供者所需的所有資訊:

主控台

  1. 前往 Google Cloud 控制台的「New workload provider and pool」(新的工作負載供應商和集區) 頁面。

    前往「New workload provider and pool」(新增工作負載提供者和集區)

  2. 在「建立身分集區」下方,輸入下列資訊:

    • 名稱:集區名稱。這個名稱也會用來做為集區 ID。 集區 ID 設定後即無法變更。
    • 說明:說明集區用途的文字。
  3. 按一下「繼續」

  4. 設定提供者設定,步驟如下:

    OIDC

    • 在「選取提供者」中,選取「OpenID Connect (OIDC)」
    • 在「供應商名稱」中,輸入供應商名稱。這個名稱也會做為供應商 ID。供應商建立完成後,即無法變更供應商 ID。
    • 在「核發者網址」中,輸入 IdP 的核發者網址。網址開頭必須為 https://
    • 選用:在「JWK 檔案 (JSON)」中,選擇要上傳的 JWK 檔案。 如果未提供這個欄位,系統會嘗試從簽發者擷取 JWK。 Google Cloud
    • 允許的目標對象:ID 權杖的預期目標對象。

    SAML

    • 在「選取供應商」中,選取「SAML」
    • 在「供應商名稱」中,輸入供應商名稱。這個名稱也會做為供應商 ID。供應商建立完成後,即無法變更供應商 ID。
    • 在「IDP Metadata file (XML)」部分,上傳識別資訊提供者提供的 SAML 中繼資料 XML 文件。
  5. 按一下「繼續」

  6. 在「設定供應商屬性」下方,新增您在本指南稍早識別的屬性對應

  7. 在「屬性條件」下方,輸入您稍早在本指南中識別的屬性條件。如果沒有屬性條件,請將欄位留空。

  8. 如要建立 workload identity pool 和提供者,請按一下「儲存」

gcloud

  1. 如要建立新的工作負載身分集區,請執行下列指令:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    更改下列內容:

    • POOL_ID:集區的專屬 ID。
    • DISPLAY_NAME:集區名稱。
    • DESCRIPTION:所選集區的說明。授予集區身分的存取權時會顯示這段說明。
  2. 如要新增 workload identity pool 提供者,請按照下列步驟操作:

    OIDC

    如要新增 OIDC 工作負載身分集區提供者,請執行下列指令:

    gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --allowed-audiences="AUDIENCE" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
        --jwk-json-path="JWK_JSON_PATH"
    

    更改下列內容:

    • WORKLOAD_PROVIDER_ID:您選擇的專屬 workload identity pool 提供者 ID。
    • POOL_ID:您先前建立的工作負載身分集區 ID。
    • ISSUER:OIDC 中繼資料中定義的核發者 URI。
    • AUDIENCE:ID 權杖的預期目標對象,對許多供應商而言,這與用戶端 ID 相符。
    • MAPPINGS:以半形逗號分隔的屬性對應清單,您已在本指南稍早建立這些對應。
    • CONDITIONS:您在本指南稍早建立的屬性條件 (選用)。如果沒有屬性條件,請移除參數。
    • JWK_JSON_PATH本機上傳的 OIDC JWK 的選用路徑。如果未提供這個參數, Google Cloud 會改用 IdP 的 /.well-known/openid-configuration 路徑,從中取得含有公開金鑰的 JWK。

    SAML

    如要新增 SAML workload identity pool 提供者,請執行下列指令:

    gcloud iam workload-identity-pools providers create-saml WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --idp-metadata-path="IDP_METADATA_PATH" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    更改下列內容:

    • POOL_ID:集區的 ID
    • IDP_METADATA_PATH:SAML IdP 中繼資料文件的本機路徑
    • MAPPINGS:以半形逗號分隔的屬性對應清單,您已在本指南中建立這些對應
    • CONDITIONS:選用:您在本指南稍早建立的屬性條件

    前置字串「gcp-」為預留字串,不得用於工作團隊身分集區或工作團隊身分集區提供者 ID。

    選用:接受來自 IdP 的加密 SAML 宣告

    如要讓 SAML 2.0 IdP 產生可供工作負載身分識別聯盟接受的加密 SAML 聲明,請按照下列步驟操作:

    • 在 Workload Identity 聯盟中,請執行下列操作:
      • 為工作負載身分集區提供者建立非對稱金鑰組。
      • 下載內含公開金鑰的憑證檔案。
      • 將 SAML IdP 設為使用公開金鑰,加密發出的 SAML 聲明。
    • 在 IdP 中執行下列操作:
      • 啟用斷言加密,也稱為權杖加密。
      • 上傳您在 Workload Identity 聯盟中建立的公開金鑰。
      • 確認 IdP 會產生加密的 SAML 斷言。
    請注意,即使已設定 SAML 加密提供者金鑰,Workload Identity 聯盟仍可處理明文聲明。

    建立 Workload Identity 聯盟 SAML 聲明加密金鑰

    本節將逐步說明如何建立非對稱金鑰組,讓 Workload Identity 聯盟接受加密的 SAML 聲明。

    Google Cloud 會使用私密金鑰解密 IdP 發出的 SAML 聲明。如要建立非對稱金鑰組以用於 SAML 加密,請執行下列指令。詳情請參閱「支援的 SAML 加密演算法」。

    gcloud iam workload-identity-pools providers keys create KEY_ID \
        --workload-identity-pool WORKLOAD_POOL_ID \
        --provider WORKLOAD_PROVIDER_ID \
        --location global \
        --use encryption \
        --spec KEY_SPECIFICATION

    取代下列內容:

    • KEY_ID:您選擇的鍵名
    • WORKLOAD_POOL_ID:集區 ID
    • WORKLOAD_PROVIDER_ID:工作團隊身分集區供應商 ID
    • KEY_SPECIFICATION:金鑰規格,可以是 rsa-2048rsa-3072rsa-4096 其中之一。

    建立金鑰組後,請執行下列指令,將公開金鑰下載到憑證檔案。只有 Workload Identity 聯盟可以存取私密金鑰。

    gcloud iam workload-identity-pools providers keys describe KEY_ID \
        --workload-identity-pool WORKLOAD_POOL_ID \
        --provider WORKLOAD_PROVIDER_ID \
        --location global \
        --format "value(keyData.key)" \
        > CERTIFICATE_PATH

    取代下列內容:

    • KEY_ID:金鑰名稱
    • WORKLOAD_POOL_ID:集區 ID
    • WORKLOAD_PROVIDER_ID:工作團隊身分集區供應商 ID
    • CERTIFICATE_PATH:要寫入憑證的路徑,例如 saml-certificate.cersaml-certificate.pem

    設定符合 SAML 2.0 規範的 IdP,發布加密的 SAML 聲明

    設定 SAML IdP,使用上一個步驟下載的公開憑證,加密發出的 SAML 聲明。如需具體操作說明,請洽詢 IdP 團隊。

    將 IdP 設定為加密 SAML 判斷後,建議您檢查 IdP 產生的判斷是否確實經過加密。即使已設定 SAML 聲明加密,Workload Identity 聯盟仍可處理明文聲明。

    刪除 Workload Identity 聯盟加密金鑰

    如要刪除 SAML 加密金鑰,請執行下列指令:
      gcloud iam workload-identity-pools providers keys delete KEY_ID \
          --workload-identity-pool WORKLOAD_POOL_ID \
          --provider WORKLOAD_PROVIDER_ID \
          --location global

    取代下列內容:

    • KEY_ID:金鑰名稱
    • WORKLOAD_POOL_ID:集區 ID
    • WORKLOAD_PROVIDER_ID:工作團隊身分集區供應商 ID

    支援的 SAML 加密演算法

    Workload Identity 聯盟支援下列金鑰傳輸演算法:

    Workload Identity 聯盟支援下列區塊加密演算法:

驗證工作負載

您必須為每個工作負載執行一次這些步驟。

允許外部工作負載存取 Google Cloud 資源

如要授予工作負載資源存取權,建議您直接授予主體資源存取權。 Google Cloud 在本例中,主體是聯合使用者。部分 Google Cloud 產品有 Google Cloud API 限制。如果工作負載呼叫的 API 端點設有限制,您可以改用服務帳戶模擬功能。在本例中,主體是Google Cloud 服務帳戶,也就是身分。您授予資源的服務帳戶存取權。

直接存取資源

您可以使用 Google Cloud 控制台或 gcloud CLI,直接在資源上授予聯盟身分存取權。

控制台

如要使用 Google Cloud 控制台直接在資源上授予 IAM 角色,請前往資源頁面,然後授予角色。下列範例說明如何前往 Cloud Storage 頁面,並直接在 Cloud Storage bucket 上,將「Storage 物件檢視者」(roles/storage.objectViewer) 角色授予同盟身分。

  1. 在 Google Cloud 控制台,前往「Cloud Storage bucket」頁面。

    前往「Buckets」(值區) 頁面

  2. 在 bucket 清單中,點選要授予角色的 bucket 名稱。

  3. 選取靠近頁面上方的 [Permissions] (權限) 分頁標籤。

  4. 按一下「授予存取權」按鈕。

    系統會顯示「新增主體」對話方塊。

  5. 在「New principals」(新增主體) 欄位中,輸入需要存取值區的一或多個身分。

    依科目

    principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
    

    更改下列內容:

    • PROJECT_NUMBER:專案編號
    • POOL_ID:工作負載集區 ID
    • SUBJECT:從 IdP 對應的個別主體,例如 administrator@example.com

    依群組

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
    

    更改下列內容:

    • PROJECT_NUMBER:專案編號
    • WORKLOAD_POOL_ID:工作負載集區 ID
    • :從 IdP 對應的群組,例如: administrator-group@example.comGROUP

    依屬性

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
    

    更改下列內容:

    • PROJECT_NUMBER:專案編號
    • WORKLOAD_POOL_ID:工作負載集區 ID
    • ATTRIBUTE_NAME:從 IdP 對應的其中一個屬性
    • ATTRIBUTE_VALUE:屬性的值
  6. 從「Select a role」(請選取角色) 下拉式選單中選取一或多個角色。您選取的角色會顯示在面板中,系統還會針對這些角色所授予的權限提供簡短說明。

  7. 按一下 [儲存]

gcloud

如要使用 gcloud CLI 授予專案中資源的 IAM 角色,請執行下列操作:

  1. 取得定義資源的專案編號。

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. 授予資源存取權。

    如要使用 gcloud CLI 將 Storage 物件檢視者 (roles/storage.objectViewer) 角色授予符合特定條件的外部身分,請執行下列指令。

    依科目

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

    依群組

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

    依屬性

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

    更改下列內容:

    • BUCKET_ID:要授予存取權的值區
    • PROJECT_NUMBER:含有 workload identity pool 的專案專案編號
    • POOL_ID:工作負載身分集區的集區 ID
    • SUBJECT您已對應google.subject 的屬性預期值
    • GROUP您已對應google.groups 的屬性預期值
    • ATTRIBUTE_NAME屬性對應中的自訂屬性名稱
    • ATTRIBUTE_VALUE:屬性對應中自訂屬性的值

    您可以在任何支援 IAM 允許政策的 Google Cloud 資源上授予角色。

服務帳戶模擬

  1. 如要為外部工作負載建立服務帳戶,請按照下列步驟操作:

    1. Enable the IAM, Security Token Service, and Service Account Credentials APIs.

      Enable the APIs

    2. 建立服務帳戶,代表工作負載。建議您為每個工作負載使用專屬服務帳戶。服務帳戶不必與工作負載身分集區位於同一專案,但您必須參照包含服務帳戶的專案。

    3. 授予服務帳戶存取權,允許外部身分存取資源。

  2. 如要允許聯合身分模擬服務帳戶,請執行下列操作:

控制台

如要使用 Google Cloud 控制台,將 IAM 角色授予具有服務帳戶的同盟身分,請按照下列步驟操作:

同一專案中的服務帳戶

  1. 如要使用服務帳戶模擬功能,為同一專案中的服務帳戶授予存取權,請執行下列步驟:

    1. 前往「Workload Identity Pools」(工作負載身分集區) 頁面。

      前往「Workload Identity Pools」(工作負載身分集區)

    2. 選取「授予存取權」

    3. 在「授予服務帳戶存取權」對話方塊中,選取「透過服務帳戶模擬功能授予存取權」

    4. 在「服務帳戶」清單中,選取要讓外部身分模擬的服務帳戶,然後執行下列操作:

    5. 如要選擇集區中的哪些身分可以模擬服務帳戶,請執行下列其中一項操作:

      • 如要只允許工作負載身分識別集區的特定身分模擬服務帳戶,請選取「只顯示符合篩選條件的身分」

      • 在「屬性名稱」清單中,選取要篩選的屬性。

      • 在「屬性值」欄位中,輸入屬性的預期值;舉例來說,如果您使用屬性對應 google.subject=assertion.sub,請將「屬性」名稱設為 subject,並將「屬性值」設為外部身分識別提供者核發的權杖中 sub 聲明的值。

    6. 如要儲存設定,請依序按一下「儲存」和「關閉」

其他專案中的服務帳戶

  1. 如要使用服務帳戶模擬功能,為其他專案中的服務帳戶授予存取權,請按照下列步驟操作:

    1. 前往「Service Accounts」(服務帳戶) 頁面

      前往「Service Accounts」(服務帳戶) 頁面

    2. 選取要模擬的服務帳戶。

    3. 按一下「管理存取權」

    4. 按一下「新增主體」

    5. 在「New principal」(新增主體) 欄位中,輸入下列其中一個主體 ID,以指定集區中的身分,這些身分將模擬服務帳戶。

      依科目

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      

      更改下列內容:

      • PROJECT_NUMBER:專案編號
      • POOL_ID:工作負載集區 ID
      • SUBJECT:從 IdP 對應的個別主體,例如 administrator@example.com

      依群組

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      

      更改下列內容:

      • PROJECT_NUMBER:專案編號
      • WORKLOAD_POOL_ID:工作負載集區 ID
      • :從 IdP 對應的群組,例如: administrator-group@example.comGROUP

      依屬性

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      

      更改下列內容:

      • PROJECT_NUMBER:專案編號
      • WORKLOAD_POOL_ID:工作負載集區 ID
      • ATTRIBUTE_NAME:從 IdP 對應的其中一個屬性
      • ATTRIBUTE_VALUE:屬性的值

      依集區

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

      更改下列內容:

      • PROJECT_NUMBER:專案編號
      • WORKLOAD_POOL_ID:工作負載集區 ID
    6. 在「Select a role」(選取角色) 欄位,選取 Workload Identity User 角色 (roles/iam.workloadIdentityUser)。

    7. 如要儲存設定,請按一下「儲存」

gcloud

如要將 Workload Identity 使用者角色 (roles/iam.workloadIdentityUser) 授予已同盟主體或主體集,請執行下列指令。如要進一步瞭解 Workload Identity 聯盟主體 ID,請參閱「主體類型」。

依科目

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

依群組

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

依屬性

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

更改下列內容:

  • SERVICE_ACCOUNT_EMAIL: 服務帳戶的電子郵件地址
  • PROJECT_NUMBER:含有 workload identity pool 的專案專案編號
  • POOL_ID:工作負載身分集區的集區 ID
  • SUBJECT您已對應google.subject 的屬性預期值
  • GROUP您已對應google.groups 的屬性預期值
  • ATTRIBUTE_NAME屬性對應中的自訂屬性名稱
  • ATTRIBUTE_VALUE:屬性對應中自訂屬性的值

下載憑證設定

本節說明如何使用Google Cloud 控制台下載憑證設定。

如要讓工作負載存取用戶端程式庫,請先下載並設定應用程式預設憑證 (ADC),方法如下:

  1. 前往 Google Cloud 控制台的「Workload Identity Pools」(工作負載身分集區) 頁面。

    前往「Workload Identity Pools」(工作負載身分集區)
  2. 在表格中選取集區,前往集區的詳細資料頁面。

  3. 按一下「授予存取權」

  4. 選取「使用聯合身分授予存取權 (建議)」

  5. 如要下載應用程式預設憑證 (ADC),讓工作負載存取用戶端程式庫,請按照下列步驟操作:

    1. 按一下「下載設定」

    2. 在「設定應用程式」對話方塊中,執行下列操作:

      1. 在「提供者」下拉式清單中,選取您的提供者。

      2. 在「OIDC token path」(OIDC 權杖路徑) 或「SAML assertion path」(SAML 聲明路徑) 中,輸入權杖或聲明所在的路徑。

      3. 在「格式類型」下拉式清單中,選取格式。

    3. 按一下「下載設定」,並記下儲存檔案的路徑。

建立憑證設定

Cloud 用戶端程式庫、gcloud CLI 和 Terraform 可自動取得外部憑證,並使用這些憑證存取 Google Cloud。如要讓程式庫和工具完成這項程序,您必須提供憑證設定檔。這個檔案定義了下列項目:

  • 如何取得外部憑證
  • 要使用的 workload identity pool 和提供者
  • 要模擬哪個服務帳戶 (如果您使用服務帳戶模擬功能)

Cloud 用戶端程式庫會透過執行本機可執行檔,從本機檔案或 HTTP 網址取得外部憑證:

  • 可執行檔來源憑證:程式庫會在需要新憑證時啟動可執行檔。如果可執行檔成功取得新的外部憑證,就必須將類似下列內容的 JSON 文件寫入 STDOUT

    OIDC

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:id_token",
      "id_token": "HEADER.PAYLOAD.SIGNATURE",
      "expiration_time": 1620499962
    }
    

    如果可執行檔無法取得新憑證,就必須將類似下方的 JSON 文件寫入 STDOUT

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    

    JSON 文件使用下列欄位:

    • version:JSON 輸出內容的版本。 系統僅支援版本 1。
    • success:回應的狀態。

      如果 true,回應必須包含 id_tokentoken_type 欄位。 可執行檔必須以結束代碼 0 結束。

      如果 false,回應必須包含 codemessage 欄位,並以非零值結束。

    • token_type:外部憑證的權杖類型。支援的值包括

      • urn:ietf:params:oauth:token-type:id_token
      • urn:ietf:params:oauth:token-type:jwt
    • id_token:外部憑證。

    • expiration_time:OIDC 權杖的到期時間,以秒為單位 (Unix Epoch 時間)。只有在憑證設定中指定輸出檔案時,才需要填寫這個欄位。

    • code:錯誤代碼字串。

    • message:錯誤訊息。

    SAML

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:saml2",
      "saml_response": "...",
      "expiration_time": 1620499962
    }
    

    如果可執行檔無法取得新憑證,就必須將類似下方的 JSON 文件寫入 STDOUT

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    

    JSON 文件使用下列欄位:

    • version:JSON 輸出內容的版本。 系統僅支援版本 1。
    • success:回應的狀態。

      如果 true,回應必須包含 id_tokentoken_type 欄位。 可執行檔必須以結束代碼 0 結束。

      如果 false,回應必須包含 codemessage 欄位,並以非零值結束。

    • token_type:外部憑證的權杖類型。必須為 urn:ietf:params:oauth:token-type:saml2

    • saml_response:SAML 回應或採用 base64 編碼的 SAML 判斷。

    • expiration_time:斷言到期時間,以秒為單位 (Unix Epoch 紀元時間)。只有在憑證設定中指定輸出檔案時,才需要填寫這個欄位。

    • code:錯誤代碼字串。

    • message:錯誤訊息。

    啟動可執行檔時,用戶端程式庫會設定下列環境變數:

    • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: 憑證設定中的目標對象。一律會顯示。
    • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: 預期的主體權杖類型。一律會顯示。
    • GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: 服務帳戶電子郵件地址。只有在使用服務帳戶模擬時才會顯示。
    • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: 憑證設定的輸出檔案位置。只有在憑證設定中指定時才會顯示。

    如要使用可執行檔來源的憑證,請將環境變數 GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES 設為 1

  • 檔案來源憑證:程式庫會從本機純文字或 JSON 檔案讀取外部憑證。例如:

    JSON

    {
      "mytoken": "ey...
    }
    

    文字

    ey...
    

    外部憑證可以是:

    • OIDC 權杖
    • SAML 回應
    • Base64 編碼的 SAML 判斷

    您必須定期更新檔案,確保檔案一律包含有效的憑證。舉例來說,如果 OIDC 權杖或 SAML 聲明的效期為一小時,您至少每小時都必須重新整理檔案一次。

  • 從網址取得的憑證:程式庫需要新憑證時,會向 HTTP 端點發出 GET 要求。端點必須傳回純文字或 JSON 回應,格式與檔案來源憑證使用的格式相同。

如要建立憑證設定檔,請按照下列步驟操作:

可執行檔來源憑證

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --output-file=FILEPATH.json \
    --executable-command=EXECUTABLE_COMMAND \
    --executable-timeout-millis=EXECUTABLE_TIMEOUT \
    --executable-output-file=EXECUTABLE_OUTPUT_FILE

更改下列內容:

  • PROJECT_NUMBER:包含 workload identity pool 的專案專案編號。
  • POOL_ID:工作負載身分集區的 ID。
  • WORKLOAD_PROVIDER_ID:工作負載身分集區提供者的 ID。
  • SERVICE_ACCOUNT_EMAIL:如果您使用服務帳戶模擬功能,請改用服務帳戶的電子郵件地址。如果您未使用服務帳戶模擬功能,請省略這個旗標。
  • SERVICE_ACCOUNT_TOKEN_LIFETIME:如果您使用服務帳戶模擬,請以服務帳戶存取權杖的生命週期 (以秒為單位) 取代;如果未提供,預設為一小時。如果您未使用服務帳戶模擬功能,請省略這個旗標。如要指定超過一小時的生命週期,請設定constraints/iam.allowServiceAccountCredentialLifetimeExtension 機構政策限制
  • FILEPATH:要儲存設定的檔案。
  • EXECUTABLE_COMMAND:完整指令,包括要執行的引數,用於擷取 OIDC ID 權杖,例如 --executable-command="/path/to/command --foo=bar"
  • EXECUTABLE_TIMEOUT:等待可執行檔執行的選用時間 (以毫秒為單位),預設為 30 秒。
  • EXECUTABLE_OUTPUT_FILE:指向可執行檔產生的第三方憑證路徑。這對快取憑證很有幫助。指定這個路徑後,Auth 程式庫會先檢查路徑是否存在,再執行可執行檔。

檔案來源憑證

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --output-file=FILEPATH.json \
    --credential-source-file=TOKEN_FILEPATH \
    --credential-source-type=SOURCE_TYPE \
    --credential-source-field-name=FIELD_NAME

更改下列內容:

  • PROJECT_NUMBER:包含 workload identity pool 的專案專案編號。
  • POOL_ID:工作負載身分集區的 ID。
  • WORKLOAD_PROVIDER_ID:工作負載身分集區提供者的 ID。
  • SERVICE_ACCOUNT_EMAIL:如果您使用服務帳戶模擬功能,請改用服務帳戶的電子郵件地址。如果您未使用服務帳戶模擬功能,請省略這個旗標。
  • SERVICE_ACCOUNT_TOKEN_LIFETIME:如果您使用服務帳戶模擬,請以服務帳戶存取權杖的生命週期 (以秒為單位) 取代;如果未提供,預設為一小時。如果您未使用服務帳戶模擬功能,請省略這個旗標。如要指定超過一小時的生命週期,請設定constraints/iam.allowServiceAccountCredentialLifetimeExtension 機構政策限制
  • FILEPATH:用於儲存設定的檔案。
  • TOKEN_FILEPATH:儲存 OIDC ID 權杖的路徑。
  • SOURCE_TYPE:OIDC ID 權杖檔案的格式,可設為 text (預設) 或 json
  • FIELD_NAME:文字檔中包含權杖的欄位 (如果 SOURCE_TYPEjson)。

網址來源憑證

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --output-file=FILEPATH.json \
    --credential-source-url="TOKEN_URL" \
    --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
    --credential-source-type=SOURCE_TYPE \
    --credential-source-field-name=FIELD_NAME

更改下列內容:

  • PROJECT_NUMBER:含有 workload identity pool 的專案專案編號。
  • POOL_ID:工作負載身分集區的 ID。
  • WORKLOAD_PROVIDER_ID:工作負載身分集區提供者的 ID
  • SERVICE_ACCOUNT_EMAIL:如果您使用服務帳戶模擬功能,請將此值替換為服務帳戶的郵件地址。如果您未使用服務帳戶模擬功能,請省略這個旗標。
  • SERVICE_ACCOUNT_TOKEN_LIFETIME:如果您使用服務帳戶模擬,請以服務帳戶存取權杖的生命週期 (以秒為單位) 取代;如果未提供,預設為一小時。如果您未使用服務帳戶模擬功能,請省略這個旗標。如要指定超過一小時的生命週期,請設定constraints/iam.allowServiceAccountCredentialLifetimeExtension 機構政策限制
  • FILEPATH:要儲存設定的檔案。
  • TOKEN_URL:用於擷取 OIDC ID 權杖的網址
  • KEY_nVALUE_n:要納入對 TOKEN_URL 的 HTTP 要求中的自訂標頭
  • SOURCE_TYPE:OIDC ID 權杖檔案的格式,請設為 text (預設) 或 json
  • FIELD_NAME:文字檔中包含權杖的欄位 (如果 SOURCE_TYPEjson)

使用憑證設定存取 Google Cloud

如要讓工具和用戶端程式庫使用憑證設定,請執行下列操作:

  1. 初始化環境變數 GOOGLE_APPLICATION_CREDENTIALS,並指向憑證設定檔:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    其中 FILEPATH 是憑證設定檔的相對路徑。

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    其中 FILEPATH 是憑證設定檔的相對路徑。
  2. 使用支援 Workload Identity 聯盟且可自動尋找憑證的用戶端程式庫或工具:

    C++

    v2.6.0 版起,Google Cloud C++ 用戶端程式庫支援 Workload Identity Federation。如要使用 Workload Identity 聯盟,您必須使用 1.36.0 以上版本的 gRPC 建構用戶端程式庫。

    Go

    如果 Go 的用戶端程式庫使用 golang.org/x/oauth2 模組的 v0.0.0-20210218202405-ba52d332ba99 以上版本,即可支援 Workload Identity Federation。

    如要查看用戶端程式庫使用的這個模組版本,請執行下列指令:

    cd $GOPATH/src/cloud.google.com/go
    go list -m golang.org/x/oauth2
    

    Java

    如果 Java 適用的用戶端程式庫使用 com.google.auth:google-auth-library-oauth2-http構件 0.24.0 以上版本,即可支援 Workload Identity 聯盟。

    如要查看用戶端程式庫使用的構件版本,請在應用程式目錄中執行下列 Maven 指令:

    mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
    

    Node.js

    如果 Node.js 適用的用戶端程式庫使用 google-auth-library 套件 7.0.2 以上版本,即可支援 Workload Identity Federation。

    如要查看用戶端程式庫使用的套件版本,請在應用程式目錄中執行下列指令:

    npm list google-auth-library
    

    建立 GoogleAuth 物件時,您可以指定專案 ID,也可以允許 GoogleAuth 自動尋找專案 ID。如要自動找出專案 ID,設定檔中的服務帳戶必須在專案中具備「瀏覽器」角色 (roles/browser),或是其他具備同等權限的角色。詳情請參閱 google-auth-library 套件的README

    Python

    如果 Python 適用的用戶端程式庫使用 google-auth 套件 1.27.0 以上版本,即可支援 Workload Identity Federation。

    如要查看用戶端程式庫使用的套件版本,請在安裝套件的環境中執行下列指令:

    pip show google-auth
    

    如要為驗證用戶端指定專案 ID,可以設定 GOOGLE_CLOUD_PROJECT 環境變數,也可以允許用戶端自動尋找專案 ID。如要自動尋找專案 ID,設定檔中的服務帳戶必須在專案中具備「瀏覽器」角色 (roles/browser),或具備同等權限的角色。詳情請參閱google-auth 套件的使用者指南

    gcloud

    如要使用 Workload Identity 聯盟進行驗證,請使用 gcloud auth login 指令:

    gcloud auth login --cred-file=FILEPATH.json
    

    FILEPATH 替換為憑證設定檔的路徑。

    gcloud CLI 363.0.0 以上版本支援 gcloud CLI 中的 Workload Identity Federation。

    Terraform

    如果您使用 3.61.0 以上版本,Google Cloud 供應商支援工作負載身分聯盟:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    bq

    如要使用 Workload Identity 聯盟進行驗證,請使用 gcloud auth login 指令,如下所示:

    gcloud auth login --cred-file=FILEPATH.json
    

    FILEPATH 替換為憑證設定檔的路徑。

    如要在 bq 中使用 Workload Identity Federation,請使用 gcloud CLI 390.0.0 以上版本

後續步驟