本文將說明如何找出及減輕常見的 CMEK 設定錯誤,並說明如何找出設定預設資源位置時發生的錯誤。
設定預設資源位置時的疑難排解
您嘗試更新機構或資料夾的預設儲存空間位置,但指令失敗,並顯示類似以下的錯誤訊息:
ERROR: (gcloud.logging.settings.update) INVALID_ARGUMENT: The KMS key location must match the storage location. Received KMS key location: us-central1, storage location: us-west1
- '@type': type.googleapis.com/google.rpc.DebugInfo
detail: '[ORIGINAL ERROR] generic::invalid_argument: The KMS key location must match
the storage location. Received KMS key location: us-central1, storage location:
us-west1 [google.rpc.error_details_ext] { message: "The KMS key location must
match the storage location. Received KMS key location: us-central1, storage location:
us-west1" }'
如要解決這個錯誤,請將機構或資料夾的預設儲存位置設為與機構或資料夾的 Cloud Key Management Service 金鑰位置相符。
排解 VPC Service Controls 和網域限定共用問題
您將 CMEK 設為機構或資料夾的預設資源設定,或是已啟用 CMEK 來建立記錄資料集區。接著,您可以設定 VPC Service Controls。設定 VPC Service Controls 後,您可以在 VPC Service Controls 中限制 Cloud Key Management Service 的存取權,或啟用網域限定共用。
至少發生下列其中一項情況:
您收到 Cloud Logging 發出的 CMEK 存取權問題通知。
您會發現,在機構或資料夾中建立新 Google Cloud 專案時,系統並未為
_Default
和_Required
記錄檔值區啟用 CMEK。啟用 CMEK 後,您會在讀取記錄資料夾時收到錯誤訊息。您會看到類似以下的錯誤訊息:
ERROR: (gcloud.logging.read) FAILED_PRECONDITION: service account `cmek-PROJECT_IDgcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY`
在啟用 CMEK 的情況下建立或更新記錄區塊時,會收到錯誤訊息。您會看到類似以下的錯誤訊息:
ERROR: (gcloud.logging.buckets.create) service account `cmek-PROJECT_ID@gcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY` - '@type': type.googleapis.com/google.rpc.DebugInfo detail: '[ORIGINAL ERROR] generic::permission_denied: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: <var>ERRORID</var>;'
如要判斷這些問題是否由 VPC Service Controls 設定造成,請執行下列操作:
找出含有 CMEK 設定的資源的 Cloud Logging 設定。資源可以是專案、資料夾或機構。如果您在啟用 CMEK 的情況下建立記錄檔 bucket,請選取「PROJECT」資源。
專案
gcloud logging settings describe --project=PROJECT_ID
執行指令前,請將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
資料夾
gcloud logging settings describe --folder=FOLDER_ID
執行指令前,請將 FOLDER_ID 替換為資料夾的 ID。
機構
gcloud logging settings describe --organization=ORGANIZATION_ID
執行指令前,請將 ORGANIZATION_ID 替換為機構 ID。
上述指令會傳回類似以下的資訊:
kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
對於機構和資料夾,系統也會傳回下列欄位:
kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
kmsKeyName
欄位的值包含儲存鍵的 Google Cloud 專案。判斷是否需要遷移服務帳戶:
如果
kmsServiceAccountId
欄位的值含有前置字符service-
,則您不需要遷移服務帳戶。如要瞭解 CMEK 設定錯誤,請參閱本文件的「排解 CMEK 問題」一節。如果
kmsServiceAccountId
的值含有前置字串cmek-
,請繼續下一個步驟。
確認您必須透過停用網域限制共用或從 VPC Service Controls 受限制服務清單中移除 Cloud Key Management Service,才能遷移服務帳戶。
如果錯誤已解決,則必須將受影響的資源遷移至新服務帳戶,才能解決失敗問題。如要瞭解這些步驟,請參閱下一節。
遷移 CMEK 服務帳戶
以下程序說明如何變更 Cloud Logging 用來存取已設定 Cloud Key Management Service 金鑰的服務帳戶。服務帳戶的變更可解決 VPC Service Controls 和網域限定共用功能的已知問題。
找出資源的
loggingServiceAccountId
。資源可以是專案、資料夾或機構。如果您在啟用 CMEK 的情況下建立記錄檔 bucket,請選取「PROJECT」資源。專案
gcloud logging settings describe --project=PROJECT_ID
執行指令前,請將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
資料夾
gcloud logging settings describe --folder=FOLDER_ID
執行指令前,請將 FOLDER_ID 替換為資料夾的 ID。
機構
gcloud logging settings describe --organization=ORGANIZATION_ID
執行指令前,請將 ORGANIZATION_ID 替換為機構 ID。
上述指令會傳回類似以下的資訊:
kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
對於機構和資料夾,系統也會傳回下列欄位:
kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
kmsKeyName
欄位的值包含儲存鍵的 Google Cloud 專案。如果您為機構或資料夾設定了預設資源設定,請按照下列步驟操作:
在 KMS_PROJECT_ID 中,將 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色授予
loggingServiceAccountId
欄位所識別的服務帳戶。執行下列 curl 指令,變更資源使用的 Cloud Key Management Service 服務帳戶。
專案
不適用。
資料夾
curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/folders/FOLDER_ID/settings?updateMask=kmsServiceAccountId
執行指令前,請先執行下列操作:
- 將 FOLDER_ID 替換為資料夾的 ID。
- 將 SERVICE_ACCT_NAME 替換為先前識別的
loggingServiceAccountId
。
機構
curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/settings?updateMask=kmsServiceAccountId
執行指令前,請先執行下列操作:
- 將 ORGANIZATION_ID 替換為機構 ID。
- 將 SERVICE_ACCT_NAME 替換為先前識別的
loggingServiceAccountId
。
上述指令的結果如下所示:
{ "name": ".../settings", "kmsKeyName": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY", "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com", "storageLocation": "...", "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com" }
針對每個 Google Cloud 專案或資料夾 (其中包含已啟用 CMEK 的現有記錄資料集),請執行下列操作:
在專案或資料夾中,針對每個使用 CMEK 啟用的記錄值區,執行下列操作:
找出儲存 Cloud Key Management Service 金鑰的 Google Cloud 專案:
專案
gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
執行指令前,請先執行下列操作:
- 將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
- 將 LOCATION 替換為記錄值區的位置。
資料夾
gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
執行指令前,請先執行下列操作:
- 將 FOLDER_ID 替換為資料夾的 ID。
- 將 LOCATION 替換為記錄值區的位置。
上述指令的結果如下所示:
cmekSettings: kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1 serviceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com createTime: '2022-10-31T12:00:00.0000000Z' lifecycleState: ACTIVE name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID retentionDays: 30 createTime: '2022-10-31T13:00:00.0000000Z'
前往 Google Cloud 擁有 Cloud Key Management Service 金鑰的專案 KMS_PROJECT_ID,然後將 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色授予
loggingServiceAccountId
欄位所識別的服務帳戶。
針對專案,請執行下列 curl 指令,以便變更 Cloud Key Management Service 服務帳戶:
專案
curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/projects/PROJECT_ID/settings?updateMask=kmsServiceAccountId
執行指令前,請先執行下列操作:
- 將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
- 將 SERVICE_ACCT_NAME 替換為先前識別的
loggingServiceAccountId
。
資料夾
您已在先前的步驟中變更了資料夾使用的 Cloud Key Management Service 服務帳戶,因此不需要採取任何行動。
上述指令的結果如下所示:
{ "name": ".../settings", "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com", "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com" }
針對已啟用 CMEK 的每個記錄資料夾,請執行下列操作:
確認遷移作業。記錄值區的父項資源會決定要執行哪個 Google Cloud CLI 指令。上層項目可能是專案、資料夾或機構。
專案
gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
執行指令前,請先執行下列操作:
- 將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
- 將 LOCATION 替換為記錄值區的位置。
資料夾
gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
執行指令前,請先執行下列操作:
- 將 FOLDER_ID 替換為資料夾的 ID。
- 將 LOCATION 替換為記錄值區的位置。
對於專案而言,上述指令的結果會類似以下:
cmekSettings: kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1 serviceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com createTime: '2022-10-31T12:00:00.0000000Z' lifecycleState: ACTIVE name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID retentionDays: 30 createTime: '2022-10-31T13:00:00.0000000Z'
請確認
serviceAccountId
與先前找出的loggingServiceAccountId
相符。
請等待至少 30 分鐘,然後再撤銷先前服務帳戶的權限。如果在撤銷先前服務帳戶的權限後遇到任何問題,請還原權限,然後與 Cloud 支援團隊聯絡。
排解 CMEK 問題
設定 CMEK 時,系統會通知含有 Cloud KMS 金鑰的 Google Cloud 專案有關問題。舉例來說,如果 KMS_KEY_NAME 無效、相關聯的服務帳戶沒有必要的 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色,或是金鑰的存取權遭到停用,更新作業就會失敗。
設定 CMEK 後,至少會發生下列其中一項情況:
您收到 Cloud Logging 發出的 CMEK 存取權問題通知。
您會發現,在機構或資料夾中建立新 Google Cloud 專案時,系統並未為
_Default
和_Required
記錄檔值區啟用 CMEK。在啟用 CMEK 的情況下讀取記錄檔值區,或嘗試建立或更新記錄檔值區時,會收到錯誤訊息。
通知會提供失敗資訊,並包含可用來緩解問題的措施:
錯誤 | 建議 |
---|---|
加密編譯金鑰權限遭拒 | 與 Google Cloud 專案相關聯的 Logging 服務帳戶沒有足夠的 IAM 權限,無法對指定的 Cloud KMS 金鑰進行操作。請按照錯誤訊息中的指示操作,或參閱下列文件:
|
已停用加密編譯金鑰 | 已停用指定的 Cloud KMS 金鑰。請按照錯誤訊息中的操作說明重新啟用金鑰。 |
已刪除加密編譯金鑰 | 已刪除指定的 Cloud KMS 金鑰。請按照操作說明或參閱下列文件: |
找出含有 Cloud KMS 金鑰的專案
如要找出包含記錄值區、資料夾或機構所使用的加密金鑰的 Google Cloud 專案 ID,請按照下列步驟操作:
專案
gcloud logging settings describe --project=PROJECT_ID
執行指令前,請將 PROJECT_ID 替換為包含記錄資料集的專案 ID。
資料夾
gcloud logging settings describe --folder=FOLDER_ID
執行指令前,請將 FOLDER_ID 替換為資料夾的 ID。
機構
gcloud logging settings describe --organization=ORGANIZATION_ID
執行指令前,請將 ORGANIZATION_ID 替換為機構 ID。
上述指令會傳回類似以下的資訊:
kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
對於機構和資料夾,系統也會傳回下列欄位:
kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
kmsKeyName
欄位的值包含儲存鍵的 Google Cloud 專案。
驗證金鑰可用性
如要確認金鑰的可用性,請執行下列指令,列出所有金鑰:
gcloud kms keys list \ --location=KMS_KEY_LOCATION \ --keyring=KMS_KEY_RING
這個指令會以表格格式傳回每個鍵的相關資訊。輸出內容的第一行是資料欄名稱清單:
NAME PURPOSE ...
請確認 Cloud KMS 金鑰在指令的輸出內容中列為 ENABLED
,且金鑰的用途為對稱加密:PURPOSE
欄必須包含 ENCRYPT_DECRYPT
,PRIMARY_STATE
欄則必須包含 ENABLED
。
如有需要,請建立新的金鑰。
驗證權限設定
與機構的 CMEK 設定相關聯的服務帳戶,必須具備已設定金鑰的 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
如要列出金鑰的 IAM 政策,請執行下列指令:
gcloud kms keys get-iam-policy KMS_KEY_NAME
如有需要,請將含有 Cloud KMS CryptoKey 加密者/解密者角色的服務帳戶新增至金鑰。