توضّح هذه الصفحة كيفية تنفيذ المهام المتعلقة بمفاتيح التشفير المُدارة للعميل (CMEK) في Cloud Firestore. لمزيد من المعلومات عن مفاتيح CMEK بشكل عام، بما في ذلك الحالات التي يجب فيها تفعيلها وأسباب ذلك، راجِع مستندات Cloud KMS.
إعداد مفاتيح التشفير المُدارة من قِبل العميل (CMEK)
قبل إنشاء قاعدة بيانات Cloud Firestore محمية باستخدام مفتاح التشفير المُدارة من العميل (CMEK)، يجب إكمال الخطوات التالية:
- طلب الوصول إلى Cloud Firestore ميزة "إدارة مفاتيح التشفير الخاصة بالعميل"
- إنشاء (أو استرداد) Cloud Firestore وكيل خدمة
- إنشاء مفتاح CMEK
- ضبط إعدادات إدارة الهوية وإمكانية الوصول (IAM) لهذا المفتاح
أكمِل هذه الخطوات لكل مشروع سيحتوي على قواعد بيانات محمية باستخدام مفتاح التشفير المُدارة من العميل (CMEK).Cloud Firestore إذا أنشأت مفتاح CMEK جديدًا في وقت لاحق، عليك ضبط إعدادات إدارة الهوية وإمكانية الوصول (IAM) لهذا المفتاح.
طلب الدخول
قبل إنشاء حساب Cloud Firestore لوكيل خدمة، اطلب الوصول إلى ميزة CMEK من خلال ملء هذا النموذج.
إنشاء وكيل خدمة 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 Firestorenam5
المتعدّد المناطق. - استخدِم الموقع الجغرافي
europe
المتعدّد المناطق في Cloud KMS للموقع الجغرافي Cloud Firestoreeur3
المتعدّد المناطق.
- استخدِم الموقع الجغرافي
في مشروع Google Cloud الذي تريد إدارة مفاتيحك فيه، أكمل ما يلي:
أنشئ سلسلة مفاتيح ومفتاحًا باستخدام أحد الخيارات التالية:
- إنشاء سلسلة المفاتيح والمفتاح مباشرةً في Cloud KMS
- استخدام مفتاح مُدار خارجيًا أنشئ المفتاح الخارجي، ثم أنشئ مفتاح Cloud EKM لإتاحة المفتاح من خلال Cloud KMS.
ضبط إعدادات إدارة الهوية وإمكانية الوصول (IAM) للمفتاح
وحدة التحكم
لمنح دور Cloud KMS لوكيل الخدمة، اتّبِع الخطوات التالية. يمكنك أيضًا منح الإذن على مستوى المفتاح أو سلسلة المفاتيح إذا كنت تريد مستوى دقة أقل.
في Google Cloud Console، انتقِل إلى صفحة إدارة الهوية وإمكانية الوصول.
انقر على إضافة.
أدخِل المعرّف بتنسيق البريد الإلكتروني 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 لاستخدام مفاتيح التشفير التي يديرها العميل.
يمكنك اختيار نوع التشفير والمفتاح فقط عند إنشاء قاعدة بيانات مفعَّلة باستخدام مفتاح تشفير يديره العميل (CMEK).
وحدة التحكم
في Google Cloud Console، انتقِل إلى صفحة قواعد البيانات.
انقر على إنشاء قاعدة بيانات.
اختَر وضع قاعدة البيانات. انقر على متابعة.
في صفحة ضبط قاعدة البيانات، أدخِل معرّف قاعدة البيانات.
حدد موقعًا.
انقر على عرض خيارات التشفير، ثم اختَر مفتاح Cloud KMS.
اختَر أو أدخِل اسم المورد لمفتاح التشفير المُدار من قِبل العميل (CMEK) الذي تريد استخدامه لقاعدة البيانات.
تقتصر قائمة المفاتيح على مشروع Google Cloud الحالي وموقع قاعدة البيانات الذي اخترته. لاستخدام مفتاح من مشروع Google Cloud مختلف، انقر على تبديل المشروع أو إدخال المفتاح يدويًا.
إذا طُلب منك منح إذن المفتاح لحساب الخدمة Cloud Firestore، انقر على منح. لإنشاء قاعدة بيانات CMEK، يجب منح حساب الخدمة Cloud Firestore الدور
cloudkms.cryptoKeyEncrypterDecrypter
.اختَر قواعد الأمان لبرامج الأجهزة الجوّالة وبرامج الويب.
انقر على إنشاء قاعدة بيانات.
بعد إنشاء قاعدة البيانات، يمكنك التأكّد من أنّها مفعّلة باستخدام مفتاح التشفير المُدارة من العميل من خلال عرض تفاصيل قاعدة البيانات:
- إذا كانت قاعدة البيانات محمية باستخدام "مفاتيح التشفير التي يديرها العميل"، سيظهر الحقل نوع التشفير على النحو يديرها العميل، وسيعرض الحقل مفتاح التشفير 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 قاعدة بيانات غير مشفّرة باستخدام مفتاح تديره Google تلقائيًا.
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 CMEK.
- يوفّر حقل إصدارات المفاتيح النشطة قائمة بجميع إصدارات المفاتيح المستخدَمة حاليًا في قاعدة بيانات مفاتيح التشفير المُدارة من قِبل العميل (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)، شغِّل الأمر
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
استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من قِبل العميل إلى نوع التشفير نفسه المستخدَم في النسخة الاحتياطية
لاستعادة النسخة الاحتياطية باستخدام نوع التشفير نفسه، اضبط العلامة encryption-type
بالطريقة التالية:
gcloud firestore databases restore --encryption-type=use-source-encryption
Firebase CLI
استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة للعميل إلى التشفير باستخدام مفاتيح التشفير المُدارة للعميل
لإعادة التشفير باستخدام مفتاح التشفير المُدارة من قِبل العميل (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
استعادة قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من قِبل العميل إلى التشفير التلقائي
لإعادة الضبط إلى تشفير 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 alpha firestore databases clone
مع العلامتَين الاختياريتَين encryption-type
وkms-key-name
لضبط
نوع التشفير لقاعدة البيانات المستنسَخة. في حال عدم تحديد نوع التشفير، سيتم استخدام إعدادات التشفير نفسها المستخدَمة في قاعدة البيانات المصدر.
gcloud alpha 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 alpha firestore databases clone \
--encryption-type=google-default-encryption
استنساخ قاعدة بيانات محمية باستخدام مفاتيح التشفير المُدارة من العميل (CMEK) إلى نوع التشفير نفسه المستخدَم في قاعدة البيانات المصدر
للاستنساخ إلى نوع التشفير نفسه المستخدَم في قاعدة البيانات المصدر، اضبط العلامة encryption-type
بالطريقة التالية:
gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption
عرض المفتاح المستخدَم
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"
]
},
……
}
إيقاف مفتاح
لإيقاف مفتاح مرتبط بقاعدة بيانات، أكمل ما يلي:
- عرض إصدارات المفاتيح المستخدَمة لقاعدة بيانات
- إيقاف إصدارات المفاتيح هذه المستخدَمة
- انتظِر حتى يتم تطبيق التغيير وتحقَّق مما إذا كانت البيانات لم تعُد متاحة. عادةً ما تدخل التغييرات حيز التنفيذ خلال دقائق، ولكن قد تستغرق مدة تصل إلى 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 Console.
يمكنك حصر إدخالات السجلّ على مفتاح 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 لقواعد البيانات في مؤسستك، استخدِم قيد سياسة المؤسسة الخاص بمفاتيح التشفير المُدارة من قِبل العميل.
طلب الحماية باستخدام مفاتيح التشفير المُدارة من العميل
اضبط 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
ورسالة خطأ إذا حاولت إنشاء قاعدة بيانات غير مشفّرة باستخدام مفتاح تديره أنت ضمن المشروع المتأثر. على سبيل المثال، يبدو الاستثناء على النحو التالي:
{ "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 المستخدَمة للحماية باستخدام مفاتيح التشفير التي يديرها العميل، اضبط قيد 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." } ] } ] } }