為 Compute Engine 設定受管理的工作負載身分驗證

本文說明如何使用 gcloud CLI,為 Compute Engine 設定代管工作負載身分。本文也說明如何使用憑證授權單位服務,為 Compute Engine 設定受管理工作負載身分自動佈建和生命週期管理,以便在工作負載之間建立相互傳輸層安全標準 (mTLS) 連線。

如要申請 Compute Engine 受管理的工作負載身分存取權,請填寫存取權申請表單

事前準備

  1. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  2. 申請 Compute Engine 受管理工作負載身分預先發布版的存取權

  3. 瞭解受管理的工作負載身分

  4. 瞭解如何使用憑證授權單位服務核發憑證。

  5. 瞭解如何使用受管理的工作負載身分驗證 Compute Engine 工作負載

  6. 啟用 IAM 和憑證授權單位服務 API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable iam.googleapis.com privateca.googleapis.com

  7. 將 Google Cloud CLI 設為使用已加入帳單和配額許可清單的專案。

    gcloud config set billing/quota_project PROJECT_ID
    

    PROJECT_ID 替換為已加入受管理工作負載身分預先發布版許可清單的專案 ID。

必要的角色

如要取得建立受管理 Workload Identity,以及佈建受管理 Workload Identity 憑證所需的權限,請要求系統管理員在專案中授予您下列 IAM 角色:

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

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

或者,IAM Owner (roles/owner) 基本角色也包含設定受管理工作負載身分的權限。 您不應在正式環境中授予基本角色,但可以在開發或測試環境中授予。

總覽

如要為應用程式使用受管理的工作負載身分,請執行下列工作:

  1. 安全管理員

  2. 運算管理員

    為在 Compute Engine 中執行的工作負載啟用代管工作負載身分:

建立 workload identity pool

  1. 如要設定受管理的工作負載身分,請在 TRUST_DOMAIN 模式下建立集區。

    gcloud iam workload-identity-pools create POOL_ID \
      --location="global" \
      --mode="TRUST_DOMAIN"
    

    POOL_ID 替換為集區的專屬 ID。ID 長度必須介於 4 至 32 個字元之間,只能包含小寫英數字元和破折號,且開頭和結尾須為英數字元。建立 Workload Identity 集區後,就無法變更其 ID。

  2. 如要確認工作負載身分集區是否以 TRUST_DOMAIN 模式建立,請執行 workload-identity-pools describe 指令。

    gcloud iam workload-identity-pools describe POOL_ID \
      --location="global"
    

    輸出結果會與下列內容相似:

    mode: TRUST_DOMAIN
    name: projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID
    state: ACTIVE
    

    如果指令輸出內容中沒有 mode: TRUST_DOMAIN,請確認專案已加入受管理工作負載身分搶先體驗計畫的許可清單,且您已正確設定 gcloud CLI,以便使用正確的專案進行帳單和配額作業。確認您已更新至最新版本的 gcloud CLI。

選擇 CA 選項

如要簽署工作負載憑證,請選擇最符合您用途的憑證授權單位 (CA) 選項:

  • Google 代管的預設 CA:使用這個選項可獲得全代管的免費解決方案。預設 CA 會為所有Google Cloud 使用者提供共用的信任根。

  • 自訂 CA:選取這個選項,透過憑證授權單位服務設定自己的公用金鑰基礎架構 (PKI)。如果您需要自訂信任根,或必須將簽署金鑰儲存在硬體安全模組 (HSM) 中,以符合法規遵循規定,則適合使用這個選項。憑證授權單位服務的費用與代管工作負載身分分開計算。 詳情請參閱「CA 服務定價」。

設定 CA

預設 CA

如要將預設 CA 繫結至工作負載身分集區,請使用 use-default-shared-ca 旗標更新工作負載身分集區。

gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
    --location="global" \
    --use-default-shared-ca \
    --project=PROJECT_ID

