顧客管理の暗号鍵(CMEK)を使用する

このページでは、Firestore の顧客管理の暗号鍵(CMEK)に関連するタスクの実行方法について説明します。CMEK の一般的な用途や使用する理由などの詳細については、Cloud KMS のドキュメントをご覧ください。

CMEK 鍵を準備する

CMEK で保護された Firestore データベースを作成する前に、次の手順を完了する必要があります。

  1. Firestore CMEK 機能へのアクセスをリクエストします
  2. Firestore サービス エージェントを作成(または取得)する
  3. CMEK 鍵を作成する
  4. その鍵の IAM 設定を構成する

CMEK で保護された Firestore データベースを含むプロジェクトごとに、次の手順を完了します。後で新しい CMEK 鍵を作成する場合は、その鍵の IAM 設定を構成する必要があります。

アクセスをリクエスト

Firestore サービス エージェントを作成する前に、こちらのフォームに入力して CMEK 機能へのアクセスをリクエストしてください。

Firestore サービス エージェントを作成する

CMEK 鍵を作成する前に、Firestore サービス エージェントが必要です。このアカウントは、Firestore が鍵へのアクセスに使用する Google マネージド サービス アカウントの一種です。

サービス アカウント作成コマンドを実行して、Firestore がお客様の代わりに CMEK 鍵にアクセスする際に使用するサービス エージェントを作成します。サービス アカウントが存在しない場合、このコマンドはサービス アカウントを作成して表示します。

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

FIRESTORE_PROJECT は、Firestore データベースに使用する予定のプロジェクトに置き換えます。

このコマンドは、メールアドレスに似た形式のサービス エージェント ID を表示します。後のステップで使用するため、出力メール文字列を記録します。

Service identity created:
[email protected]

キーを作成

Cloud KMS で直接作成された鍵または Cloud External Key Manager で利用できる外部管理鍵を使用できます。

Cloud KMS 鍵のロケーションは、使用する Firestore データベースのロケーションと同じである必要があります。

  • リージョン データベースのロケーションには、ロケーション名には 1 対 1 のマッピングがあるため、キーリング、鍵、データベースに同じロケーション名を使用します。

    たとえば、CMEK で保護されたデータベースを us-west1 に作成する場合は、us-west1 にキーリングと鍵を作成します。

  • マルチリージョン データベース ロケーションには、KMS マルチリージョン ロケーションのロケーション名を使用します。

    • Firestore の nam5 マルチリージョン ロケーションには、Cloud KMS us マルチリージョン ロケーションを使用します。
    • Firestore の eur3 マルチリージョン ロケーションには、Cloud KMS europe マルチリージョン ロケーションを使用します。

鍵を管理する Google Cloud プロジェクトで、以下を完了します。

  1. Cloud KMS API を有効化します。

  2. 次のいずれかのオプションを使用してキーリングと鍵を作成します。

鍵の IAM 設定を構成する

Console

Cloud KMS のロールをサービス エージェントに付与するには、次の手順を行います。詳細レベルでの設定が必要な場合は、鍵レベルまたは鍵リングレベルで権限を付与することもできます。

  1. Google Cloud コンソールの [IAM] ページに移動します。

    IAM ページに移動

  2. [追加] をクリックします。

  3. Firestore サービス エージェントのメール ID を入力します。

  4. [Cloud KMS 暗号鍵の暗号化 / 復号] ロールを選択します。

  5. [保存] をクリックします。

gcloud

サービス エージェントに cloudkms.cryptoKeyEncrypterDecrypter ロールを付与します。

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

次のように置き換えます。

  • KMS_KEY は、キーに割り当てた名前に置き換えます。
  • KMS_KEYRING は、鍵を含む KMS キーリングに置き換えます。
  • KMS_LOCATION: キーリングが含まれるリージョン
  • SERVICE_AGENT_EMAIL は、アクセス権を付与するサービス エージェントのメール形式の ID に置き換えます。
  • KMS_PROJECT: 鍵を含むプロジェクト

ターミナルに次のようなレスポンスが表示されます。

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

CMEK 有効化データベースを作成する

CMEK 鍵の作成と構成が完了したら、CMEK で保護されたデータベースを作成できます。Google のデフォルトの暗号化によって保護されている既存の Firestore データベースは、CMEK を使用するように変換できません。

暗号化の種類と鍵を選択できるのは、CMEK 対応データベースを作成するときのみです。

