このページでは、Datastore モードの Firestore の顧客管理の暗号鍵(CMEK)に関連するタスクの実行方法について説明します。CMEK の一般的な用途や使用する理由などの詳細については、Cloud KMS のドキュメントをご覧ください。
CMEK 鍵を準備する
CMEK で保護された Datastore モードのデータベースを作成する前に、次の手順を完了する必要があります。
- Datastore モードの CMEK 機能へのアクセスをリクエストする。
- Datastore モードのサービス エージェントを作成(または取得)する。
- CMEK 鍵を作成する。
- その鍵の IAM 設定を構成する。
CMEK で保護された Firestore データベースを含むプロジェクトごとに、次の手順を完了します。後で新しい CMEK 鍵を作成する場合は、その鍵の IAM 設定を構成する必要があります。
アクセスをリクエスト
Datastore モードのサービス エージェントを作成する前に、こちらのフォームに入力して CMEK 機能へのアクセスをリクエストしてください。
Datastore モードのサービス エージェントを作成する
CMEK 鍵を作成する前に、Datastore モードのサービス エージェントが必要です。このアカウントは、Datastore モードが鍵へのアクセスに使用する Google マネージド サービス アカウントの一種です。
サービス アカウント作成コマンドを実行して、Datastore モードがお客様の代わりに CMEK 鍵にアクセスする際に使用するサービス エージェントを作成します。サービス アカウントが存在しない場合、このコマンドはサービス アカウントを作成して表示します。
gcloud beta services identity create \ --service=firestore.googleapis.com \ --project FIRESTORE_PROJECT
FIRESTORE_PROJECT
は、Datastore モードのデータベースに使用する予定のプロジェクトに置き換えます。
このコマンドは、メールアドレスに似た形式のサービス エージェント ID を表示します。後のステップで使用するため、出力メール文字列を記録します。
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
キーを作成
Cloud KMS で直接作成された鍵または Cloud External Key Manager で利用できる外部管理鍵を使用できます。
Cloud KMS の鍵のロケーションは、使用する Datastore モード データベースのロケーションと同じにする必要があります。
リージョン データベースのロケーションには、ロケーション名には 1 対 1 のマッピングがあるため、キーリング、鍵、データベースに同じロケーション名を使用します。
たとえば、CMEK で保護されたデータベースを
us-west1
に作成する場合は、us-west1
にキーリングと鍵を作成します。マルチリージョン データベース ロケーションには、KMS マルチリージョン ロケーションのロケーション名を使用します。
- Datastore モードの
nam5
マルチリージョン ロケーションには、Cloud KMSus
マルチリージョン ロケーションを使用します。 - Datastore モードの
eur3
マルチリージョン ロケーションには、Cloud KMSeurope
マルチリージョン ロケーションを使用します。
- Datastore モードの
鍵を管理する Google Cloud プロジェクトで、以下を完了します。
次のいずれかのオプションを使用してキーリングと鍵を作成します。
- Cloud KMS でキーリングと鍵を直接作成する。
- 外部管理の鍵を使用する。外部鍵を作成してから Cloud EKM 鍵を作成し、その鍵を Cloud KMS で使用できるようにします。
鍵の IAM 設定を構成する
Console
Cloud KMS のロールをサービス エージェントに付与するには、次の手順を行います。詳細レベルでの設定が必要な場合は、鍵レベルまたは鍵リングレベルで権限を付与することもできます。
Google Cloud コンソールの [IAM] ページに移動します。
[追加] をクリックします。
Datastore モードのサービス エージェントのメール ID を入力します。
[Cloud KMS 暗号鍵の暗号化 / 復号] ロールを選択します。
[保存] をクリックします。
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 のデフォルトの暗号化によって保護されている既存の Datastore モード データベースは、CMEK を使用するように変換できません。
暗号化の種類と鍵は、CMEK 対応データベースを作成するときにのみ選択できます。
コンソール
Google Cloud コンソールで [データベース] ページに移動します。
[データベースを作成] をクリックします。
データベース モードを選択します。[続行] をクリックします。
[データベースを構成する] ページで、データベース ID を入力します。
ロケーションを選択します。
[暗号化オプションを表示する] をクリックし、[Cloud KMS 鍵] を選択します。
データベースに使用する CMEK 鍵のリソース名を選択または入力します。
鍵のリストは、現在の Google Cloud プロジェクトと選択したデータベースの場所に限定されます。別の Google Cloud プロジェクトの鍵を使用するには、[プロジェクトを切り替え] または [鍵を手動で入力] をクリックします。
Datastore モードのサービス アカウントに鍵の権限を付与するよう求められたら、[付与] をクリックします。CMEK データベースを作成するには、Datastore モードのサービス アカウントに
cloudkms.cryptoKeyEncrypterDecrypter
ロールを付与する必要があります。モバイル クライアントとウェブ クライアントのセキュリティ ルールを選択します。
[データベースを作成] をクリックします。
データベースが作成されたら、[データベースの詳細] を表示して、データベースが 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
は、データベースの Datastore モードのロケーションに置き換えます。DATABASE_ID
は、データベースの ID に置き換えます。KMS_KEY_NAME
は、鍵に割り当てた名前に置き換えます。鍵の完全なリソース名を次の形式で使用します。projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECT
は、Datastore モード データベースに使用するプロジェクトに置き換えます。
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
パラメータを指定しない場合、Datastore モードではデフォルトで 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
は、Datastore モード データベースに使用するプロジェクトに置き換えます。
Datastore モードのデータベースが Firebase CLI で保護されていることを確認します。
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
レスポンス メッセージに次の 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
は、Datastore モード データベースに使用するプロジェクトに置き換えます。DATABASE_ID
は、データベースの ID に置き換えます。FIRESTORE_DATABASE_LOCATION
は、データベースの Datastore モードのロケーションに置き換えます。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
は、Datastore モード データベースに使用するプロジェクトに置き換えます。FIRESTORE_LOCATION
は、Datastore モード データベースのロケーションに置き換えます。BACKUP_ID
は、バックアップの ID に置き換えます。KMS_PROJECT
は、CMEK 鍵を含むプロジェクトに置き換えます。KMS_LOCATION
は、CMEK 鍵とキーリングを含むロケーションに置き換えます。KMS_KEYRING_ID
は、CMEK キーリングの ID に置き換えます。
復元された Datastore モードのデータベースが 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
は、Datastore モード データベースに使用するプロジェクトに置き換えます。FIRESTORE_LOCATION
は、Datastore モード データベースのロケーションに置き換えます。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
は、Datastore モード データベースに使用するプロジェクトに置き換えます。FIRESTORE_LOCATION
は、Datastore モード データベースのロケーションに置き換えます。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
レスポンスには次の情報が含まれます。
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"
]
},
……
}
鍵を無効にする
データベースに関連付けられた鍵を無効にするには、次の手順を完了します。
- データベースで使用中の鍵バージョンを表示する
- これらの鍵バージョンを無効にする
- 変更が有効になるまで待ってから、データにもうアクセスできないかを確認します。通常は数分で変更内容が反映されますが、最長で 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)" } ] } }
鍵を有効にする
データベースに関連付けられた鍵を再度有効にするには、次の手順を完了します。
- データベースで使用中の鍵バージョンを表示する
- これらの鍵バージョンを有効にする
- 変更が有効になるまで待ってから、データにもうアクセスできないかを確認します。通常は数分で変更内容が反映されますが、最長で 3 時間ほどかかることもあります。
Cloud KMS 鍵の監査ログを表示する
Cloud KMS データアクセス監査ログを有効にする前に、Cloud Audit Logs について理解しておく必要があります。
Cloud KMS データアクセス監査ログでは、Datastore モードまたは CMEK 鍵を使用するように構成されている他のプロダクトが Cloud KMS に暗号化 / 復号呼び出しを行った日時を確認できます。Datastore モードは、すべてのデータ リクエストに対して暗号化 / 復号呼び出しを実行するのではなく、鍵を定期的に確認するポーラーを維持します。ポーリングの結果は監査ログに表示されます。
監査ログは Google Cloud コンソールで設定と操作ができます。
プロジェクト内の Cloud KMS API でロギングが有効になっていることを確認します。
Google Cloud コンソールで Cloud Logging に移動します。
クエリビルダーに次の行を追加して、ログエントリを 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: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com" 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: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
監査ログの解釈方法については、監査ログについてをご覧ください。
CMEK の組織のポリシーを構成する
組織内の Datastore モード データベースの暗号化コンプライアンス要件を指定するには、CMEK 組織ポリシー制約を使用します。
CMEK 保護を要求する
Datastore モードのデータベースの作成に 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_ID
、under:folders/FOLDER_ID
、under:organizations/ORGANIZATION_ID
など)です。この制約を使用するには、リソース階層インジケーターのリストを構成し、制約を [許可] に設定します。この構成では、CMEK 鍵が、リストされたプロジェクト、フォルダ、組織からのみ選択できるように、サポート対象サービスが制限されます。構成されたサービスで CMEK で保護されたリソースを作成するリクエストは、許可されたリソースのいずれかからの Datastore モード鍵がないと成功しません。
次の例では、指定されたプロジェクト内の 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." } ] } ] } }