更改下列內容:

  • TRUST_DOMAIN_NAME:信任網域的名稱。
  • PROJECT_ID:專案 ID。

自訂 CA

如要使用自訂 CA 設定受管理的工作負載身分,請完成下列步驟:

  1. 設定 CA 服務,為代管工作負載身分核發憑證
  2. 將 CA 繫結至 workload identity pool
  3. 授權受管理的工作負載身分,向 CA 集區要求憑證

設定 CA 服務,為受管理的工作負載身分核發憑證

使用憑證授權單位服務集區,為根憑證授權單位和從屬憑證授權單位 (CA) 建立建議的設定。從屬 CA 集區會將 X.509 工作負載身分憑證核發給 VM。

設定為使用受管理工作負載身分識別,為 Compute Engine VM 核發憑證的 CA 集區,必須與 VM 位於相同區域。如要設計多區域架構,以因應區域性服務中斷,建議您為每個工作負載區域設定從屬的憑證授權單位服務 CA 集區。這樣一來,每個 Compute Engine VM 都能參照區域內的下層憑證授權單位服務 CA 集區。

設定 CA 集區後,您就可以授權受管理的工作負載身分,向 CA 集區要求及接收已簽署的憑證。

設定根 CA 集區

使用 Google Cloud CLI 介面,透過憑證授權單位服務設定根 CA 集區。

CA 集區建立後就無法移動或匯出。

  1. Enterprise 級別中執行 gcloud privateca pools create 指令,建立根 CA 集區。Enterprise 方案適用於長期核發少量憑證。

    gcloud privateca pools create ROOT_CA_POOL_ID \
       --location=REGION \
       --tier=enterprise
    

    更改下列內容:

    • ROOT_CA_POOL_ID:根 CA 集區的專屬 ID。ID 最多可有 64 個字元,且只能包含大小寫英數字元、底線或連字號。集區 ID 在區域內不得重複。
    • REGION:根 CA 集區所在的區域。

    詳情請參閱建立憑證授權單位集區

  2. 在根 CA 集區中執行 gcloud privateca roots create 指令,建立根 CA。 如果這是根 CA 集區中唯一的 CA,系統可能會提示您啟用根 CA

    舉例來說,您可以使用類似下列的指令建立根 CA。

    gcloud privateca roots create ROOT_CA_ID \
       --pool=ROOT_CA_POOL_ID \
       --subject "CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \
       --key-algorithm="ec-p256-sha256" \
       --max-chain-length=1 \
       --location=REGION
    

    更改下列內容:

    • ROOT_CA_ID:根 CA 的專屬名稱。CA 名稱最多可有 64 個字元,且只能包含大小寫英數字元、底線或連字號。CA 名稱在區域內不得重複。
    • ROOT_CA_POOL_ID:根 CA 集區的 ID。
    • ROOT_CA_CN:根 CA 的一般名稱。
    • ROOT_CA_ORGANIZATION:根 CA 的機構。
    • REGION:根 CA 集區所在的區域。

    詳情請參閱「建立根憑證授權單位」。如要進一步瞭解 CA 的 subject 欄位,請參閱「主體」。

  3. 選用:重複上述步驟,在根 CA 集區中建立其他根 CA。這對根 CA 輪替很有幫助。

設定下層 CA

使用 Google Cloud CLI 介面,透過憑證授權單位服務建立下層 CA 集區和下層 CA。

如果您有多個憑證核發情境,可以為每個情境建立從屬 CA。此外,在 CA 集區中新增多個從屬 CA,有助於更妥善地平衡分配憑證要求負載。

