استخدام مفاتيح التشفير المُدارة للعميل (CMEK)

تصف هذه الصفحة كيفية تنفيذ المهام المتعلقة بـ مفاتيح التشفير التي يديرها العميل (CMEK) لـ Cloud Firestore. لمزيد من المعلومات حول CMEK بشكل عام، بما في ذلك متى ولماذا يتم تمكينه، راجع وثائق Cloud KMS.

إعداد مفاتيح التشفير المُدارة من قِبل العميل (CMEK)

قبل أن تتمكن من إنشاء قاعدة بيانات Cloud Firestore محمية بـ CMEK، يجب عليك إكمال الخطوات التالية:

  1. اطلب الوصول إلى ميزة Cloud Firestore CMEK.
  2. إنشاء (أو استرداد) وكيل خدمة Cloud Firestore.
  3. إنشاء مفتاح CMEK
  4. تكوين إعدادات IAM لهذا المفتاح.

أكمِل هذه الخطوات لكل مشروع سيحتوي على قواعد بيانات محمية باستخدام مفتاح التشفير المُدارة من العميل (CMEK).Cloud Firestore إذا أنشأت مفتاح CMEK جديدًا في وقت لاحق، عليك ضبط إعدادات إدارة الهوية وإمكانية الوصول (IAM) لهذا المفتاح.

طلب الدخول

قبل إنشاء وكيل خدمة Cloud Firestore، اطلب الوصول إلى ميزة "إدارة مفاتيح التشفير الخاصة بالعميل" من خلال ملء هذا النموذج.

إنشاء وكيل خدمة Cloud Firestore

قبل إنشاء مفتاح CMEK، يجب أن يكون لديك Cloud Firestore وكيل خدمة، وهو نوع من حسابات الخدمة التي تديرها Google Cloud Firestore وتُستخدم للوصول إلى المفتاح.

نفِّذ الأمر services identity create لإنشاء وكيل الخدمة الذي يستخدمه Cloud Firestore للوصول إلى مفتاح CMEK نيابةً عنك. ينشئ هذا الأمر حساب الخدمة إذا لم يكن متوفّرًا، ثم يعرضه.

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

استبدِل FIRESTORE_PROJECT بالمشروع الذي تخطّط لاستخدامه لقواعد بيانات Cloud Firestore.

يعرض الأمر رقم تعريف وكيل الخدمة، والذي يكون منسّقًا كعنوان بريد إلكتروني. سجِّل سلسلة البريد الإلكتروني الناتجة لأنّك ستستخدمها في خطوة لاحقة.

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

إنشاء مفتاح

يمكنك استخدام مفتاح تم إنشاؤه مباشرةً في Cloud KMS أو مفتاح مُدار خارجيًا وتتيحه من خلال Cloud External Key Manager.

يجب أن يكون الموقع الجغرافي للمفتاح في Cloud KMS هو نفسه الموقع الجغرافي لقاعدة بيانات Cloud Firestore التي سيتم استخدامه معها.

  • بالنسبة إلى مواقع قواعد البيانات الإقليمية، استخدم نفس اسم الموقع لحلقة المفاتيح والمفتاح وقاعدة البيانات لأن أسماء المواقع لها تعيين واحد لواحد.

    على سبيل المثال، إذا كنت تريد إنشاء قاعدة بيانات محمية بـ CMEK في us-west1، فأنشئ حلقة مفاتيح وأدخل المفتاح في us-west1.

  • بالنسبة إلى مواقع قواعد البيانات متعددة المناطق، استخدم اسم موقع موقع KMS متعدد المناطق:

    • استخدم موقع us متعدد المناطق في Cloud KMS لموقع Cloud Firestore nam5 متعدد المناطق.
    • استخدم موقع europe متعدد المناطق في Cloud KMS لموقع Cloud Firestore eur3 متعدد المناطق.

في مشروع Google Cloud الذي تريد إدارة مفاتيحك فيه، أكمل ما يلي:

  1. فعِّل Cloud KMS API.

  2. أنشئ سلسلة مفاتيح ومفتاحًا باستخدام أحد الخيارات التالية:

تكوين إعدادات IAM للمفتاح

وحدة التحكم