コンソール

  1. Google Cloud コンソールで [データベース] ページに移動します。

    [データベース] ページに移動

  2. [データベースを作成] をクリックします。

  3. データベース モードを選択します。[続行] をクリックします。

  4. [データベースを構成する] ページで、データベース ID を入力します。

  5. ロケーションを選択します。

  6. [暗号化オプションを表示] をクリックし、[Cloud KMS 鍵] を選択します。

  7. データベースに使用する CMEK 鍵のリソース名を選択または入力します。

  8. 鍵のリストは、現在の Google Cloud プロジェクトと選択したデータベースの場所に限定されます。別の Google Cloud プロジェクトの鍵を使用するには、[プロジェクトを切り替え] または [鍵を手動で入力] をクリックします。

  9. Firestore サービス アカウントに鍵の権限を付与するように求められたら、[付与] をクリックします。CMEK データベースを作成するには、Firestore サービス アカウントに cloudkms.cryptoKeyEncrypterDecrypter ロールを付与する必要があります。

  10. モバイル クライアントとウェブ クライアントのセキュリティ ルールを選択します。

  11. [データベースを作成] をクリックします。

データベースが作成されたら、[データベースの詳細] を表示して、データベースが CMEK 対応であることを確認できます。

  • データベースが CMEK で保護されている場合、[Encryption type] フィールドには [Customer-managed] と表示され、[Encryption key] フィールドには、このデータベースの保護に使用される対応する Cloud KMS と鍵のバージョンが一覧表示されます。
  • データベースが CMEK で保護されていない場合、[暗号化の種類] フィールドに [Google 管理] と表示されます。

gcloud

Google Cloud CLI で CMEK 対応データベースを作成する前に、最新バージョンをインストールして gcloud CLI を承認します。詳細については、gcloud CLI をインストールするをご覧ください。

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

次のように置き換えます。

  • FIRESTORE_DATABASE_LOCATION は、データベースの Firestore のロケーションに置き換えます。
  • DATABASE_ID は、データベースの ID に置き換えます。
  • KMS_KEY_NAME は、鍵に割り当てた名前に置き換えます。鍵の完全なリソース名を次の形式で使用します。

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。

REST API

HTTP リクエスト:

POST https://firestore.googleapis.com/v1/projects/{FIRESOTRE_PROJECT}/databases

リクエストの本文で cmek_config.kms_key_name フィールドに CMEK を構成します。

Cloud KMS 鍵の完全なリソース ID に設定します。このデータベースと同じロケーションにある鍵のみが使用できます。

この値は、projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} の形式で Cloud KMS 鍵のリソース ID にする必要があります。

その他のフィールドの詳細については、database create ページをご覧ください。

リクエストの例:

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

CMEK 対応データベースを作成するには、[KMS Key Name] フィールドを使用します。--kms-key-name パラメータを指定しない場合、Firestore はデフォルトで CMEK 以外のデータベースを作成します。

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

次のように置き換えます。

  • DATABASE_ID はデータベースの ID に置き換えます。
  • LOCATION はデータベースのロケーションに置き換えます。
  • KMS_PROJECT は、CMEK 鍵を含むプロジェクトに置き換えます。
  • KMS_LOCATION は、CMEK 鍵とキーリングを含むロケーションに置き換えます。
  • KMS_KEYRING_ID は、CMEK キーリングの ID に置き換えます。
  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。

Firebase CLI で Firestore データベースが保護されていることを確認します。

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

レスポンス メッセージに次の CMEK 情報が表示されます。

  • [KMS 鍵名] フィールドには、Firestore CMEK データベースの暗号化に使用される鍵リソース名全体を指定します。
  • [アクティブな鍵バージョン] フィールドには、この CMEK データベースで現在使用されているすべての鍵バージョンのリストが表示されます。鍵のローテーション中、複数のアクティブな鍵バージョンを設定できます。

Terraform

CMEK 有効化データベースを作成するには、google_firestore_database リソースを使用します。詳細と例については、google_firestore_database をご覧ください。

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

次のように置き換えます。

  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。
  • DATABASE_ID は、データベースの ID に置き換えます。
  • FIRESTORE_DATABASE_LOCATION は、データベースの Firestore のロケーションに置き換えます。
  • DATABASE_TYPE は、ネイティブ モードの場合は FIRESTORE_NATIVE、Datastore モードの場合は DATASTORE_MODE に置き換えます。
  • KMS_KEY_NAME は、鍵に割り当てた名前に置き換えます。鍵の完全なリソース名を次の形式で使用します。

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK で保護されているデータベースにアクセスする

