排解工作負載對工作負載驗證問題

本文說明如何排解與「透過 mTLS 向其他工作負載驗證工作負載」相關的常見錯誤。

詳情請參閱「排解 Workload Identity 聯盟問題」。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    2. 設定預設地區和區域

產生的憑證目錄不存在

如果收到 /var/run/secrets/workload-spiffe-credentials 目錄不存在的錯誤訊息,請按照下列步驟操作:

  1. 請使用下列其中一個介面,確認已啟用受管理的工作負載身分,確保運算執行個體支援工作負載對工作負載的驗證:

    控制台

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 在「VM instances」(VM 執行個體) 頁面中找到「Name」(名稱) 欄,並按一下執行個體名稱,查看執行個體的其他詳細資料。

    3. 在「詳細資料」頁面的「安全性與存取權」部分,確認「工作負載身分憑證」的值為「已啟用」。

    gcloud

    如要查看是否已為運算執行個體啟用受管理的工作負載身分功能,請使用 gcloud alpha compute instances describe 指令

    gcloud alpha compute instances describe INSTANCE_NAME \
        --zone=ZONE \
        --format="table(name,zone,identityCertificate)"
    

    更改下列內容:

    • INSTANCE_NAME:執行個體的名稱。

    • ZONE:執行個體所在的區域。

    REST

    如要查看 Compute 執行個體的詳細資料,請向 instances.get 方法發出 GET 要求。在要求中附加 $fields 查詢參數,即可將輸出內容限制為只包含感興趣的欄位。

    GET https://compute.googleapis.com/compute/alpha/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME$fields=name,identityCertificate,identity
    

    更改下列內容:

    • PROJECT_ID:執行個體所在的專案 ID

    • ZONE:執行個體所在的可用區

    • INSTANCE_NAME:執行個體的名稱

  2. 查看 identityCertificateidentity 的例項值。

  3. 如果 identityCertificate 屬性設為 false,則這個運算執行個體不支援這項功能。

    如要解決這個問題,請建立支援工作負載對工作負載驗證的新執行個體。詳情請參閱「在現有 VM 上啟用受管理的工作負載身分」。

  4. 確認 VM 執行的客體 OS 搭載 Compute Engine 客體代理程式 20231103.01 以上版本。使用 gcloud CLI 查看序列埠輸出,判斷目前的 Compute Engine Guest Agent 版本:

    gcloud compute instances get-serial-port-output INSTANCE_NAME | grep "GCE Agent Started"
    

    INSTANCE_NAME 替換為運算執行個體名稱。

    如要更新 Compute Engine Guest Agent,請參閱更新訪客環境

  5. 查看服務記錄,確認 gce-workload-cert-refresh.timer systemd 計時器是否已成功擷取工作負載憑證和信任組合包。

    # View timer logs to see when the gce-workload-cert-refresh.timer last ran
    journalctl -u gce-workload-cert-refresh.timer
    
    # View service logs from gce-workload-cert-refresh.service
    journalctl -u gce-workload-cert-refresh.service
    

產生的憑證目錄只包含 config_status 檔案

產生的憑證目錄 /var/run/secrets/workload-spiffe-credentials 可能只包含 config_status,原因有很多種。請按照下列步驟排解問題。

  1. 檢查 config_status 檔案內容,確認已啟用受管理的工作負載身分識別功能。如果未使用適當的值啟用這項功能,記錄檔會包含 workload certificate feature not enabled 錯誤訊息。

    如要解決這個問題,請使用下列任一方法,建立支援工作負載對工作負載驗證的新運算執行個體:

  2. 檢查 config_status 檔案內容,確保沒有因缺少屬性值或憑證核發/信任設定無效而導致的錯誤。如有這類錯誤,請按照「更新憑證核發和信任設定」一文中的步驟更新設定值。

  3. 確認是否已在工作負載身分集區中,將存取下層 CA 集區的正確權限授予受管理的工作負載身分。使用下列指令:

    gcloud privateca pools get-iam-policy SUBORDINATE_CA_POOL_ID \
       --location=SUBORDINATE_CA_POOL_REGION
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的 ID。
    • SUBORDINATE_CA_POOL_REGION:從屬 CA 集區的區域。

    這個指令的輸出內容應包含下列項目:

    bindings:
    - members:
      - principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*
      -
      role: roles/privateca.poolReader
    - members:
      - principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*
      role: roles/privateca.workloadCertificateRequester
    

    在先前的範例中:

    • PROJECT_NUMBER 是專案的專案號碼。
    • POOL_ID 是 workload identity pool 的 ID。

    如果輸出內容與上述範例不符,請按照「授權受管理的工作負載身分要求來自 CA 集區的憑證」一文的說明,授予必要權限。

  4. 如果 config_status 檔案不含任何錯誤訊息,請檢查檔案中的 iam.googleapis.com/workload-identity 值。該值應符合下列條件:

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

    在先前的範例中:

    • PROJECT_NUMBER 是包含受管理 workload identity pool 的專案編號。
    • POOL_ID 是 workload identity pool 的 ID。
    • NAMESPACE_ID 是 workload identity pool 中的命名空間 ID。
    • MANAGED_IDENTITY_ID 是受管理工作負載身分的 ID。

    如果 iam.googleapis.com/workload-identity 的值不正確,您必須使用正確的值建立新的運算執行個體,因為受管理的身分識別值只能在建立執行個體時更新。

  5. 如果 config_status 檔案不含任何錯誤訊息,請確認信任設定包含 SPIFFE 信任網域 POOL_ID.global.PROJECT_NUMBER.workload.id.goog 的有效項目,該項目對應至指派給運算執行個體的受管理身分識別的 SPIFFE 信任網域。詳情請參閱「定義信任設定」。

  6. 如果 config_status 檔案包含任何錯誤訊息和錯誤代碼 INTERNAL_ERROR,請與 Cloud Customer Care 團隊或您的 Google Cloud 聯絡人 Google Cloud 聯絡,並提供錯誤訊息。