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


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

事前準備

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

      gcloud init

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

    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 執行的客體 OS 搭載 Compute Engine 客體代理程式 20231103.01 以上版本。使用 gcloud CLI 查看序列埠輸出內容,判斷目前的 Compute Engine Guest Agent 版本:

    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 是 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 是專案編號,該專案含有受管理的工作負載身分集區。
    • POOL_ID 是 workload identity pool 的 ID。
    • NAMESPACE_ID 是 workload identity pool 中的命名空間 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 聯絡人 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 後就無法更新受管理的身分值。

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