CMEK で保護されたデータベースに送信されるすべての読み取り、書き込み、クエリのオペレーションは、Google のデフォルトの暗号化されたデータベースと同じように機能するべきです。たとえば、リクエストごとにキーを指定する必要はありません。

CMEK で保護されたデータベースを復元する

CMEK で保護されたデータベースをバックアップから復元する前に、次の操作を行います。

  • データベースを CMEK 暗号化、Google のデフォルトの暗号化(CMEK 以外)、またはバックアップと同じ暗号化に復元するかどうかを決定します。
  • バックアップの暗号化に使用した鍵(primary-version)と鍵バージョンを準備します。鍵と鍵バージョンの両方を有効にします。

gcloud

CMEK で保護されたデータベースを CMEK 暗号化に復元する

CMEK 暗号化に復元するには、オプションの encryption-type フラグと kms-key-name フラグを指定して gcloud firestore databases restore コマンドを実行し、復元されたデータベースの暗号化タイプを構成します。暗号化タイプを指定しない場合、復元されたデータベースはバックアップと同じ暗号化構成を使用します。

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

KMS_KEY_NAME は、鍵に割り当てた名前に置き換えます。鍵の完全なリソース名を次の形式で使用します。

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK で保護されたデータベースをデフォルトの暗号化に復元する

Google のデフォルトの暗号化(CMEK 以外)に戻すには、次のように encryption-type フラグを設定します。

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

CMEK で保護されたデータベースをバックアップと同じ暗号化タイプに復元する

バックアップと同じ暗号化タイプに復元するには、次のように encryption-type フラグを設定します。

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

CMEK で保護されたデータベースを CMEK 暗号化に復元する

CMEK 暗号化に復元するには、オプションの encryption-type フラグと kms-key-name フラグを使用します。暗号化タイプを指定しない場合、復元されたデータベースはバックアップと同じ暗号化構成を使用します。

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

次のように置き換えます。

  • DATABASE_ID はデータベースの ID に置き換えます。
  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。
  • FIRESTORE_LOCATION は、Firestore データベースのロケーションに置き換えます。
  • BACKUP_ID は、バックアップの ID に置き換えます。
  • KMS_PROJECT は、CMEK 鍵を含むプロジェクトに置き換えます。
  • KMS_LOCATION は、CMEK 鍵とキーリングを含むロケーションに置き換えます。
  • KMS_KEYRING_ID は、CMEK キーリングの ID に置き換えます。

復元された Firestore データベースが CMEK で暗号化されていることを確認します。

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

CMEK で保護されたデータベースをデフォルトの暗号化に復元する

Google のデフォルトの暗号化(CMEK 以外)に戻すには、次のように encryption-type フラグを設定します。

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

次のように置き換えます。

  • DATABASE_ID はデータベースの ID に置き換えます。
  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。
  • FIRESTORE_LOCATION は、Firestore データベースのロケーションに置き換えます。
  • BACKUP_ID は、バックアップの ID に置き換えます。

CMEK で保護されたデータベースをバックアップと同じ暗号化タイプに復元する

バックアップと同じ暗号化タイプに復元するには、次のように encryption-type フラグを設定します。

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

次のように置き換えます。

  • DATABASE_ID はデータベースの ID に置き換えます。
  • FIRESTORE_PROJECT は、Firestore データベースに使用するプロジェクトに置き換えます。
  • FIRESTORE_LOCATION は、Firestore データベースのロケーションに置き換えます。
  • BACKUP_ID は、バックアップの ID に置き換えます。

使用中の鍵を表示する

gcloud

databases describe gcloud CLI コマンドを使用して、データベースの CMEK 構成を確認できます。

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

レスポンスの cmekConfig フィールドに CMEK の情報が次のように表示されます。

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

レスポンスには次の情報が含まれます。

  • kmsKeyName: CMEK で保護されたデータベースの暗号化に使用される鍵の完全なリソース名。
  • activeKeyVersion: CMEK で保護されたデータベースで現在使用中のすべての鍵バージョンのリスト。鍵のローテーション中、複数のアクティブな鍵バージョンを設定できます。鍵のローテーション中は、古い鍵バージョンと新しい鍵バージョンの両方が使用可能である必要があります。activeKeyVersion フィールドに古い鍵バージョンが表示されなくなるまで、古い鍵バージョンを無効にしないでください。

REST API

HTTP リクエスト:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

リクエストの本文で cmek_config.kms_key_name フィールドに CMEK を構成します。Cloud KMS 鍵の完全なリソース ID に設定します。このデータベースと同じロケーションにある鍵のみが使用できます。

