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

如要瞭解如何存取 Compute Engine 的受管理工作負載身分,請參閱存取權要求頁面

本頁說明如何使用 gcloud CLI,為 Compute Engine 設定受管理的工作負載身分

本頁面也說明如何為 Compute Engine 設定受管理的工作負載身分自動佈建和生命週期管理。您可以使用憑證授權單位服務,設定憑證授權單位 (CA) 集區來核發憑證。憑證授權單位服務是一項可用性高且可擴充的 Cloud de Confiance by S3NS 服務,可簡化及自動化憑證授權單位服務的部署、管理和安全防護作業。您可以建立虛擬機器執行個體 (VM),並從已設定的 CA 集區佈建 X.509 憑證。之後可使用這些憑證在工作負載之間建立 mTLS 連線。

事前準備

  1. 建立或選取 Cloud de Confiance 專案

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

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

      gcloud projects create PROJECT_ID

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

    • 選取您建立的 Cloud de Confiance 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Cloud de Confiance 專案名稱。

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

  3. 瞭解代管型 Workload Identity

  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 中執行的工作負載啟用代管工作負載身分:

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

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

建立 workload identity pool

您必須在 TRUST_DOMAIN 模式下建立集區,才能建立受管理的工作負載身分。如要為受管理的工作負載身分建立 workload identity pool,請使用 workload-identity-pools create 指令。

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

更改下列內容:

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

如要確認工作負載身分集區是否以 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。

建立命名空間

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

定義工作負載驗證政策

本節說明如何設定驗證政策。這項政策會決定 Cloud de Confiance 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 簽發憑證

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

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

設定根 CA 集區

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

gcloud

建立根 CA 集區。

  1. Enterprise 層級中建立根 CA 集區,這個層級適用於使用 gcloud privateca pools create 指令長期核發少量憑證。

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

    更改下列內容:

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

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

  2. 使用 gcloud privateca roots create 指令在根 CA 集區中建立根 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

使用 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. 使用 gcloud privateca subordinates create 指令,在下層 CA 集區中建立下層 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 個字元,且只能包含大小寫英數字元、底線或連字號。集區名稱在區域內不得重複。
    • 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 集區要求憑證

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

gcloud

  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/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/locations/global/workloadIdentityPools/POOL_ID/*"
    

    更改下列內容:

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

定義信任和憑證核發設定

您可以使用這項資訊建立 JSON 檔案,並在建立 VM 時上傳為合作夥伴資料。

定義憑證核發設定

如要為 Compute Engine 啟用受管理的工作負載身分,必須設定下列憑證核發設定

{
  "primary_certificate_authority_config": {
    "certificate_authority_config": {
      "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
    }
  },
  "key_algorithm": "ALGORITHM",
  "workload_certificate_lifetime_seconds": DURATION,
  "rotation_window_percentage": ROTATION_WINDOW_PERCENTAGE
}

更改下列內容:

  • SUBORDINATE_CA_POOL_PROJECT_ID:包含下層 CA 集區的專案 ID。
  • REGION:從屬 CA 集區所在的區域。
  • SUBORDINATE_CA_POOL_ID:從屬 CA 集區的名稱
  • ALGORITHM:用於產生私密金鑰的加密演算法。有效值為 rsa-2048 (預設值)、rsa-3072rsa-4096ecdsa-p256ecdsa-p384
  • DURATION:選用:葉子憑證的有效期限 (以秒為單位)。這個值必須介於 3600 至 315360000 之間。如未指定,系統會使用預設值 86400。核發憑證的實際效期也取決於核發 CA,因為該 CA 可能會限制核發憑證的生命週期。
  • ROTATION_WINDOW_PERCENTAGE:(選填) 憑證效期達到這個百分比時,就會觸發更新。值必須介於 50 至 80 之間。預設值為 50%。您必須根據憑證效期設定輪替期百分比,確保憑證核發後至少 7 天,且憑證到期前至少 7 天,會進行憑證續約。

定義信任設定

信任設定包含一組信任錨點,用於驗證對等互連憑證。包含下列項目:

  • 信任的 CA 集區資源 URI:一組 CA 集區資源 URI,這些 URI 信任在與 VM 所屬信任網域相同的網域中核發憑證。
  • PEM 格式的 CA 憑證:一組 PEM 格式的 CA 憑證,這些憑證受信任,可核發與 VM 所屬信任網域相同的憑證。
{
  "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
    "trust_anchors": [
      {
        "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
      },
      {
        "pem_certificate": "PEM_ENCODED_CERTIFICATE"
      }
    ]
  }
}

更改下列內容:

  • POOL_ID:Workload Identity Pool 的 ID
  • PROJECT_NUMBER:包含 Workload Identity Pool 的專案專案編號
  • SUBORDINATE_CA_POOL_PROJECT_ID:包含下層 CA 集區的專案 ID。
  • REGION:從屬 CA 集區所在的區域
  • SUBORDINATE_CA_POOL_ID:從屬 CA 集區的 ID
  • PEM_ENCODED_CERTIFICATE:選用:一組額外的 PEM 格式 CA 憑證,這些憑證受信任,可核發與 VM 所屬信任網域相同的憑證。這些憑證會新增至下層 CA 集區的信任錨點清單。下列指令可用於將 PEM 格式的 trust-anchor.pem 檔案編碼為單行字串:

    cat trust-anchor.pem | sed 's/^[ ]*//g' | sed -z '$ s/\n$//' | tr '\n' $ | sed 's/\$/\\n/g'
    

建立設定檔,上傳 VM 的合作夥伴中繼資料

建立包含下列內容的 JSON 檔案:

將這個檔案儲存為 CONFIGS.json。建立 VM 時,會使用這個檔案執行使用受管理工作負載身分的應用程式。

您的 CONFIGS.json 檔案應如下所示:

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "ALGORITHM"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

後續步驟