لمنح دور Cloud KMS إلى وكيل الخدمة، اتّبِع الخطوات التالية. يمكنك أيضًا منح الإذن على مستوى المفتاح أو سلسلة المفاتيح إذا كنت تريد مستوى دقة أقل.

  1. في Google Cloud Console، انتقِل إلى صفحة إدارة الهوية وإمكانية الوصول.

    انتقل إلى صفحة IAM

  2. انقر على إضافة.

  3. أدخل معرف البريد الإلكتروني المنسق لوكيل خدمة Cloud Firestore الخاص بك.

  4. اختَر دور Cloud KMS CryptoKey Encrypter/Decrypter.

  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 مع معرف بتنسيق البريد الإلكتروني لوكيل الخدمة الذي تمنحه حق الوصول
  • 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. لا يمكن تحويل قواعد بيانات Cloud Firestore الحالية المحمية من خلال التشفير التلقائي من Google لاستخدام مفاتيح التشفير التي يديرها العميل.

يمكنك اختيار نوع التشفير والمفتاح فقط عند إنشاء قاعدة بيانات مفعَّلة باستخدام مفتاح تشفير يديره العميل (CMEK).

وحدة التحكم

  1. في Google Cloud Console، انتقِل إلى صفحة قواعد البيانات.

    الانتقال إلى صفحة "قواعد البيانات"

  2. انقر على إنشاء قاعدة بيانات.

  3. اختَر وضع قاعدة البيانات. انقر على متابعة.

  4. في صفحة تكوين قاعدة البيانات الخاصة بك، أدخل معرف قاعدة البيانات.

  5. حدد موقعًا.

  6. انقر على إظهار خيارات التشفير، ثم حدد مفتاح Cloud KMS.

  7. قم بتحديد أو إدخال اسم المورد لمفتاح CMEK الذي تريد استخدامه لقاعدة البيانات.

  8. تقتصر قائمة المفاتيح على مشروع Google Cloud الحالي وموقع قاعدة البيانات الذي اخترته. لاستخدام مفتاح من مشروع Google Cloud مختلف، انقر على تبديل المشروع أو إدخال المفتاح يدويًا.

  9. إذا طُلب منك منح إذن المفتاح لحساب خدمة Cloud Firestore، فانقر على منحة. لإنشاء قاعدة بيانات CMEK، يجب منح حساب الخدمة Cloud Firestore الدور cloudkms.cryptoKeyEncrypterDecrypter.

  10. اختَر قواعد الأمان لبرامج الأجهزة الجوّالة وبرامج الويب.

  11. انقر على إنشاء قاعدة بيانات.

بمجرد إنشاء قاعدة البيانات، يمكنك التحقق من تمكين CMEK لقاعدة البيانات من خلال عرض تفاصيل قاعدة البيانات:

  • إذا كانت قاعدة البيانات محمية باستخدام "مفاتيح التشفير التي يديرها العميل"، سيظهر الحقل نوع التشفير على النحو يديرها العميل، وسيعرض الحقل مفتاح التشفير Cloud KMS المقابل وإصدار المفتاح المستخدَم لحماية قاعدة البيانات هذه.
  • إذا لم تكن قاعدة البيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل (CMEK)، سيظهر الحقل نوع التشفير على أنّه تتولّى Google إدارته.

gcloud

قبل إنشاء قاعدة بيانات مفعّلة باستخدام مفتاح تشفير تديره أنت (CMEK) باستخدام Google Cloud CLI، ثبِّت أحدث إصدار وامنح الإذن لـ 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 مع موقع Cloud Firestore لقاعدة البيانات
  • DATABASE_ID مع معرّف لقاعدة البيانات
  • KMS_KEY_NAME بالاسم الذي قمت بتعيينه للمفتاح. استخدِم اسم المورد الكامل للمفتاح بالتنسيق التالي:

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

  • FIRESTORE_PROJECT مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore

واجهة برمجة تطبيقات REST

طلب HTTP:

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

في نص الطلب، اضبط مفتاح التشفير المُدارة من العميل (CMEK) في الحقل cmek_config.kms_key_name.

يجب ضبطه على معرّف المورد الكامل لمفتاح Cloud KMS. يُسمح فقط باستخدام مفتاح في الموقع الجغرافي نفسه الذي توجد فيه قاعدة البيانات هذه.

