Menggunakan kunci enkripsi yang dikelola pelanggan (CMEK)

Halaman ini menjelaskan cara melakukan tugas terkait kunci enkripsi yang dikelola pelanggan (CMEK) untuk Firestore. Untuk mengetahui informasi selengkapnya tentang CMEK secara umum, termasuk waktu dan alasan mengaktifkannya, lihat dokumentasi Cloud KMS.

Menyiapkan kunci CMEK

Sebelum dapat membuat database Firestore yang dilindungi CMEK, Anda harus menyelesaikan langkah-langkah berikut:

  1. Meminta akses ke fitur CMEK Firestore.
  2. Buat (atau ambil) agen layanan Firestore.
  3. Buat kunci CMEK.
  4. Konfigurasikan setelan IAM untuk kunci tersebut.

Selesaikan langkah-langkah ini untuk setiap project yang akan berisi database Firestore yang dilindungi CMEK. Jika nanti Anda membuat kunci CMEK baru, Anda harus mengonfigurasi setelan IAM untuk kunci tersebut.

Minta akses

Sebelum membuat agen layanan Firestore, minta akses ke fitur CMK dengan mengisi formulir ini.

Membuat agen layanan Firestore

Sebelum membuat kunci CMEK, Anda harus memiliki agen layanan Firestore, yang merupakan jenis akun layanan yang dikelola Google yang digunakan Firestore untuk mengakses kunci.

Jalankan perintah services identity create untuk membuat agen layanan yang digunakan Firestore untuk mengakses kunci CMEK atas nama Anda. Perintah ini akan membuat akun layanan jika belum ada, lalu menampilkannya.

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

Ganti FIRESTORE_PROJECT dengan project yang ingin Anda gunakan untuk database Firestore.

Perintah ini akan menampilkan ID agen layanan, yang diformat seperti alamat email. Catat string email output, karena Anda akan menggunakannya di langkah berikutnya.

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

Buat kunci

Anda dapat menggunakan kunci yang dibuat langsung di Cloud KMS atau kunci yang dikelola secara eksternal yang Anda sediakan dengan Cloud External Key Manager.

Lokasi kunci Cloud KMS harus sama dengan lokasi database Firestore yang akan digunakan.

  • Untuk lokasi database regional, gunakan nama lokasi yang sama untuk key ring, kunci, dan database karena nama lokasi memiliki pemetaan satu-ke-satu.

    Misalnya, jika Anda ingin membuat database yang dilindungi CMEK di us-west1, buat key ring dan kunci di us-west1.

  • Untuk lokasi database multi-region, gunakan nama lokasi lokasi multi-region KMS:

    • Gunakan lokasi multi-region us Cloud KMS untuk lokasi multi-region nam5 Firestore.
    • Gunakan lokasi multi-region europe Cloud KMS untuk lokasi multi-region eur3 Firestore.

Di project Google Cloud tempat Anda ingin mengelola kunci, selesaikan langkah-langkah berikut:

  1. Aktifkan Cloud KMS API.

  2. Buat key ring dan kunci menggunakan salah satu opsi berikut:

Mengonfigurasi setelan IAM untuk kunci

Konsol

Untuk memberikan peran Cloud KMS ke agen layanan Anda, lakukan hal berikut: Anda juga dapat memberikan izin di tingkat kunci atau ring kunci jika menginginkan tingkat perincian yang lebih rendah.

  1. Di konsol Google Cloud, buka halaman IAM.

    Buka halaman IAM

  2. Klik Tambahkan.

  3. Masukkan ID berformat email untuk agen layanan Firestore Anda.

  4. Pilih peran Cloud KMS CryptoKey Encrypter/Decrypter.

  5. Klik Simpan.

gcloud

Berikan peran cloudkms.cryptoKeyEncrypterDecrypter ke agen layanan Anda:

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