使用 gcloud privateca pools create 指令建立下層 CA 集區。

  1. DevOps 層級中建立從屬 CA 集區。這個層級適用於大量核發短期憑證。

    gcloud privateca pools create SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --tier=devops
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的專屬 ID。ID 長度上限為 64 個字元,且只能包含大小寫英數字元、底線或連字號。集區 ID 在區域內不得重複。
    • REGION:要建立從屬 CA 集區的區域。

    詳情請參閱建立憑證授權單位集區

  2. 在從屬 CA 集區中執行 gcloud privateca subordinates create 指令,建立從屬 CA。 請勿變更預設的以設定為準的核發模式

    舉例來說,您可以使用類似下列的指令建立下層 CA。

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
      --pool=SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --issuer-pool=ROOT_CA_POOL_ID \
      --issuer-location=REGION \
      --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \
      --key-algorithm="ec-p256-sha256" \
      --use-preset-profile=subordinate_mtls_pathlen_0
    

    更改下列內容:

    • SUBORDINATE_CA_ID:從屬 CA 的專屬名稱。 名稱長度上限為 64 個字元,且只能包含大小寫英數字元、底線或連字號。CA 名稱在區域內不得重複。
    • SUBORDINATE_CA_POOL_ID:從屬 CA 集區的名稱。
    • REGION:從屬 CA 集區所在的區域。
    • ROOT_CA_POOL_ID:根 CA 集區的 ID。
    • REGION:根 CA 集區的區域。
    • SUBORDINATE_CA_CN:從屬 CA 的一般名稱。
    • SUBORDINATE_CA_ORGANIZATION:簽發機構的下層 CA 名稱。

    詳情請參閱建立憑證授權單位集區。 如要進一步瞭解 CA 的 subject 欄位,請參閱「主體」。

將 CA 繫結至 workload identity pool

建立 CA 層級後,請更新集區,並加入每個 CA 的憑證核發設定,將 CA 繫結至 workload identity pool。

  1. 建立 issuance-config.yaml 檔案,並加入以下內容:

    inlineCertificateIssuanceConfig:
    caPools:
    REGION: projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID
    keyAlgorithm: RSA_2048
    lifetime: 86400s
    rotationWindowPercentage: 50

    在檔案中取代下列項目:

    • REGION:從屬 CA 集區所在的區域。
    • PROJECT_ID:包含下層 CA 集區的專案 ID。
    • SUBORDINATE_CA_POOL_ID:從屬 CA 集區的 ID。
  2. 執行下列指令來更新 workload identity pool:

    gcloud iam workload-identity-pools update POOL_ID \
       --location="global" \
       --inline-certificate-issuance-config-file=ISSUANCE_CONFIG_FILE
    

    更改下列內容:

    • POOL_ID:集區的專屬 ID。
    • ISSUANCE_CONFIG_FILEissuance-config.yaml 檔案的路徑。

授權受管理的工作負載身分,從 CA 集區要求憑證

代管工作負載身分需要權限,才能向 CA 服務要求憑證並取得公開憑證。

  1. 對每個下層 CA 集區,將 CA 服務工作負載憑證要求者 (roles/privateca.workloadCertificateRequester) IAM 角色授予受管理的工作負載身分。下列gcloud privateca pools add-iam-policy-binding指令會授權代管工作負載身分,從 CA 服務憑證鏈要求憑證。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --role=roles/privateca.workloadCertificateRequester \
      --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*"
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的 ID。
    • REGION:下層 CA 集區的區域。
    • PROJECT_NUMBER:包含 Workload Identity Pool 的專案編號。
    • POOL_ID:Workload Identity Pool 的 ID。
  2. 將下層 CA 集區的「CA 服務集區讀取者 (roles/privateca.poolReader)」 IAM 角色授予受管理的工作負載身分。這項授權可讓代管工作負載身分從 CA 的憑證鏈結取得已簽署的 X.509 憑證。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --role=roles/privateca.poolReader \
      --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*"
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的 ID。
    • REGION:下層 CA 集區的區域。
    • PROJECT_NUMBER:包含 Workload Identity Pool 的專案編號。
    • POOL_ID:Workload Identity Pool 的 ID。

建立受管理的工作負載身分