يجب أن تكون هذه القيمة هي معرف مورد مفتاح Cloud KMS بتنسيق projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_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. إذا لم تحدد المعلمة --kms-key-name، فسيقوم Cloud 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 مع معرّف قاعدة البيانات
  • LOCATION مع موقع قاعدة البيانات
  • استبدِل KMS_PROJECT بالمشروع الذي يحتوي على مفتاح CMEK.
  • KMS_LOCATION مع الموقع الذي يحتوي على مفتاح CMEK وحلقة المفاتيح الخاصة بك
  • KMS_KEYRING_ID مع معرّف سلسلة مفاتيح CMEK
  • FIRESTORE_PROJECT مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore

تأكَّد من أنّ قاعدة بيانات Cloud Firestore محمية باستخدام Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

تظهر معلومات مفتاح التشفير المُدارة من العميل (CMEK) التالية في رسالة الردّ:

  • يوفر حقل اسم مفتاح KMS اسم مورد المفتاح الكامل المستخدم لتشفير قاعدة بيانات CMEK الخاصة بـ Cloud Firestore.
  • يوفّر حقل إصدارات المفاتيح النشطة قائمة بجميع إصدارات المفاتيح المستخدَمة حاليًا في قاعدة بيانات مفاتيح التشفير المُدارة من قِبل العميل (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 مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore
  • DATABASE_ID مع معرّف لقاعدة البيانات
  • FIRESTORE_DATABASE_LOCATION مع موقع Cloud Firestore لقاعدة البيانات
  • DATABASE_TYPE مع FIRESTORE_NATIVE لوضع Native أو DATASTORE_MODE لوضع Datastore.
  • KMS_KEY_NAME بالاسم الذي أسندته إلى المفتاح. استخدِم اسم المورد الكامل للمفتاح بالتنسيق التالي:

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

الوصول إلى قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل

يجب أن تعمل جميع عمليات القراءة والكتابة والاستعلام التي يتم إرسالها إلى قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة للعميل (CMEK) بالطريقة نفسها كما هو الحال مع قاعدة بيانات مشفّرة تلقائيًا من Google. على سبيل المثال، ليس عليك تقديم مفتاح لكل طلب.

استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من قِبل العميل

قبل استعادة قاعدة بيانات محمية باستخدام مفتاح تشفير يديره العميل (CMEK) من نسخة احتياطية، يجب اتّباع ما يلي:

  • حدِّد ما إذا كنت تريد إعادة قاعدة البيانات إلى التشفير باستخدام مفاتيح التشفير المُدارة للعميل (CMEK) أو التشفير التلقائي من Google (غير CMEK) أو التشفير نفسه المستخدَم في النسخة الاحتياطية.
  • جهِّز المفتاح (الإصدار الأساسي) وإصدار المفتاح الذي استخدمته لتشفير النسخة الاحتياطية. فعِّل كلاً من المفتاح وإصدار المفتاح.

gcloud

استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة للعميل (CMEK) إلى التشفير باستخدام مفاتيح التشفير المُدارة للعميل (CMEK)

لاستعادة التشفير باستخدام مفاتيح التشفير التي يديرها العميل (CMEK)، شغِّل الأمر gcloud firestore databases restore مع العلامتَين الاختياريتَين encryption-type وkms-key-name لضبط نوع التشفير لقاعدة البيانات التي تم استعادتها. في حال عدم تحديد نوع التشفير، سيتم استخدام إعدادات التشفير نفسها المستخدَمة في النسخة الاحتياطية لقاعدة البيانات التي تم استعادتها.

  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

استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من قِبل العميل إلى التشفير التلقائي

لإعادة الضبط إلى تشفير 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 مع معرّف قاعدة البيانات
  • FIRESTORE_PROJECT مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore
  • FIRESTORE_LOCATION مع موقع قاعدة بيانات Cloud Firestore
  • BACKUP_ID مع معرف النسخة الاحتياطية الخاصة بك
  • KMS_PROJECT مع المشروع الذي يحتوي على مفتاح CMEK الخاص بك
  • KMS_LOCATION مع الموقع الذي يحتوي على مفتاح CMEK وحلقة المفاتيح الخاصة بك
  • KMS_KEYRING_ID مع معرّف سلسلة مفاتيح CMEK

تأكَّد من أنّ قاعدة بيانات Cloud 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 مع معرّف قاعدة البيانات
  • FIRESTORE_PROJECT مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore
  • FIRESTORE_LOCATION مع موقع قاعدة بيانات Cloud Firestore
  • استبدِل BACKUP_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 مع معرّف قاعدة البيانات
  • FIRESTORE_PROJECT مع المشروع لاستخدامه في قاعدة بيانات Cloud Firestore
  • FIRESTORE_LOCATION مع موقع قاعدة بيانات Cloud Firestore
  • استبدِل BACKUP_ID بمعرّف النسخة الاحتياطية

استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل

قبل استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل (CMEK)، يجب مراعاة ما يلي:

  • قرر ما إذا كنت تريد استنساخ قاعدة البيانات إلى تشفير CMEK، أو إلى تشفير Google الافتراضي (غير CMEK)، أو إلى نفس التشفير المستخدم في قاعدة البيانات المصدر.
  • جهِّز المفتاح (الإصدار الأساسي) وإصدار المفتاح الذي استخدمته لتشفير قاعدة البيانات المصدر. فعِّل كلاً من المفتاح وإصدار المفتاح.

gcloud

استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة للعميل (CMEK) إلى مفاتيح التشفير المُدارة للعميل (CMEK)

للاستنساخ إلى تشفير CMEK، شغِّل الأمر gcloud firestore databases clone مع العلامتَين الاختياريتَين encryption-type وkms-key-name لضبط نوع التشفير لقاعدة البيانات المستنسَخة. إذا لم تحدد نوع التشفير، فستستخدم قاعدة البيانات المستنسخة نفس تكوين التشفير مثل قاعدة البيانات المصدر.

gcloud firestore databases clone \
--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 clone \
--encryption-type=google-default-encryption

استنساخ قاعدة بيانات محمية بـ CMEK إلى نفس نوع التشفير مثل قاعدة البيانات المصدر

لاستنساخ نفس نوع التشفير مثل قاعدة البيانات المصدر، اضبط علامة encryption-type بالطريقة التالية:

gcloud firestore databases clone \
--encryption-type=use-source-encryption

هذا أيضًا هو السلوك الافتراضي إذا لم يتم تحديد --encryption-type.

Firebase CLI

استنساخ قاعدة بيانات محمية بـ CMEK إلى تشفير CMEK

للاستنساخ إلى تشفير CMEK، شغِّل الأمر firebase firestore:databases:clone مع العلامتَين الاختياريتَين encryption-type وkms-key-name لضبط نوع التشفير لقاعدة البيانات المستنسَخة. في حال عدم تحديد نوع التشفير، سيتم استخدام إعدادات التشفير نفسها المستخدَمة في قاعدة البيانات المصدر.

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--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

استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل إلى التشفير التلقائي

للاستنساخ إلى تشفير Google التلقائي (غير CMEK)، اضبط العلامة encryption-type بالطريقة التالية:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION

استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل (CMEK) إلى نوع التشفير نفسه المستخدَم في قاعدة البيانات المصدر

لاستنساخ نفس نوع التشفير مثل قاعدة البيانات المصدر، اضبط علامة encryption-type بالطريقة التالية:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION

وهذا هو السلوك التلقائي أيضًا في حال عدم تحديد --encryption-type.

عرض المفتاح المستخدَم

gcloud

يمكنك استخدام الأمر databases describe gcloud CLI للتأكّد من إعداد CMEK لقاعدة البيانات:

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

من المفترض أن تظهر لك معلومات حول مفتاح التشفير المُدارة من العميل (CMEK) في الحقل cmekConfig ضمن الرد على النحو التالي:

      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: قائمة بجميع إصدارات المفاتيح المستخدَمة حاليًا في قاعدة البيانات المحمية باستخدام "مفاتيح التشفير التي يديرها العميل". أثناء تغيير المفتاح، يمكنك استخدام عدة إصدارات نشطة من المفتاح. يجب أن يتوفّر كلّ من إصدار المفتاح القديم وإصدار المفتاح الجديد أثناء عملية تغيير المفتاح. لا توقِف الإصدار القديم من المفتاح إلى أن يتوقف عن الظهور في الحقل activeKeyVersion.

واجهة برمجة تطبيقات REST

طلب HTTP:

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

في نص الطلب، اضبط مفتاح التشفير المُدارة من العميل (CMEK) في الحقل cmek_config.kms_key_name. يجب ضبطه على معرّف المورد الكامل لمفتاح Cloud KMS. يُسمح فقط باستخدام مفتاح في الموقع الجغرافي نفسه الذي توجد فيه قاعدة البيانات هذه.

يجب أن تكون هذه القيمة هي معرّف مورد مفتاح Cloud KMS بالتنسيق projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_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.

توضّح لك سجلات تدقيق الوصول إلى البيانات في Cloud KMS الوقت الذي تجري فيه Cloud Firestore أو أي منتجات أخرى تم إعدادها لاستخدام مفتاح CMEK عمليات تشفير/فك تشفير في Cloud KMS. لا يصدر Cloud Firestore مكالمة تشفير/فك تشفير عند كل طلب بيانات، ولكنه بدلاً من ذلك يحتفظ بمستفتى يتحقق من المفتاح بشكل دوري. تظهر نتائج الاستطلاع في سجلّات التدقيق.

يمكنك إعداد سجلّات التدقيق والتفاعل معها في وحدة تحكّم Google Cloud باتّباع الخطوات التالية:

  1. تأكَّد من تفعيل التسجيل لواجهة برمجة التطبيقات Cloud KMS في مشروعك.

  2. انتقِل إلى Cloud Logging في Google Cloud Console.

    الانتقال إلى 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 بالموقع الجغرافي للمفتاح وسلسلة المفاتيح

    يعرض السجلّ إدخالات سجلّ كل خمس دقائق تقريبًا لكل قاعدة بيانات. تبدو إدخالات السجلّ مشابهة للأمثلة التالية:

    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

لتحديد متطلبات امتثال التشفير Cloud Firestore لقواعد البيانات في مؤسستك، استخدِم قيد سياسة المؤسسة الخاص بمفاتيح CMEK.

تتطلب حماية CMEK

قم بتكوين constraints/gcp.restrictNonCmekServices لطلب CMEK لإنشاء قاعدة بيانات Cloud Firestore. اضبط القيد على deny وأضِف firestore.googleapis.com إلى القائمة المحظورة، على سبيل المثال:

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

استبدل FIRESTORE_PROJECT بالمشروع الذي تريد تقييده.

لمزيد من المعلومات حول إعداد سياسات المؤسسة، راجِع مقالة إنشاء السياسات وتعديلها.

بعد أن تدخل السياسة حيز التنفيذ، ستتلقى استثناءً ورسالة خطأ FAILED_PRECONDITION إذا حاولت إنشاء قاعدة بيانات غير تابعة لـ CMEK ضمن المشروع المتأثر. على سبيل المثال، يبدو الاستثناء مثل:

{
  "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

لتحديد مفاتيح Cloud KMS المستخدمة لحماية CMEK، قم بتكوين القيد constraints/gcp.restrictCmekCryptoKeyProjects.

كقيد قائمة، القيم المقبولة هي مؤشرات التسلسل الهرمي للموارد (على سبيل المثال، projects/PROJECT_ID وunder:folders/FOLDER_ID وunder:organizations/ORGANIZATION_ID). استخدِم هذا القيد من خلال ضبط قائمة بمؤشرات التسلسل الهرمي للموارد وضبط القيد على السماح. يقيّد هذا الإعداد الخدمات المتوافقة بحيث لا يمكن اختيار مفاتيح CMEK إلا من المشاريع والمجلدات والمؤسسات المدرَجة. لا تنجح الطلبات لإنشاء موارد محمية بـ CMEK في الخدمات المُهيأة بدون مفتاح Cloud Firestore من أحد الموارد المسموح بها.

يسمح المثال التالي فقط بالمفاتيح من ALLOWED_KEY_PROJECT_ID لقواعد البيانات المحمية بـ CMEK في المشروع المحدد:

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

الخطوات التالية