Ganti kode berikut:

  • KMS_KEY dengan nama yang Anda tetapkan ke kunci
  • KMS_KEYRING dengan key ring KMS yang berisi kunci
  • KMS_LOCATION dengan region yang berisi key ring
  • SERVICE_AGENT_EMAIL dengan ID berformat email untuk agen layanan yang Anda beri akses
  • KMS_PROJECT dengan project yang berisi kunci

Terminal akan menampilkan respons yang mirip dengan berikut:

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

Membuat database yang mendukung CMEK

Setelah kunci CMEK dibuat dan dikonfigurasi, Anda dapat membuat database yang dilindungi CMEK. Database Firestore yang ada dan dilindungi oleh enkripsi default Google tidak dapat dikonversi untuk menggunakan CMEK.

Anda dapat memilih jenis dan kunci enkripsi hanya saat membuat database yang mengaktifkan CMEK.

Konsol

  1. Di konsol Google Cloud, buka halaman Databases.

    Buka halaman Databases

  2. Klik Create database.

  3. Pilih mode database Anda. Klik Lanjutkan.

  4. Di halaman Konfigurasi database, masukkan ID database.

  5. Pilih lokasi.

  6. Klik Show Encryption Options, lalu pilih Cloud KMS key.

  7. Pilih atau masukkan nama resource untuk kunci CMEK yang ingin Anda gunakan untuk database.

  8. Daftar kunci dibatasi untuk project Google Cloud saat ini dan lokasi database yang Anda pilih. Untuk menggunakan kunci dari project Google Cloud yang berbeda, klik Switch Project atau Enter Key Manually.

  9. Jika Anda diminta untuk memberikan izin kunci ke akun layanan Firestore, klik Berikan. Untuk membuat database CMEK, akun layanan Firestore Anda harus diberi peran cloudkms.cryptoKeyEncrypterDecrypter.

  10. Pilih aturan keamanan untuk klien seluler dan web.

  11. Klik Create database.

Setelah database dibuat, Anda dapat memverifikasi bahwa database tersebut mengaktifkan CMEK dengan melihat Detail database:

  • Jika database Anda dilindungi oleh CMEK, kolom Jenis enkripsi akan ditampilkan sebagai Dikelola pelanggan dan kolom Kunci enkripsi akan mencantumkan Cloud KMS yang sesuai dan versi kunci yang digunakan untuk melindungi database ini.
  • Jika database Anda tidak dilindungi oleh CMEK, kolom Encryption type akan ditampilkan sebagai Google-managed.

gcloud

Sebelum membuat database yang mengaktifkan CMEK dengan Google Cloud CLI, instal versi terbaru dan izinkan gcloud CLI. Untuk mengetahui informasi selengkapnya, lihat Menginstal gcloud CLI.

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

Ganti kode berikut:

  • FIRESTORE_DATABASE_LOCATION dengan lokasi Firestore untuk database
  • DATABASE_ID dengan ID untuk database
  • KMS_KEY_NAME dengan nama yang Anda tetapkan ke kunci. Gunakan nama resource lengkap untuk kunci dalam format berikut:

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

  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda

REST API

Permintaan HTTP:

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

Di isi permintaan, konfigurasikan CMEK di kolom cmek_config.kms_key_name.

Tetapkan ke ID resource lengkap kunci Cloud KMS. Hanya kunci di lokasi yang sama dengan database ini yang diizinkan.

Nilai ini harus berupa ID resource kunci Cloud KMS dalam format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Untuk mengetahui detail selengkapnya tentang kolom lain, lihat halaman database create.

Contoh permintaan:

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

Untuk membuat database yang mengaktifkan CMEK, gunakan kolom KMS Key Name. Jika Anda tidak menentukan parameter --kms-key-name, Firestore akan membuat database non-CMEK secara default.

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