如果採用受管理的工作負載身分,系統就能自動將 workload identity pool 身分的憑證佈建至工作負載。 Google Cloud 工作負載身分是在 workload identity pool 中定義,並整理到稱為「命名空間」的管理邊界。

建立命名空間

您可以使用 workload-identity-pools namespaces create 指令在 workload identity pool 中建立命名空間。

gcloud iam workload-identity-pools namespaces create NAMESPACE_ID \
    --workload-identity-pool="POOL_ID" \
    --location="global"

更改下列內容:

  • NAMESPACE_ID:命名空間的專屬 ID。ID 長度必須介於 2 至 63 個字元之間,只能包含小寫英數字元和破折號,且開頭和結尾須為英數字元。命名空間建立完成後,就無法變更 ID。
  • POOL_ID:您先前建立的 Workload Identity Pool ID。

建立受管理的工作負載身分

您可以使用 workload-identity-pools managed-identities create 指令,在 workload identity pool 命名空間中建立受管理的工作負載身分。

gcloud iam workload-identity-pools managed-identities create MANAGED_IDENTITY_ID \
    --namespace="NAMESPACE_ID" \
    --workload-identity-pool="POOL_ID" \
    --location="global"

更改下列內容:

  • MANAGED_IDENTITY_ID:受管理身分識別的專屬 ID。ID 長度必須介於 2 至 63 個字元之間,只能使用小寫英數字元和破折號,且開頭和結尾須為英數字元。代管 Workload Identity 建立後,就無法變更其 ID。
  • NAMESPACE_ID:您先前建立的命名空間 ID。
  • POOL_ID:您先前建立的 Workload Identity Pool ID。

受管理的工作負載身分 ID 是 SPIFFE ID,格式如下:

spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID

定義工作負載驗證政策

本節說明如何設定驗證政策。這項政策會決定 Google Cloud IAM 用於驗證工作負載身分的屬性。驗證完成後,呼叫工作負載即可取得憑證。

驗證依據是工作負載的下列其中一個屬性:

  • VM 執行個體 ID
  • 附加服務帳戶電子郵件地址
  • 已連結的服務帳戶 UID

定義含有驗證規則的工作負載驗證政策

