排解 Cloud Logging 的 CMEK 和預設資源設定問題

本文說明如何找出並減輕常見的 CMEK 設定錯誤。此外,本文也說明如何找出設定 Cloud Logging 預設資源設定時發生的錯誤。這些設定適用於機構和資料夾。

排解為系統建立的新記錄檔值區設定位置的問題

您嘗試更新機構或資料夾的 Cloud Logging 預設資源設定。您更新的內容是設定或修改位置資訊設定。不過,指令會失敗,並顯示類似下列內容的錯誤:

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 和網域限定共用問題

您已設定 Cloud Logging 的預設資源設定,並啟用 CMEK 設定,或建立已啟用 CMEK 的記錄檔 bucket。然後設定 VPC Service Controls。設定 VPC Service Controls 後,您可以在 VPC Service Controls 中限制 Cloud Key Management Service 的存取權,或啟用網域限定共用

至少發生下列其中一項情況:

  • 您收到 Cloud Logging 傳送的 CMEK 存取權問題通知。

  • 在機構或資料夾中建立新專案時,您會發現 _Default_Required 記錄檔 bucket 未啟用 CMEK。 Google Cloud

  • 從啟用 CMEK 的記錄檔儲存空間讀取資料時,系統會顯示錯誤訊息。您看到的錯誤類似於下列錯誤:

    ERROR: (gcloud.logging.read) FAILED_PRECONDITION: 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`
    
  • 建立或更新已啟用 CMEK 的記錄 bucket 時發生錯誤。 您看到的錯誤類似於下列錯誤:

    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 設定而起,請按照下列步驟操作:

  1. 找出含有 CMEK 設定的資源的 Cloud Logging 設定。資源可以是專案、資料夾或機構。如果您建立的記錄檔 bucket 已啟用 CMEK,請選取「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 專案。

  2. 判斷是否需要遷移服務帳戶:

    • 如果 kmsServiceAccountId 欄位的值具有 service- 前置字元,則不需遷移服務帳戶。如要瞭解 CMEK 設定錯誤,請參閱本文的「排解 CMEK 問題」一節。

    • 如果 kmsServiceAccountId 的值有 cmek- 前置字元,請繼續下一個步驟。

  3. 如要確認必須遷移服務帳戶,請停用網域限定共用,或從 VPC Service Controls 限制服務清單中移除 Cloud Key Management Service。

    如果錯誤已解決,您必須將受影響的資源遷移至新的服務帳戶,才能解決失敗問題。如要瞭解這些步驟,請參閱下一節。

遷移 CMEK 服務帳戶

以下程序說明如何變更 Cloud Logging 用來存取已設定 Cloud Key Management Service 金鑰的服務帳戶。變更服務帳戶可解決 VPC Service Controls 和網域限定共用的已知問題。

  1. 找出資源的 loggingServiceAccountId。資源可以是專案、資料夾或機構。如果您建立的記錄檔 bucket 已啟用 CMEK,請選取「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 專案。

  2. 如果您為機構或資料夾設定 Cloud Logging 的預設資源設定,並啟用 CMEK 設定,請按照下列步驟操作:

    1. KMS_PROJECT_ID 中,將 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色授予由 loggingServiceAccountId 欄位識別的服務帳戶。

    2. 執行下列 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"
      }
      
  3. 針對每個包含已啟用 CMEK 的現有記錄檔儲存空間的 Google Cloud 專案或資料夾,執行下列操作:

    1. 在專案或資料夾中,針對每個已啟用 CMEK 的記錄 bucket 執行下列操作:

      1. 找出儲存 Cloud Key Management Service 金鑰的 Google Cloud 專案:

        專案

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
        

        執行指令前,請先完成下列操作:

        • PROJECT_ID 替換為包含記錄儲存區的專案 ID。
        • LOCATION 替換為記錄 bucket 的位置。

        資料夾

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
        

        執行指令前,請先完成下列操作:

        • FOLDER_ID 替換為資料夾 ID。
        • LOCATION 替換為記錄 bucket 的位置。

        上一個指令的結果如下所示:

        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'
        
      2. 前往 Google Cloud 擁有 Cloud Key Management Service 金鑰的專案KMS_PROJECT_ID,然後將 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色授予 loggingServiceAccountId 欄位所識別的服務帳戶。

    2. 如要套用至專案,請執行下列 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"
      }
      
  4. 針對每個啟用 CMEK 的記錄 bucket,請執行下列操作:

    1. 輪替 Cloud KMS 金鑰

    2. 確認遷移作業。記錄 bucket 的父項資源會決定要執行的 Google Cloud CLI 指令。上層可以是專案、資料夾或機構。

      專案

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
      

      執行指令前,請先完成下列操作:

      • PROJECT_ID 替換為包含記錄儲存區的專案 ID。
      • LOCATION 替換為記錄 bucket 的位置。

      資料夾

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
      

      執行指令前,請先完成下列操作:

      • FOLDER_ID 替換為資料夾 ID。
      • LOCATION 替換為記錄 bucket 的位置。

      如果是專案,先前指令的結果會類似如下:

      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 相符。

  5. 請等待至少 30 分鐘,再撤銷先前服務帳戶的權限。如果撤銷先前服務帳戶的權限後發生任何問題,請還原權限並與 Cloud 支援團隊聯絡。

排解 CMEK 問題

設定 CMEK 時,系統會將相關問題通知包含 Cloud KMS 金鑰的 Google Cloud 專案。舉例來說,如果 KMS_KEY_NAME 無效、相關聯的服務帳戶沒有必要的 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色,或是金鑰存取權已停用,更新就會失敗。

設定 CMEK 後,至少會發生下列其中一種情況:

  • 您收到 Cloud Logging 傳送的 CMEK 存取權問題通知。

  • 在機構或資料夾中建立新專案時,您會發現 _Default_Required 記錄檔 bucket 未啟用 CMEK。 Google Cloud

  • 從啟用 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 Encrypter/Decrypter 角色的服務帳戶新增至金鑰。