Ganti kode berikut:

  • DATABASE_ID dengan ID database Anda
  • LOCATION dengan lokasi database Anda
  • KMS_PROJECT dengan project yang berisi kunci CMEK Anda
  • KMS_LOCATION dengan lokasi yang berisi kunci dan key ring CMEK Anda
  • KMS_KEYRING_ID dengan ID key ring CMEK Anda
  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda

Pastikan database Firestore Anda dilindungi dengan Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Informasi CMEK berikut akan muncul dalam pesan respons:

  • Kolom KMS Key Name memberikan nama resource kunci lengkap yang digunakan untuk mengenkripsi database CMEK Firestore Anda.
  • Kolom Active Key Versions memberikan daftar semua versi kunci yang saat ini digunakan oleh database CMEK ini. Selama rotasi kunci, Anda dapat memiliki beberapa versi kunci aktif.

Terraform

Untuk membuat database yang mendukung CMEK, gunakan resource google_firestore_database. Untuk informasi dan contoh selengkapnya, lihat 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"
  }

}

Ganti kode berikut:

  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda
  • DATABASE_ID dengan ID untuk database
  • FIRESTORE_DATABASE_LOCATION dengan lokasi Firestore untuk database
  • DATABASE_TYPE dengan FIRESTORE_NATIVE untuk mode Native atau DATASTORE_MODE untuk mode Datastore.
  • KMS_KEY_NAME dengan nama yang Anda tetapkan ke kunci. Gunakan nama resource lengkap untuk kunci dalam format:

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

Mengakses database yang dilindungi CMEK

Semua operasi baca, tulis, dan kueri yang dikirim ke database yang dilindungi CMEK harus berfungsi sama seperti database terenkripsi default Google. Misalnya, Anda tidak perlu memberikan kunci untuk setiap permintaan.

Memulihkan database yang dilindungi CMEK

Sebelum memulihkan database yang dilindungi CMEK dari cadangan:

  • Tentukan apakah Anda ingin memulihkan database ke enkripsi CMEK, ke enkripsi default Google (non-CMEK), atau ke enkripsi yang sama dengan cadangan.
  • Siapkan kunci (primary-version) dan versi kunci yang Anda gunakan untuk mengenkripsi cadangan. Aktifkan kunci dan versi kunci.

gcloud

Memulihkan database yang dilindungi CMEK ke enkripsi CMEK

Untuk memulihkan ke enkripsi CMEK, jalankan perintah gcloud firestore databases restore dengan flag encryption-type dan kms-key-name opsional untuk mengonfigurasi jenis enkripsi untuk database yang dipulihkan. Jika Anda tidak menentukan jenis enkripsi, database yang dipulihkan akan menggunakan konfigurasi enkripsi yang sama dengan cadangan.

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

Ganti KMS_KEY_NAME dengan nama yang Anda tetapkan ke kunci. Gunakan nama resource lengkap untuk kunci dalam format berikut:

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

Memulihkan database yang dilindungi CMEK ke enkripsi default

Untuk memulihkan ke enkripsi default Google (non-CMEK), tetapkan tanda encryption-type dengan cara berikut:

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

Memulihkan database yang dilindungi CMEK ke jenis enkripsi yang sama dengan cadangan

Untuk memulihkan ke jenis enkripsi yang sama dengan cadangan, tetapkan tanda encryption-type dengan cara berikut:

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

Firebase CLI

Memulihkan database yang dilindungi CMEK ke enkripsi CMEK

Untuk memulihkan ke enkripsi CMEK, gunakan flag encryption-type dan kms-key-name opsional. Jika Anda tidak menentukan jenis enkripsi, database yang dipulihkan akan menggunakan konfigurasi enkripsi yang sama dengan cadangan.

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

Ganti kode berikut:

  • DATABASE_ID dengan ID database Anda
  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda
  • FIRESTORE_LOCATION dengan lokasi database Firestore Anda
  • BACKUP_ID dengan ID cadangan Anda
  • KMS_PROJECT dengan project yang berisi kunci CMEK Anda
  • KMS_LOCATION dengan lokasi yang berisi kunci dan key ring CMEK Anda
  • KMS_KEYRING_ID dengan ID key ring CMEK Anda