この値は、projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} の形式で Cloud KMS 鍵のリソース ID にする必要があります。

その他のフィールドの詳細については、database create ページをご覧ください。

リクエストとレスポンスの例

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

----------------------------------------- Response --------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  ……
}

鍵を無効にする

データベースに関連付けられた鍵を無効にするには、次の手順を完了します。

  1. データベースで使用中の鍵バージョンを表示する
  2. これらの鍵バージョンを無効にする
  3. 変更が有効になるまで待ってから、データにもうアクセスできないかを確認します。通常は数分で変更内容が反映されますが、最長で 3 時間ほどかかることもあります。

データベースで使用される鍵が無効な場合、FAILED_PRECONDITION 例外とエラー メッセージの詳細が受信されることが想定されます。次に例を示します。

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

鍵を有効にする

データベースに関連付けられた鍵を再度有効にするには、次の手順を完了します。

  1. データベースで使用中の鍵バージョンを表示する
  2. これらの鍵バージョンを有効にする
  3. 変更が有効になるまで待ってから、データにもうアクセスできないかを確認します。通常は数分で変更内容が反映されますが、最長で 3 時間ほどかかることもあります。

Cloud KMS 鍵の監査ログを表示する

Cloud KMS データアクセス監査ログを有効にする前に、Cloud Audit Logs について理解しておく必要があります。

Cloud KMS データアクセス監査ログでは、Firestore または CMEK 鍵を使用するように構成されている他のプロダクトが Cloud KMS に暗号化 / 復号呼び出しを行った日時を確認できます。Firestore は、すべてのデータ リクエストに対して暗号化 / 復号呼び出しを実行するのではなく、鍵を定期的に確認するポーラーを維持します。ポーリングの結果は監査ログに表示されます。

監査ログは Google Cloud コンソールで設定と操作ができます。

  1. プロジェクト内の Cloud KMS API でロギングが有効になっていることを確認します。

  2. Google Cloud コンソールで Cloud Logging に移動します。

    Cloud Logging に移動

  3. クエリビルダーに次の行を追加して、ログエントリを Cloud KMS 鍵に限定します。

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    次のように置き換えます。

    • KMS_KEY は、CMEK 鍵の名前に置き換えます。
    • KMS_KEYRING は、鍵を含む KMS キーリングに置き換えます。
    • KMS_LOCATION: 鍵とキーリングのロケーション

    このログには、データベースごとに約 5 分間隔でログエントリが記録されます。ログエントリは次のようになります。

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "[email protected]"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "[email protected]"
    

監査ログの解釈方法については、監査ログについてをご覧ください。

CMEK の組織のポリシーを構成する

組織内の Firestore データベースの暗号化コンプライアンス要件を指定するには、CMEK 組織ポリシー制約を使用します。

CMEK 保護を要求する

Firestore データベースの作成に CMEK を要求するように constraints/gcp.restrictNonCmekServices を構成します。制約を deny に設定し、firestore.googleapis.com を拒否リストに追加します。次に例を示します。

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

FIRESTORE_PROJECT は、制限するプロジェクトに置き換えます。

組織のポリシーの構成の詳細については、ポリシーの作成と編集をご覧ください。

ポリシーが有効になった後、影響を受けるプロジェクトで CMEK 以外のデータベースを作成しようとすると、FAILED_PRECONDITION 例外とエラー メッセージを受信します。たとえば、例外は次のようになります。

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

CMEK の鍵の使用を制限する

CMEK の保護に使用される Cloud KMS 鍵がどれかを制限するには、constraints/gcp.restrictCmekCryptoKeyProjects 制約を構成します。

リスト型制約として許容される値は、リソース階層インジケーター(projects/PROJECT_IDunder:folders/FOLDER_IDunder:organizations/ORGANIZATION_ID など)です。この制約を使用するには、リソース階層インジケーターのリストを構成し、制約を [許可] に設定します。この構成では、CMEK 鍵が、リストされたプロジェクト、フォルダ、組織からのみ選択できるように、サポート対象サービスが制限されます。構成されたサービスで CMEK で保護されたリソースを作成するリクエストは、許可されたリソースのいずれかからの Firestore 鍵がないと成功しません。

次の例では、指定されたプロジェクト内の CMEK で保護されたデータベースの ALLOWED_KEY_PROJECT_ID の鍵のみを許可します。

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

ポリシーが有効になった後、制約に違反すると、FAILED_PRECONDITION 例外とエラー メッセージを受信します。例外は次のようになります。

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

次のステップ