CMEK とデフォルト設定エラーのトラブルシューティング

このドキュメントでは、一般的な 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 へのアクセスを制限するか、ドメインで制限された共有を有効にします。

次のいずれかの少なくとも 1 つが発生します。

  • CMEK アクセスの問題について Cloud Logging から通知を受け取る。

  • 組織またはフォルダに新しい 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 の構成によるものかどうかを判断するには、次の操作を行います。

  1. CMEK 構成を含むリソースの Cloud Logging 設定を特定します。リソースには、プロジェクト、フォルダ、組織などがあります。CMEK を有効にしてログバケットを作成した場合は、プロジェクト リソースを選択します。

    プロジェクト

    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 を特定します。リソースには、プロジェクト、フォルダ、組織があります。CMEK を有効にしてログバケットを作成した場合は、プロジェクト リソースを選択します。

    プロジェクト

    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. 組織またはフォルダにデフォルトのリソース設定を構成した場合は、次の操作を行います。

    1. KMS_PROJECT_ID で、loggingServiceAccountId フィールドで特定したサービス アカウントに Cloud Key Management Service CryptoKey の暗号化 / 復号 のロールを付与します。

    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 が有効になっているログバケットごとに次の操作を行います。

      1. 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'
        
      2. Cloud Key Management Service 鍵 KMS_PROJECT_ID を所有する Google Cloud プロジェクトに移動し、Cloud Key Management Service CryptoKey の暗号化 / 復号 のロールを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 が有効になっている各ログバケットに対して、次の操作を行います。

    1. Cloud KMS 鍵をローテーションします

    2. 移行を確認します。ログバケットの親リソースによって、実行する 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 と一致することを確認します。

  5. 30 分以上待ってから、以前のサービス アカウントの権限を取り消します。以前のサービス アカウントの権限を取り消してから問題が発生した場合は、権限を復元して Cloud サポートにお問い合わせください。

CMEK のトラブルシューティング

CMEK を構成すると、Cloud KMS 鍵を含む Google Cloud プロジェクトに対して、関連する問題について通知されます。たとえば、KMS_KEY_NAME が無効である場合、関連するサービス アカウントに必要な Cloud Key Management Service 暗号鍵の暗号化 / 復号のロールが付与されていない場合、または鍵へのアクセスが無効になっている場合に更新が失敗します。

CMEK を構成すると、少なくとも次のいずれかが発生します。

  • CMEK アクセスの問題について Cloud Logging から通知を受け取る。

  • 組織またはフォルダに新しい Google Cloud プロジェクトを作成するときに、_Default ログバケットと _Required ログバケットで CMEK が有効になっていないことに気づく。

  • CMEK が有効になっているログバケットから読み取るか、ログバケットを作成または更新しようとすると、エラーが発生する。

通知には失敗に関する情報と、問題を軽減するための手順が記載されています。

エラー 推奨事項
暗号鍵に対するアクセスが拒否されました

Google Cloud プロジェクトに関連付けられている Logging サービス アカウントに、指定した Cloud KMS 鍵を操作するための十分な IAM 権限が付与されていません。エラーの手順に従うか、次のドキュメントをご覧ください。

暗号鍵が無効になっています 指定された 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 Key がENABLEDとして有効とリストされていること、および鍵の目的が対称暗号化(PURPOSE 列には ENCRYPT_DECRYPT を、PRIMARY_STATE 列には ENABLED を含む)であることを確認します。

必要に応じて、新しい鍵を作成します。

アクセス権の構成の確認

組織の CMEK 設定に関連付けられているサービス アカウントには、構成された鍵に対する Cloud KMS CryptoKeyの暗号化 / 復号のロールが必要です。

鍵の IAM ポリシーを一覧表示するには、次のコマンドを実行します。

gcloud kms keys get-iam-policy KMS_KEY_NAME

必要に応じて、Cloud KMS CryptoKeyの暗号化 / 復号のロールを含むサービス アカウントを鍵に追加します。