Pastikan database Firestore yang dipulihkan dienkripsi dengan CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Memulihkan database yang dilindungi CMEK ke enkripsi default

Untuk memulihkan ke enkripsi default Google (non-CMEK), tetapkan tanda encryption-type dengan cara berikut:

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

Ganti kode berikut:

  • DATABASE_ID dengan ID database Anda
  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda
  • FIRESTORE_LOCATION dengan lokasi database Firestore Anda
  • BACKUP_ID dengan ID cadangan Anda

Memulihkan database yang dilindungi CMEK ke jenis enkripsi yang sama dengan cadangan

Untuk memulihkan ke jenis enkripsi yang sama dengan cadangan, tetapkan tanda encryption-type dengan cara berikut:

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

Ganti kode berikut:

  • DATABASE_ID dengan ID database Anda
  • FIRESTORE_PROJECT dengan project yang akan digunakan untuk database Firestore Anda
  • FIRESTORE_LOCATION dengan lokasi database Firestore Anda
  • BACKUP_ID dengan ID cadangan Anda

Melihat kunci yang digunakan

gcloud

Anda dapat menggunakan perintah gcloud CLI databases describe untuk mengonfirmasi konfigurasi CMEK database:

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

Anda akan melihat informasi CMEK di kolom cmekConfig dalam respons yang mirip dengan berikut:

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

Responsnya mencakup informasi berikut:

  • kmsKeyName: nama resource kunci lengkap dari kunci yang digunakan untuk mengenkripsi database yang dilindungi CMEK.
  • activeKeyVersion: daftar semua versi kunci yang saat ini digunakan oleh database yang dilindungi CMEK. Selama rotasi kunci, Anda dapat memiliki beberapa versi kunci aktif. Versi kunci lama dan versi kunci baru harus tersedia selama rotasi kunci. Jangan nonaktifkan versi kunci lama hingga tidak muncul lagi di kolom activeKeyVersion.

REST API

Permintaan HTTP:

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

Di isi permintaan, konfigurasikan CMEK di kolom cmek_config.kms_key_name. Tetapkan ke ID resource lengkap kunci Cloud KMS. Hanya kunci di lokasi yang sama dengan database ini yang diizinkan.

Nilai ini harus berupa ID resource kunci Cloud KMS dalam format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Untuk mengetahui detail selengkapnya tentang kolom lain, lihat halaman database create.

Contoh permintaan dan respons:

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"
    ]
  },
  ……
}

Menonaktifkan kunci

Untuk menonaktifkan kunci yang terkait dengan database, selesaikan langkah-langkah berikut:

  1. Melihat versi kunci yang digunakan untuk database
  2. Nonaktifkan versi kunci tersebut
  3. Tunggu hingga perubahan diterapkan dan periksa apakah data tidak lagi dapat diakses. Perubahan biasanya diterapkan dalam beberapa menit, tetapi dapat memerlukan waktu hingga 3 jam.

Jika kunci yang digunakan oleh database dinonaktifkan, Anda akan menerima pengecualian FAILED_PRECONDITION dengan detail tambahan dalam pesan error, misalnya:

{
  "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)"
      }
    ]
  }
}

Mengaktifkan kunci

Untuk mengaktifkan kembali kunci yang terkait dengan database, selesaikan langkah-langkah berikut:

  1. Melihat versi kunci yang digunakan untuk database
  2. Aktifkan versi kunci tersebut
  3. Tunggu hingga perubahan diterapkan dan periksa apakah data tidak lagi dapat diakses. Perubahan biasanya diterapkan dalam beberapa menit, tetapi dapat memerlukan waktu hingga 3 jam.

