本文說明如何排解透過 mTLS 驗證工作負載與其他工作負載相關的常見錯誤。
事前準備
-
如果尚未設定,請先設定驗證機制。「驗證」是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,以便對 Compute Engine 進行驗證:
-
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.
- Set a default region and zone.
-
產生的憑證目錄不存在
如果您收到 /var/run/secrets/workload-spiffe-credentials
目錄不存在的錯誤訊息,請執行下列操作:
請在 VM 內執行下列指令,確認您的 VM 支援工作負載至工作負載驗證。
curl "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
如果回應是
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:
如果回應是
HTTP 404
錯誤代碼,且錯誤訊息為workload certificate feature not enabled
,表示 VM 支援受管理的工作負載身分,但未啟用這項功能。如要在 VM 上啟用這項功能,請參閱「在現有 VM 上啟用受管理的工作負載身分」。
請確認 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 訪客代理程式,請參閱「更新訪客環境」一文。
查看服務記錄,確認
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
。請按照下列步驟排解這個問題。
檢查
config_status
檔案的內容,確認已啟用受管理的工作負載身分功能。如果未使用適當的 VM 中繼資料啟用這項功能,記錄檔就會包含錯誤訊息workload certificate feature not enabled
。如要解決這個問題,請使用下列任一方法,建立支援工作負載與工作負載驗證的新 VM:
請檢查
config_status
檔案的內容,確保沒有因缺少屬性值或憑證核發或信任設定無效而發生的錯誤。如果發生這類錯誤,請按照「更新憑證核發和信任設定」中的步驟更新設定值。請確認已授予工作負載身分集區中受管理的工作負載身分正確權限,以便存取子 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 集區要求憑證」一文所述,授予必要權限。
如果
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 時更新受管理身分值。如果
config_status
檔案沒有任何錯誤訊息,請確認信任設定包含 SPIFFE 信任網域POOL_ID.global.PROJECT_NUMBER.workload.id.goog
的有效項目,該項目會對應至 VM 指派的受管理身分識別資訊的 SPIFFE 信任網域。詳情請參閱「定義信任設定」。如果
config_status
檔案包含任何錯誤訊息,且錯誤代碼為INTERNAL_ERROR
,請將錯誤訊息提供給 Cloud Customer Care 團隊或 Google Cloud 聯絡窗口。
查詢中繼資料伺服器端點時傳回 404 錯誤
如果在查詢 workload-identities
或 trust-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 信任網域。