استخدام مفاتيح التشفير المُدارة للعميل (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

قبل إنشاء مفتاح تشفير مُدار من العميل، يجب أن يكون لديك 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 الذي تريد إدارة مفاتيحك فيه، أكمِل ما يلي:

  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 من خلال الاطّلاع على تفاصيل قاعدة البيانات:

  • إذا كانت قاعدة بياناتك محمية باستخدام مفاتيح التشفير التي يديرها العميل (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 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 مع رقم تعريف سلسلة مفاتيح 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)

يجب أن تعمل جميع عمليات القراءة والكتابة وطلبات البحث المرسَلة إلى قاعدة بيانات محمية بمفتاح 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 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 مع رقم تعريف النسخة الاحتياطية

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

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

  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.

طلب الحماية باستخدام مفاتيح التشفير التي يديرها العميل (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."
          }
        ]
      }
    ]
  }
}

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