Melihat log audit untuk kunci Cloud KMS

Sebelum mengaktifkan log audit Akses Data Cloud KMS, Anda harus memahami Cloud Audit Logs.

Log audit Akses Data Cloud KMS menunjukkan kepada Anda saat Firestore atau produk lain yang dikonfigurasi untuk menggunakan kunci CMEK Anda melakukan panggilan enkripsi/dekripsi ke Cloud KMS. Firestore tidak mengeluarkan panggilan enkripsi/dekripsi pada setiap permintaan data, tetapi mempertahankan poller yang memeriksa kunci secara berkala. Hasil polling akan muncul di log audit.

Anda dapat menyiapkan dan berinteraksi dengan log audit di konsol Google Cloud:

  1. Pastikan logging diaktifkan untuk Cloud KMS API di project Anda.

  2. Buka Cloud Logging di konsol Google Cloud.

    Buka Cloud Logging

  3. Batasi entri log ke kunci Cloud KMS Anda dengan menambahkan baris berikut ke Builder kueri:

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

    Ganti kode berikut:

    • KMS_KEY dengan nama kunci CMEK
    • KMS_KEYRING dengan key ring KMS yang berisi kunci
    • KMS_LOCATION dengan lokasi kunci dan key ring

    Log menampilkan beberapa entri log sekitar setiap lima menit per database. Entri log terlihat mirip dengan contoh berikut:

    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"
    

Lihat Memahami log audit untuk mengetahui detail tentang cara menafsirkan log audit.

Mengonfigurasi kebijakan organisasi CMEK

Untuk menentukan persyaratan kepatuhan enkripsi untuk database Firestore di organisasi Anda, gunakan batasan kebijakan organisasi CMEK.

Mewajibkan perlindungan CMEK

Konfigurasikan constraints/gcp.restrictNonCmekServices untuk mewajibkan CMEK untuk pembuatan database Firestore. Tetapkan batasan ke deny dan tambahkan firestore.googleapis.com ke daftar tolak, misalnya:

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

Ganti FIRESTORE_PROJECT dengan project yang akan dibatasi.

Untuk mempelajari lebih lanjut cara mengonfigurasi kebijakan organisasi, lihat Membuat dan mengedit kebijakan.

Setelah kebijakan diterapkan, Anda akan menerima pengecualian FAILED_PRECONDITION dan pesan error jika mencoba membuat database non-CMEK dalam project yang terpengaruh. Misalnya, pengecualian terlihat seperti:

{
  "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."
          }
        ]

Membatasi penggunaan kunci untuk CMEK

Untuk membatasi kunci Cloud KMS yang digunakan untuk perlindungan CMEK, konfigurasikan batasan constraints/gcp.restrictCmekCryptoKeyProjects.

Sebagai batasan daftar, nilai yang diterima adalah indikator hierarki resource (misalnya, projects/PROJECT_ID, under:folders/FOLDER_ID, dan under:organizations/ORGANIZATION_ID). Gunakan batasan ini dengan mengonfigurasi daftar indikator hierarki resource dan menetapkan batasan ke Izinkan. Konfigurasi ini membatasi layanan yang didukung sehingga kunci CMEK hanya dapat dipilih dari project, folder, dan organisasi yang tercantum. Permintaan untuk membuat resource yang dilindungi CMEK di layanan yang dikonfigurasi tidak akan berhasil tanpa kunci Firestore dari salah satu resource yang diizinkan.

Contoh berikut hanya mengizinkan kunci dari ALLOWED_KEY_PROJECT_ID untuk database yang dilindungi CMEK dalam project yang ditentukan:

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

Setelah kebijakan diterapkan, Anda akan menerima pengecualian FAILED_PRECONDITION dan pesan error jika melanggar batasan. Pengecualian akan terlihat seperti berikut:

{
  "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."
          }
        ]
      }
    ]
  }
}

Langkah selanjutnya