如要建立驗證政策,允許工作負載使用受管理的身分,請按照下列步驟操作:

  1. 決定是否要建立驗證政策,讓工作負載使用附加的服務帳戶或執行個體 ID,驗證代管身分。

  2. 建立 JSON 格式的驗證政策檔案。

    1. 選用:如要在 Compute Engine 執行個體上接收 X.509 憑證,必須啟用附加的服務帳戶。建議您先使用下列指令建立新的服務帳戶,然後將該帳戶附加至工作負載:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      SERVICE_ACCOUNT_NAME 替換為服務帳戶名稱

    2. 建立 JSON 格式的驗證政策檔案,根據服務帳戶電子郵件地址、服務帳戶 UID 或執行個體 ID 進行驗證。

      服務帳戶電子郵件地址

      如要建立根據服務帳戶電子郵件地址進行驗證的驗證政策檔案,請建立含有下列內容的檔案:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.email/SERVICE_ACCOUNT_EMAIL"
            }
         ],
      }
      

      更改下列內容:

      • WORKLOAD_PROJECT_NUMBER:包含 VM 執行個體或服務帳戶的專案編號

      如要取得包含受管理身分或您剛建立的服務帳戶的專案編號,請執行下列指令:

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • SERVICE_ACCOUNT_EMAIL:附加至 VM 的服務帳戶電子郵件地址

      服務帳戶 UID

      如要建立認證政策檔案,根據服務帳戶 UID 進行認證,請建立含有下列內容的檔案:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID"
            }
         ],
      }
      

      更改下列內容:

      • WORKLOAD_PROJECT_NUMBER:包含 VM 執行個體或服務帳戶的專案編號

      如要取得包含受管理身分或您剛建立服務帳戶的專案編號,請執行下列指令:

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • SERVICE_ACCOUNT_UID:連結至 VM 的服務帳戶 UID

      如要取得服務帳戶的專屬 ID,請執行下列指令:

         gcloud iam service-accounts describe SERVICE_ACCOUNT_EMAIL\
            --format="value(uniqueId)"
      

      執行個體 ID

      如要建立認證政策檔案,根據執行個體 ID 進行認證,請建立含有下列內容的檔案:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/uid/zones/ZONE/instances/INSTANCE_ID"
            }
         ],
      }
      

      更改下列內容:

      • WORKLOAD_PROJECT_NUMBER:包含 VM 執行個體或服務帳戶的專案編號

      如要取得包含受管理身分或您剛建立的服務帳戶的專案編號,請執行下列指令:

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • INSTANCE_ID:Compute Engine VM 執行個體 ID

      執行個體 ID 的值必須來自現有的 Compute Engine 執行個體。如要取得執行個體 ID,請執行下列指令:

      gcloud compute instances describe INSTANCE_NAME --zone=ZONE --format="get(id)"
      
      • INSTANCE_NAME:Compute Engine VM 執行個體名稱
      • ZONE:Compute Engine VM 區域
  3. 使用您在本文件稍早建立的政策 JSON 檔案,建立驗證政策:

    gcloud iam workload-identity-pools managed-identities set-attestation-rules MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --policy-file=PATH_TO_POLICY_JSON_FILE \
       --location=global
    

    更改下列內容:

    • MANAGED_IDENTITY_ID:受管理身分識別的專屬 ID。ID 長度必須介於 2 至 63 個字元之間,只能使用小寫英數字元和破折號,且開頭和結尾須為英數字元。代管 Workload Identity 建立後,就無法變更其 ID。
    • NAMESPACE_ID:您先前建立的命名空間 ID。
    • POOL_ID:您先前建立的 Workload Identity Pool ID。
    • PATH_TO_POLICY_JSON_FILE:代表您先前建立的驗證政策的 JSON 檔案路徑。

    您也可以個別新增或移除認證規則,藉此更新政策。如要將驗證新增至驗證政策,請執行下列指令:

    gcloud iam workload-identity-pools managed-identities add-attestation-rule MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --google-cloud-resource='//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID' \
       --location=global
    
  4. 如要瞭解如何列出或移除認證規則,請執行下列指令:

    gcloud iam workload-identity-pools managed-identities list-attestation-rules --help
    gcloud iam workload-identity-pools managed-identities remove-attestation-rule --help
    

選用:啟用 Workload Identity 集區之間的信任聯盟

如要為不同信任網域中的工作負載啟用相互驗證,可以設定信任聯盟。

  1. 建立 trust-config.yaml 檔案,並加入以下內容:

    inlineTrustConfig:
    additionalTrustBundles:
      POOL_ID.global.PROJECT_NUMBER.workload.id.goog:
         trustAnchors:
         - pemCertificate: "-----BEGIN CERTIFICATE-----\nPEM_ENCODED_CERTIFICATE\n-----END CERTIFICATE-----"

    在檔案中取代下列項目:

    • POOL_ID:要與其同盟的 Workload Identity Pool ID。
    • PROJECT_NUMBER:您要同盟的 Workload Identity Pool 專案編號。
    • PEM_ENCODED_CERTIFICATE:您要同盟的 Workload Identity Pool 的 PEM 編碼根 CA 憑證。
  2. 如要使用信任設定更新 Workload Identity 集區,請執行下列指令:

    gcloud iam workload-identity-pools update POOL_ID \
      --location="global" \
      --inline-trust-config-file=TRUST_CONFIG_FILE
    

    更改下列內容:

    • POOL_ID:集區的專屬 ID。
    • TRUST_CONFIG_FILEtrust-config.yaml 檔案的路徑。

後續步驟

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶來評估我們的產品在實際工作環境中的成效。新客戶也能獲得價值 $300 美元的免費抵免額,可用於處理、測試及部署工作負載。

免費試用