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

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

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

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

事前準備

  1. Create or select a Trusted Cloud project.

    • Create a Trusted Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Trusted Cloud project you are creating.

    • Select the Trusted Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Trusted Cloud project name.

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

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

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

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

  6. Enable the IAM and Certificate Authority Service APIs:

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

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

    gcloud config set billing/quota_project PROJECT_ID
    

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

必要的角色

如要取得建立受管理工作負載身分和佈建受管理工作負載身分憑證所需的權限,請要求管理員授予您專案的下列 IAM 角色:

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

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

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

總覽

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

  1. 安全管理員

  2. 運算管理員

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

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

透過受管理的工作負載身分, Trusted Cloud by S3NS 可自動將工作負載身分集區身分的憑證,佈建至工作負載。工作負載身分是在工作負載身分集區中定義,並劃分為稱為「命名空間」的管理邊界。

建立工作負載身分集區

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

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

更改下列內容:

  • POOL_ID:集區的專屬 ID。ID 長度必須介於 4 到 32 個字元,且只能包含小寫英數字元和破折號,開頭和結尾須為英數字元。工作負載身分集區建立後,就無法變更 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:您先前建立的工作負載身分集區 ID。

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

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

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 個字元之間,只能使用小寫英數字元和破折號,且開頭和結尾須為英數字元。建立受管理的工作負載身分後,就無法變更其 ID。
  • NAMESPACE_ID:您先前建立的命名空間 ID。
  • POOL_ID:您先前建立的工作負載身分集區 ID。

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

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

定義工作負載認證政策

本節說明如何設定認證政策。這項政策會決定 Trusted 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

      如要建立認證政策檔案,根據執行個體 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 個字元之間,只能使用小寫英數字元和破折號,且開頭和結尾須為英數字元。建立受管理的工作負載身分後,就無法變更其 ID。
    • NAMESPACE_ID:您先前建立的命名空間 ID。
    • POOL_ID:您先前建立的工作負載身分集區 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
    

設定憑證授權單位服務,為受管理的工作負載身分識別核發憑證

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

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

設定根 CA 集區

使用 Google Cloud CLI 介面,透過 Certificate Authority Service 設定根 CA 集區。

gcloud

建立根 CA 集區。

  1. 企業層級中建立根 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 集區所在的區域。

    詳情請參閱建立 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 集區的區域。

    詳情請參閱建立 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 的 subject 欄位,請參閱「主體」。

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

受管理的工作負載身分必須具備權限,才能向 CA 服務要求憑證並取得公開憑證。

gcloud

  1. 在每個下層 CA 集區中,將 CA 服務工作負載憑證要求者 (roles/privateca.workloadCertificateRequester) 身分與存取權管理角色授予受管理的工作負載身分。下列 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:工作負載身分集區的 ID。
  2. 將從屬 CA 集區的「CA 服務集區讀取者」(roles/privateca.poolReader) 身分與存取權管理角色授予受管理的工作負載身分。這項授權可讓受管理的工作負載身分從 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:工作負載身分集區的 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:工作負載身分集區的 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"
     }
  }
  }
  

後續步驟