توضّح هذه الصفحة كيفية تنفيذ المهام المتعلّقة بمفاتيح التشفير التي يديرها العميل (CMEK) في Cloud Firestore. لمزيد من المعلومات عن مفاتيح التشفير المُدارة من العميل بشكل عام، بما في ذلك حالات تفعيلها وأسباب ذلك، يُرجى الاطّلاع على مستندات Cloud KMS.
إعداد مفاتيح CMEK
قبل إنشاء قاعدة بيانات Cloud Firestore محمية بمفاتيح التشفير التي يديرها العميل، عليك إكمال الخطوات التالية:
- طلب الوصول إلى ميزة "مفتاح التشفير الذي يديره العميل" في Cloud Firestore
- أنشئ (أو استرِدّ) وكيل خدمة Cloud Firestore.
- أنشئ مفتاح CMEK.
- اضبط إعدادات "إدارة الهوية وإمكانية الوصول" لهذا المفتاح.
أكمِل هذه الخطوات لكل مشروع يحتوي على قواعد بيانات Cloud Firestore محمية بمفاتيح تشفير مُدارة من قِبل العميل (CMEK). إذا أنشأت لاحقًا مفتاح CMEK جديدًا، عليك ضبط إعدادات "إدارة الهوية وإمكانية الوصول" لهذا المفتاح.
طلب الدخول
قبل إنشاء وكيل خدمة Cloud Firestore، اطلب الوصول إلى ميزة "مفتاح التشفير المُدار من العميل" من خلال ملء هذا النموذج.
إنشاء وكيل خدمة Cloud Firestore
قبل إنشاء مفتاح تشفير مُدار من العميل، يجب أن يكون لديك 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 التي سيتم استخدامه معها.
بالنسبة إلى المواقع الجغرافية الإقليمية لقواعد البيانات، استخدِم اسم الموقع الجغرافي نفسه لسلسلة المفاتيح والمفتاح وقاعدة البيانات لأنّ أسماء المواقع الجغرافية لها ربط واحد لواحد.
على سبيل المثال، إذا أردت إنشاء قاعدة بيانات محمية بمفاتيح التشفير التي يديرها العميل في
us-west1، أنشئ سلسلة مفاتيح ومفتاحًا فيus-west1.بالنسبة إلى المواقع الجغرافية لقواعد البيانات المتعدّدة المناطق، استخدِم اسم الموقع الجغرافي لموقع KMS المتعدّد المناطق:
- استخدِم الموقع الجغرافي المتعدّد المناطق
usفي Cloud KMS للموقع الجغرافي المتعدّد المناطقnam5في Cloud Firestore. - استخدِم الموقع الجغرافي المتعدّد المناطق
europeفي Cloud KMS للموقع الجغرافي المتعدّد المناطقeur3في Cloud Firestore.
- استخدِم الموقع الجغرافي المتعدّد المناطق
في مشروع Google Cloud الذي تريد إدارة مفاتيحك فيه، أكمِل ما يلي:
أنشئ سلسلة مفاتيح ومفتاحًا باستخدام أحد الخيارات التالية:
- أنشئ سلسلة المفاتيح والمفتاح مباشرةً في Cloud KMS.
- استخدام مفتاح مُدار خارجيًا أنشئ المفتاح الخارجي ثم أنشئ مفتاح Cloud EKM لإتاحة المفتاح من خلال Cloud KMS.
ضبط إعدادات "إدارة الهوية وإمكانية الوصول" للمفتاح
وحدة التحكم
لمنح دور Cloud KMS إلى وكيل الخدمة، اتّبِع الخطوات التالية: يمكنك أيضًا منح الإذن على مستوى المفتاح أو سلسلة المفاتيح إذا أردت مستوى دقة أقل.
في وحدة تحكُّم Google Cloud، انتقِل إلى صفحة إدارة الهوية وإمكانية الوصول.
انقر على إضافة.
أدخِل رقم التعريف بتنسيق البريد الإلكتروني لوكيل خدمة Cloud Firestore.
اختَر دور Cloud KMS CryptoKey Encrypter/Decrypter.
انقر على حفظ.
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 التلقائي لاستخدام "مفاتيح التشفير التي يديرها العميل".
يمكنك اختيار نوع التشفير والمفتاح فقط عند إنشاء قاعدة بيانات تم تفعيل ميزة "مفتاح التشفير الذي يديره العميل" فيها.
وحدة التحكم
في وحدة تحكّم Google Cloud، انتقِل إلى صفحة قواعد البيانات.
انقر على إنشاء قاعدة بيانات (Create Database).
اختَر وضع قاعدة البيانات. انقر على متابعة.
في صفحة ضبط قاعدة البيانات، أدخِل معرّف قاعدة البيانات.
حدد موقعًا.
انقر على عرض خيارات التشفير، ثم اختَر مفتاح Cloud KMS.
اختَر أو أدخِل اسم المورد لمفتاح CMEK الذي تريد استخدامه لقاعدة البيانات.
تقتصر قائمة المفاتيح على مشروع Google Cloud الحالي وموقع قاعدة البيانات الذي اخترته. لاستخدام مفتاح من مشروع مختلف على Google Cloud، انقر على تبديل المشروع أو إدخال المفتاح يدويًا.
إذا طُلب منك منح إذن المفتاح لحساب خدمة Cloud Firestore، انقر على منح. لإنشاء قاعدة بيانات مفاتيح تشفير مُدارة من العميل (CMEK)، يجب منح حساب خدمة Cloud Firestore دور
cloudkms.cryptoKeyEncrypterDecrypter.اختَر قواعد الأمان لعملاء الأجهزة الجوّالة والويب.
انقر على إنشاء قاعدة بيانات (Create Database).
بعد إنشاء قاعدة البيانات، يمكنك التأكّد من أنّها متوافقة مع مفتاح CMEK من خلال الاطّلاع على تفاصيل قاعدة البيانات:
- إذا كانت قاعدة بياناتك محمية باستخدام مفاتيح التشفير التي يديرها العميل (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_IDFIRESTORE_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
لإنشاء قاعدة بيانات تم تفعيل ميزة 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مع رقم تعريف سلسلة مفاتيح CMEKFIRESTORE_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)
يجب أن تعمل جميع عمليات القراءة والكتابة وطلبات البحث المرسَلة إلى قاعدة بيانات محمية بمفتاح 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 التلقائي (غير المستند إلى مفتاح CMEK)، اضبط العلامة 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
لاستعادة تشفير 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 FirestoreFIRESTORE_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 FirestoreFIRESTORE_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 FirestoreFIRESTORE_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"
]
},
……
}
إيقاف مفتاح
لإيقاف مفتاح مرتبط بقاعدة بيانات، أكمِل الخطوات التالية:
- عرض نُسخ المفاتيح المستخدَمة في قاعدة بيانات
- أوقِف إصدارات المفاتيح هذه المستخدَمة.
- انتظِر حتى يتم تطبيق التغيير وتحقَّق مما إذا كان قد تم حظر الوصول إلى البيانات. عادةً ما تدخل التغييرات حيز التنفيذ خلال دقائق، ولكن قد تستغرق مدة تصل إلى 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.
تعرض لك سجلّات تدقيق الوصول إلى البيانات في Cloud KMS الحالات التي يُجري فيها "Cloud Firestore" أو أي منتجات أخرى تم ضبطها لاستخدام مفتاح التشفير المُدار من العميل (CMEK) طلبات تشفير أو فك تشفير إلى Cloud KMS. لا يُصدر Cloud Firestore طلب تشفير/فك تشفير لكل طلب بيانات، بل يحتفظ بدلاً من ذلك بأداة استطلاع تتحقّق من المفتاح بشكل دوري. تظهر نتائج الاستطلاع في سجلات التدقيق.
يمكنك إعداد سجلّات التدقيق والتفاعل معها في وحدة تحكّم Google Cloud:
تأكَّد من تفعيل التسجيل لواجهة Cloud KMS API في مشروعك.
انتقِل إلى Cloud Logging في وحدة تحكّم Google Cloud.
يمكنك حصر إدخالات السجلّ بمفتاح 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 في الخدمات التي تم ضبطها بدون مفتاح 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." } ] } ] } }