このドキュメントでは、一般的な 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_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 を有効にしてログバケットを作成または更新すると、エラーが発生する。次のようなエラーが表示されます。
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 を有効にしてログバケットを作成した場合は、プロジェクト リソースを選択します。
プロジェクト
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 を有効にしてログバケットを作成した場合は、プロジェクト リソースを選択します。プロジェクト
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 で、
loggingServiceAccountIdフィールドで特定したサービス アカウントに Cloud Key Management Service CryptoKey の暗号化 / 復号ロールを付与します。次の 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" }
CMEK が有効になっている既存のログバケットを含む Google Cloud プロジェクトまたはフォルダごとに、次の操作を行います。
プロジェクトまたはフォルダで、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'
Cloud Key Management Service 鍵 KMS_PROJECT_ID を所有する Google Cloud プロジェクトに移動し、Cloud Key Management Service CryptoKey の暗号化 / 復号ロールを
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 暗号鍵の暗号化/復号ロールが付与されていない場合、または鍵へのアクセスが無効になっている場合、更新が失敗します。
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 鍵が ENABLED と表示されていることと、鍵の目的が対称暗号化(PURPOSE 列には ENCRYPT_DECRYPT を、PRIMARY_STATE 列には ENABLED を含む)であることを確認します。
必要に応じて、新しい鍵を作成します。
アクセス権の構成を確認する
組織の CMEK 設定に関連付けられているサービス アカウントには、構成された鍵に対する Cloud KMS CryptoKey の暗号化 / 復号ロールが必要です。
鍵の Cloud IAM ポリシーを一覧表示するには、次のコマンドを実行します。
gcloud kms keys get-iam-policy KMS_KEY_NAME
必要に応じて、Cloud KMS CryptoKey の暗号化 / 復号ロールを含むサービス アカウントを鍵に追加します。