本文說明如何使用 gcloud CLI,為 Compute Engine 設定代管工作負載身分。本文也說明如何使用憑證授權單位服務,為 Compute Engine 設定受管理工作負載身分自動佈建和生命週期管理,以便在工作負載之間建立相互傳輸層安全標準 (mTLS) 連線。
如要申請 Compute Engine 受管理的工作負載身分存取權,請填寫存取權申請表單。
事前準備
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 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 專案名稱。
瞭解受管理的工作負載身分。
瞭解如何使用憑證授權單位服務核發憑證。
啟用 IAM 和憑證授權單位服務 API:
啟用 API 時所需的角色
如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。gcloud services enable iam.googleapis.com
privateca.googleapis.com 將 Google Cloud CLI 設為使用已加入帳單和配額許可清單的專案。
gcloud config set billing/quota_project PROJECT_ID
將 PROJECT_ID 替換為已加入受管理工作負載身分預先發布版許可清單的專案 ID。
必要的角色
如要取得建立受管理 Workload Identity,以及佈建受管理 Workload Identity 憑證所需的權限,請要求系統管理員在專案中授予您下列 IAM 角色:
-
如要建立及設定受管理的工作負載身分,請按照下列步驟操作:
- 身分與存取權管理 Workload Identity 集區管理員 (
roles/iam.workloadIdentityPoolAdmin) - 服務帳戶管理員 (
roles/iam.serviceAccountAdmin)
- 身分與存取權管理 Workload Identity 集區管理員 (
-
如要建立及設定 CA 集區:CA 服務管理員 (
roles/privateca.admin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
或者,IAM Owner (roles/owner) 基本角色也包含設定受管理工作負載身分的權限。
您不應在正式環境中授予基本角色,但可以在開發或測試環境中授予。
總覽
如要為應用程式使用受管理的工作負載身分,請執行下列工作:
安全管理員:
- 建立 workload identity pool。
- 設定 CA (選擇 CA 選項、設定 CA,以及更新集區)。
- 在 workload identity pool 中建立受管理的工作負載身分。
- 定義工作負載驗證政策,並建立服務帳戶。
運算管理員:
為在 Compute Engine 中執行的工作負載啟用代管工作負載身分:
- 適用於個別 VM。
- 適用於代管執行個體群組 (MIG)。
建立 workload identity pool
如要設定受管理的工作負載身分,請在
TRUST_DOMAIN模式下建立集區。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。
選擇 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 設定受管理的工作負載身分,請完成下列步驟:
設定 CA 服務,為受管理的工作負載身分核發憑證
使用憑證授權單位服務集區,為根憑證授權單位和從屬憑證授權單位 (CA) 建立建議的設定。從屬 CA 集區會將 X.509 工作負載身分憑證核發給 VM。
設定為使用受管理工作負載身分識別,為 Compute Engine VM 核發憑證的 CA 集區,必須與 VM 位於相同區域。如要設計多區域架構,以因應區域性服務中斷,建議您為每個工作負載區域設定從屬的憑證授權單位服務 CA 集區。這樣一來,每個 Compute Engine VM 都能參照區域內的下層憑證授權單位服務 CA 集區。
設定 CA 集區後,您就可以授權受管理的工作負載身分,向 CA 集區要求及接收已簽署的憑證。
設定根 CA 集區
使用 Google Cloud CLI 介面,透過憑證授權單位服務設定根 CA 集區。
CA 集區建立後就無法移動或匯出。
在 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 集區所在的區域。
詳情請參閱建立憑證授權單位集區。
在根 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 集區中建立其他根 CA。這對根 CA 輪替很有幫助。
設定下層 CA
使用 Google Cloud CLI 介面,透過憑證授權單位服務建立下層 CA 集區和下層 CA。
如果您有多個憑證核發情境,可以為每個情境建立從屬 CA。此外,在 CA 集區中新增多個從屬 CA,有助於更妥善地平衡分配憑證要求負載。
使用 gcloud privateca pools create 指令建立下層 CA 集區。
在 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 集區中執行
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。
建立
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。
執行下列指令來更新 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_FILE:issuance-config.yaml檔案的路徑。
授權受管理的工作負載身分,從 CA 集區要求憑證
代管工作負載身分需要權限,才能向 CA 服務要求憑證並取得公開憑證。
對每個下層 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。
將下層 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
定義含有驗證規則的工作負載驗證政策
如要建立驗證政策,允許工作負載使用受管理的身分,請按照下列步驟操作:
決定是否要建立驗證政策,讓工作負載使用附加的服務帳戶或執行個體 ID,驗證代管身分。
建立 JSON 格式的驗證政策檔案。
選用:如要在 Compute Engine 執行個體上接收 X.509 憑證,必須啟用附加的服務帳戶。建議您先使用下列指令建立新的服務帳戶,然後將該帳戶附加至工作負載:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
將
SERVICE_ACCOUNT_NAME替換為服務帳戶名稱建立 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 區域
使用您在本文件稍早建立的政策 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
如要瞭解如何列出或移除認證規則,請執行下列指令:
gcloud iam workload-identity-pools managed-identities list-attestation-rules --help gcloud iam workload-identity-pools managed-identities remove-attestation-rule --help
選用:啟用 Workload Identity 集區之間的信任聯盟
如要為不同信任網域中的工作負載啟用相互驗證,可以設定信任聯盟。
建立
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 憑證。
如要使用信任設定更新 Workload Identity 集區,請執行下列指令:
gcloud iam workload-identity-pools update POOL_ID \ --location="global" \ --inline-trust-config-file=TRUST_CONFIG_FILE
更改下列內容:
POOL_ID:集區的專屬 ID。TRUST_CONFIG_FILE:trust-config.yaml檔案的路徑。
後續步驟
- 排解 Compute Engine 的受管理工作負載身分驗證問題。
- 使用 mTLS 設定工作負載對工作負載的驗證。
- 使用代管的工作負載身分識別,設定具有後端 mTLS 的負載平衡。
- 進一步瞭解如何建立 CA 集區。