本文說明如何排解與透過 mTLS 將工作負載驗證至其他工作負載相關的常見錯誤。
事前準備
-
如果尚未設定驗證,請先完成設定。
「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,向 Compute Engine 進行驗證:
-
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
- 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 執行的客體 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 客體代理程式,請參閱更新客體環境。
查看服務記錄,確認
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 是 workload identity pool 的 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 是 workload identity pool 的 ID。
- NAMESPACE_ID 是 workload identity pool 中的命名空間 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 聯絡人 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 後就無法更新受管理的身分值。
確認信任設定包含 SPIFFE 信任網域的有效項目,該項目對應於指派給 VM 的受管理身分上的 SPIFFE 信任網域。
POOL_ID.global.PROJECT_NUMBER.workload.id.goog