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

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

إعداد مفاتيح CMEK

قبل إنشاء قاعدة بيانات Cloud Firestore محمية بمفتاح تشفير مُدار من العميل، عليك إكمال الخطوات التالية:

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

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

طلب الدخول

قبل إنشاء وكيل خدمة 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 التي سيتم استخدامه معها.

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

  1. تفعيل Cloud KMS API

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

ضبط إعدادات "إدارة الهوية وإمكانية الوصول" للمفتاح

وحدة التحكم

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

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

    الانتقال إلى صفحة "إدارة الهوية وإمكانية الوصول"

  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 التلقائي لاستخدام "مفاتيح التشفير التي يديرها العميل".

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

وحدة التحكم

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

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

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

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

  4. في صفحة ضبط قاعدة البيانات، أدخِل معرّف قاعدة البيانات.

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

  6. انقر على عرض خيارات التشفير، ثم اختَر مفتاح Cloud KMS.

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

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

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

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

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

بعد إنشاء قاعدة البيانات، يمكنك التأكّد من أنّها متوافقة مع مفتاح التشفير المُدار من العميل من خلال الاطّلاع على تفاصيل قاعدة البيانات:

  • إذا كانت قاعدة بياناتك محمية باستخدام مفاتيح التشفير التي يديرها العميل (CMEK)، سيظهر حقل نوع التشفير على أنّه يديره العميل، وسيعرض حقل مفتاح التشفير خدمة Cloud KMS المقابلة وإصدار المفتاح المستخدَم لحماية قاعدة البيانات هذه.
  • إذا لم تكن قاعدة بياناتك محمية بمفاتيح التشفير المُدارة من العميل، سيظهر حقل نوع التشفير على أنّه مُدار من 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 API

طلب 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

لإنشاء قاعدة بيانات تم تفعيل ميزة "مفاتيح التشفير التي يملكها العميل" فيها، استخدِم حقل اسم مفتاح 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 الاسم الكامل لمورد المفتاح المستخدَم لتشفير قاعدة بيانات "مفاتيح التشفير التي يديرها العميل" في Cloud Firestore.
  • يوفّر حقل إصدارات المفاتيح النشطة قائمة بجميع إصدارات المفاتيح المستخدَمة حاليًا في قاعدة بيانات "مفاتيح التشفير التي يديرها العميل" هذه. أثناء تدوير المفاتيح، يمكن أن يكون لديك نُسخ مفاتيح نشطة متعدّدة.

Terraform

لإنشاء قاعدة بيانات تم تفعيل ميزة "مفاتيح التشفير المُدارة من العميل" فيها، استخدِم المورد 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 للوضع الأصلي أو DATASTORE_MODE لوضع Datastore.
  • KMS_KEY_NAME بالاسم الذي حدّدته للمفتاح. استخدِم اسم المورد الكامل للمفتاح بالتنسيق التالي:

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

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

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

استعادة قاعدة بيانات محمية بمفتاح CMEK

قبل استعادة قاعدة بيانات محمية بمفاتيح 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

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

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

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

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

للاستعادة إلى نوع التشفير نفسه المستخدَم في النسخة الاحتياطية، اضبط العلامة encryption-type على النحو التالي:

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

Firebase CLI

استعادة قاعدة بيانات محمية بمفاتيح التشفير التي يديرها العميل (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 التلقائي (غير المستند إلى مفتاح إدارة العميل)، اضبط العلامة 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 مع رقم تعريف النسخة الاحتياطية

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

للاستعادة إلى نوع التشفير نفسه المستخدَم في النسخة الاحتياطية، اضبط العلامة 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

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

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

REST API

طلب 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 Console:

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

  2. انتقِل إلى Cloud Logging في وحدة تحكّم Google Cloud.

    الانتقال إلى "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)

اضبط 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."
          }
        ]

الحد من استخدام المفاتيح لميزة "مفاتيح التشفير التي يديرها العميل"

لتقييد مفاتيح 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."
          }
        ]
      }
    ]
  }
}

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