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


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

事前準備

  • 如果尚未設定,請先設定驗證機制。「驗證」是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,以便對 Compute Engine 進行驗證:
    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

產生的憑證目錄不存在

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

  1. 請在 VM 內執行下列指令,確認您的 VM 支援工作負載至工作負載驗證。

    curl  "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
    
    1. 如果回應是 HTTP 404 錯誤代碼,且包含下列錯誤訊息,則表示這個 VM 不支援這項功能。

      The requested URL /computeMetadata/v1/instance/gce-workload-certificates/config-status
      was not found on this server.  That's all we know.
      

      如要解決這個問題,請使用下列任一方法建立支援工作負載與工作負載驗證的新 VM:

    2. 如果回應是 HTTP 404 錯誤代碼,且錯誤訊息為 workload certificate feature not enabled,表示 VM 支援受管理的工作負載身分,但未啟用這項功能。如要在 VM 上啟用這項功能,請參閱「在現有 VM 上啟用受管理的工作負載身分」。

  2. 請確認 VM 執行的訪客作業系統已安裝 Compute Engine 訪客代理程式 20231103.01 以上版本。使用 gcloud CLI 查看序列埠輸出內容,判斷目前的 Compute Engine 訪客代理程式版本:

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

    VM_NAME 替換為 VM 名稱。

    如要更新 Compute Engine 訪客代理程式,請參閱「更新訪客環境」一文。

  3. 查看服務記錄,確認 gce-workload-cert-refresh.timer 是否能成功擷取工作負載憑證和信任套件。

    # 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 檔案的內容,確認已啟用受管理的工作負載身分功能。如果未使用適當的 VM 中繼資料啟用這項功能,記錄檔就會包含錯誤訊息 workload certificate feature not enabled

    如要解決這個問題,請使用下列任一方法,建立支援工作負載與工作負載驗證的新 VM:

  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/locations/global/workloadIdentityPools/POOL_ID/*
      -
      role: roles/privateca.poolReader
    - members:
      - principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      role: roles/privateca.workloadCertificateRequester
    

    在上述範例中:

    • PROJECT_NUMBER 是專案號碼。
    • POOL_ID 是工作負載身分集區的 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 是包含受管理工作負載身分池的專案專案編號。
    • POOL_ID 是工作負載身分集區的 ID。
    • NAMESPACE_ID 是工作負載身分識別金鑰集區中的命名空間 ID。
    • MANAGED_IDENTITY_ID 是受管理工作負載身分的 ID。

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

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

  6. 如果 config_status 檔案包含任何錯誤訊息,且錯誤代碼為 INTERNAL_ERROR,請將錯誤訊息提供給 Cloud Customer Care 團隊或 Google Cloud 聯絡窗口。

查詢中繼資料伺服器端點時傳回 404 錯誤

如果在查詢 workload-identitiestrust-anchors 端點時收到 404 回應,請在 VM 中執行下列指令,確認 VM 支援受管理的工作負載身分:

curl  "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
  • 如果回應是 HTTP 404 錯誤代碼,並附上以下錯誤訊息:

      The requested URL /computeMetadata/v1/instance/gce-workload-certificates/config-status
      was not found on this server.  That's all we know.
    

    VM 不支援受管理的工作負載身分。如要解決這個問題,請按照下列其中一種做法進行:

  • 如果回應是 HTTP 404 錯誤代碼,且包含錯誤訊息 workload certificate feature not enabled,則表示此 VM 支援受管理的工作負載身分,但未啟用這項功能。建立已啟用這項功能的新 VM,或建立新的執行個體範本和代管執行個體群組。

  • 請執行下列指令,確認已授予工作負載身分集區正確的權限,以便存取子 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 集區的區域。

    這項指令的輸出內容應包含下列資訊,其中 PROJECT_NUMBER 是專案的專案編號,而 POOL_ID 是工作負載身分識別群組的 ID。

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

    如果輸出內容不含這些值,請授予正確的權限,如授權受管理的負載工作身分,向 CA 集區要求憑證所述。

  • 確認 iam.googleapis.com/workload-identity 值正確無誤,且符合下列條件:

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

    如果值不相符,則必須建立新的 VM,因為建立 VM 後,無法更新受管理的 ID 值。

  • 請確認信任設定包含 SPIFFE 信任網域 POOL_ID.global.PROJECT_NUMBER.workload.id.goog 的有效項目,該項目會對應 VM 指派的受管理身分中的 SPIFFE 信任網域。