सुरक्षित करने वाली ऐसी कुंजियों का इस्तेमाल करना जिन्हें ग्राहक मैनेज करता है (सीएमईके)

इस पेज पर, Cloud Firestore के लिए ग्राहक की ओर से मैनेज की जाने वाली एन्क्रिप्शन कुंजियों (सीएमईके) से जुड़े टास्क पूरे करने का तरीका बताया गया है. CMEK के बारे में ज़्यादा जानने के लिए, Cloud KMS का दस्तावेज़ देखें. इसमें यह भी बताया गया है कि इसे कब और क्यों चालू करना चाहिए.

सीएमईके कुंजियां तैयार करना

सीएमईके से सुरक्षित Cloud Firestore डेटाबेस बनाने से पहले, आपको ये चरण पूरे करने होंगे:

  1. Cloud Firestore सीएमईके सुविधा का ऐक्सेस पाने का अनुरोध करें.
  2. Cloud Firestore सर्विस एजेंट बनाएं या उसे वापस पाएं.
  3. CMEK कुंजी बनाना.
  4. उस कुंजी के लिए IAM सेटिंग कॉन्फ़िगर करें.

हर उस प्रोजेक्ट के लिए यह तरीका अपनाएं जिसमें सीएमईके से सुरक्षित Cloud Firestore डेटाबेस शामिल होंगे. अगर आपको बाद में नई सीएमईके कुंजी बनानी है, तो आपको उस कुंजी के लिए आईएएम सेटिंग कॉन्फ़िगर करनी होंगी.

ऐक्सेस का अनुरोध करें

Cloud Firestore सर्विस एजेंट बनाने से पहले, यह फ़ॉर्म भरकर सीएमईके सुविधा का ऐक्सेस पाने का अनुरोध करें.

Cloud Firestore सेवा एजेंट बनाना

CMEK कुंजी बनाने से पहले, आपके पास Cloud Firestore सेवा एजेंट होना चाहिए. यह Google के मैनेज किए गए सेवा खाते का एक टाइप है. Cloud Firestore इसका इस्तेमाल कुंजी को ऐक्सेस करने के लिए किया जाता है.

services identity create कमांड चलाकर, सेवा एजेंट बनाएँ. Cloud Firestore इसका इस्तेमाल करके, आपकी ओर से सीएमईके कुंजी को ऐक्सेस करता है. अगर सेवा खाता पहले से मौजूद नहीं है, तो यह कमांड उसे बना देती है. इसके बाद, उसे दिखाती है.

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 की कई इलाकों में मौजूद लोकेशन का नाम इस्तेमाल करें:

    • Cloud Firestore nam5 मल्टी-रीजन लोकेशन के लिए, Cloud KMS us मल्टी-रीजन लोकेशन का इस्तेमाल करें.
    • Cloud Firestore eur3 मल्टी-रीजन लोकेशन के लिए, Cloud KMS europe मल्टी-रीजन लोकेशन का इस्तेमाल करें.

आपको जिस Google Cloud प्रोजेक्ट में कुंजियां मैनेज करनी हैं उसमें यह तरीका अपनाएं:

  1. Cloud KMS API चालू करें.

  2. इनमें से किसी एक विकल्प का इस्तेमाल करके, कोई की-रिंग और की बनाएं:

कुंजी के लिए IAM सेटिंग कॉन्फ़िगर करना

कंसोल

अपने सर्विस एजेंट को Cloud KMS की भूमिका असाइन करने के लिए, यह तरीका अपनाएं. अगर आपको कम ग्रेन्यूलरिटी चाहिए, तो बटन या की-रिंग के लेवल पर भी अनुमति दी जा सकती है.

  1. Google Cloud Console में, IAM पेज पर जाएं.

    IAM पेज पर जाएं

  2. जोड़ें पर क्लिक करें.

  3. अपने Cloud Firestore सेवा एजेंट के लिए, ईमेल के फ़ॉर्मैट वाला आईडी डालें.

  4. Cloud KMS CryptoKey Encrypter/Decrypter भूमिका चुनें.

  5. सेव करें पर क्लिक करें.

gcloud

अपने सर्विस एजेंट को cloudkms.cryptoKeyEncrypterDecrypter की भूमिका असाइन करें:

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

इनकी जगह ये डालें:

  • KMS_KEY के साथ, कुंजी को असाइन किया गया नाम
  • KMS_KEYRING केएमएस की उस की-रिंग के साथ जिसमें कुंजी मौजूद है
  • KMS_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 की सुविधा वाला डेटाबेस बनाना

सीएमईके कुंजियां बनाने और कॉन्फ़िगर करने के बाद, सीएमईके से सुरक्षित डेटाबेस बनाया जा सकता है. Google के डिफ़ॉल्ट एन्क्रिप्शन से सुरक्षित की गई मौजूदा Cloud Firestore डेटाबेस को CMEK का इस्तेमाल करने के लिए नहीं बदला जा सकता.

CMEK की सुविधा वाले डेटाबेस को बनाते समय ही, एन्क्रिप्शन का टाइप और कुंजी चुनी जा सकती है.

कंसोल

  1. Google Cloud Console में, डेटाबेस पेज पर जाएं.

    डेटाबेस पेज पर जाएं

  2. डेटाबेस बनाएं पर क्लिक करें.

  3. डेटाबेस का मोड चुनें. जारी रखें पर क्लिक करें.

  4. अपने डेटाबेस को कॉन्फ़िगर करें पेज पर, डेटाबेस आईडी डालें.

  5. कोई जगह चुनें.

  6. एन्क्रिप्शन के विकल्प दिखाएं पर क्लिक करें. इसके बाद, Cloud KMS कुंजी चुनें.

  7. उस सीएमईके कुंजी के लिए संसाधन का नाम चुनें या डालें जिसका इस्तेमाल आपको डेटाबेस के लिए करना है.

  8. कुंजियों की सूची, मौजूदा Google Cloud प्रोजेक्ट और आपके चुने गए डेटाबेस की जगह की जानकारी तक सीमित होती है. किसी दूसरे Google Cloud प्रोजेक्ट की कुंजी का इस्तेमाल करने के लिए, प्रोजेक्ट बदलें या कुंजी मैन्युअल तरीके से डालें पर क्लिक करें.

  9. अगर आपको Cloud Firestore सेवा खाते को कुंजी की अनुमति देने के लिए कहा जाता है, तो अनुमति दें पर क्लिक करें. सीएमईके डेटाबेस बनाने के लिए, आपके Cloud Firestore सेवा खाते को cloudkms.cryptoKeyEncrypterDecrypter की भूमिका दी जानी चाहिए.

  10. मोबाइल और वेब क्लाइंट के लिए सुरक्षा से जुड़े नियम चुनें.

  11. डेटाबेस बनाएं पर क्लिक करें.

डेटाबेस बन जाने के बाद, यह पुष्टि की जा सकती है कि डेटाबेस में सीएमईके की सुविधा चालू है या नहीं. इसके लिए, डेटाबेस की जानकारी देखें:

  • अगर आपका डेटाबेस सीएमईके से सुरक्षित है, तो एन्क्रिप्शन का टाइप फ़ील्ड में ग्राहक की ओर से मैनेज किया गया दिखेगा. साथ ही, एन्क्रिप्शन की फ़ील्ड में, Cloud KMS और कुंजी का वह वर्शन दिखेगा जिसका इस्तेमाल इस डेटाबेस को सुरक्षित रखने के लिए किया जाता है.
  • अगर आपका डेटाबेस सीएमईके से सुरक्षित नहीं है, तो एन्क्रिप्शन का टाइप फ़ील्ड में Google-managed दिखेगा.

gcloud

Google Cloud CLI की मदद से, सीएमईके की सुविधा वाला डेटाबेस बनाने से पहले, Google Cloud CLI का नया वर्शन इंस्टॉल करें और इसे अनुमति दें.gcloud CLI ज़्यादा जानकारी के लिए, gcloud सीएलआई इंस्टॉल करना लेख पढ़ें.

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

एचटीटीपी अनुरोध:

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

अनुरोध के मुख्य हिस्से में, 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-key-name पैरामीटर की वैल्यू नहीं दी है, तो Cloud Firestore डिफ़ॉल्ट रूप से नॉन-सीएमईके डेटाबेस बनाता है.

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 उस प्रोजेक्ट के साथ जिसमें आपकी सीएमईके कुंजी है
  • KMS_LOCATION के साथ, वह जगह जहां आपकी सीएमईके कुंजी और की-रिंग मौजूद है
  • KMS_KEYRING_ID के साथ सीएमईके की रिंग का आईडी
  • FIRESTORE_PROJECT के साथ शेयर करें, ताकि इसका इस्तेमाल आपके Cloud Firestore डेटाबेस के लिए किया जा सके

पुष्टि करें कि आपका Cloud Firestore डेटाबेस, Firebase CLI की मदद से सुरक्षित किया गया हो:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

जवाब के मैसेज में, सीएमईके के बारे में यह जानकारी दिखती है:

  • KMS कुंजी का नाम फ़ील्ड में, कुंजी के संसाधन का पूरा नाम दिखता है. इसका इस्तेमाल, आपके Cloud Firestore सीएमईके डेटाबेस को एन्क्रिप्ट यानी सुरक्षित करने के लिए किया जाता है.
  • ऐक्टिव कुंजी के वर्शन फ़ील्ड में, उन सभी कुंजी के वर्शन की सूची होती है जिनका इस्तेमाल फ़िलहाल इस सीएमईके डेटाबेस में किया जा रहा है. डेटा सुरक्षित करने वाली कुंजी का नया वर्शन बनाने के दौरान, आपके पास एक से ज़्यादा चालू कुंजी वर्शन हो सकते हैं.

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 या डेटास्टोर मोड के लिए DATASTORE_MODE का इस्तेमाल करें.
  • KMS_KEY_NAME के साथ, कुंजी को असाइन किया गया नाम. कुंजी के लिए, संसाधन का पूरा नाम इस फ़ॉर्मैट में इस्तेमाल करें:

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

CMEK से सुरक्षित किए गए डेटाबेस को ऐक्सेस करना

सीएमईके से सुरक्षित किए गए डेटाबेस में भेजे गए सभी पढ़ने, लिखने, और क्वेरी करने के ऑपरेशन, Google के डिफ़ॉल्ट रूप से एन्क्रिप्ट (सुरक्षित) किए गए डेटाबेस की तरह ही काम करने चाहिए. उदाहरण के लिए, आपको हर अनुरोध के लिए कुंजी देने की ज़रूरत नहीं है.

CMEK से सुरक्षित किए गए डेटाबेस को वापस लाना

बैकअप से सीएमईके से सुरक्षित डेटाबेस को वापस लाने से पहले:

  • तय करें कि आपको डेटाबेस को सीएमईके एन्क्रिप्शन, Google के डिफ़ॉल्ट एन्क्रिप्शन (नॉन-सीएमईके) या बैकअप के तौर पर इस्तेमाल किए गए एन्क्रिप्शन पर वापस लाना है.
  • कुंजी (प्राइमरी-वर्शन) और उस कुंजी के वर्शन को तैयार करें जिसका इस्तेमाल आपने बैकअप को एन्क्रिप्ट (सुरक्षित) करने के लिए किया था. कुंजी और कुंजी का वर्शन, दोनों को चालू करें.

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

CMEK से सुरक्षित डेटाबेस को डिफ़ॉल्ट एन्क्रिप्शन पर वापस लाना

Google के डिफ़ॉल्ट एन्क्रिप्शन (नॉन-सीएमईके) को वापस लाने के लिए, encryption-type फ़्लैग को इस तरह सेट करें:

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

CMEK से सुरक्षित किए गए डेटाबेस को उसी तरह के एन्क्रिप्शन में वापस लाना जैसा बैकअप में था

बैकअप के लिए इस्तेमाल किए गए एन्क्रिप्शन टाइप का डेटा वापस पाने के लिए, encryption-type फ़्लैग को इस तरह सेट करें:

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

Firebase CLI

सीएमईके से सुरक्षित किए गए डेटाबेस को सीएमईके एन्क्रिप्शन पर वापस लाना

सीएमईके एन्क्रिप्शन पर वापस लाने के लिए, 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 उस प्रोजेक्ट के साथ जिसमें आपकी सीएमईके कुंजी है
  • KMS_LOCATION के साथ, वह जगह जहां आपकी सीएमईके कुंजी और की-रिंग मौजूद है
  • KMS_KEYRING_ID के साथ सीएमईके की रिंग का आईडी

पुष्टि करें कि आपका वापस लाया गया Cloud Firestore डेटाबेस, सीएमईके से एन्क्रिप्ट (सुरक्षित) किया गया है:

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 में बैकअप के आईडी से

CMEK से सुरक्षित किए गए डेटाबेस को उसी तरह के एन्क्रिप्शन में वापस लाना जैसा बैकअप में था

बैकअप के लिए इस्तेमाल किए गए एन्क्रिप्शन टाइप का डेटा वापस पाने के लिए, encryption-type फ़्लैग को इस तरह सेट करें:

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

इनकी जगह ये डालें:

  • DATABASE_ID को अपने डेटाबेस के आईडी के साथ
  • FIRESTORE_PROJECT के साथ शेयर करें, ताकि इसका इस्तेमाल आपके Cloud Firestore डेटाबेस के लिए किया जा सके
  • FIRESTORE_LOCATION आपके Cloud Firestore डेटाबेस की जगह की जानकारी के साथ
  • BACKUP_ID में बैकअप के आईडी से

CMEK से सुरक्षित किए गए डेटाबेस का डुप्लीकेट बनाना

सीएमईके से सुरक्षित किए गए डेटाबेस को क्लोन करने से पहले:

  • यह तय करें कि आपको डेटाबेस को सीएमईके एन्क्रिप्शन, Google के डिफ़ॉल्ट एन्क्रिप्शन (नॉन-सीएमईके) या सोर्स डेटाबेस के एन्क्रिप्शन के तौर पर क्लोन करना है.
  • उस कुंजी (प्राइमरी-वर्शन) और कुंजी के वर्शन को तैयार करें जिसका इस्तेमाल आपने सोर्स डेटाबेस को एन्क्रिप्ट करने के लिए किया था. कुंजी और कुंजी का वर्शन, दोनों को चालू करें.

gcloud

सीएमईके से सुरक्षित किए गए डेटाबेस को सीएमईके एन्क्रिप्शन में क्लोन करना

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 एन्क्रिप्शन में क्लोन करने के लिए, 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 कमांड का इस्तेमाल किया जा सकता है:

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

आपको जवाब में 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 API

एचटीटीपी अनुरोध:

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

अनुरोध के मुख्य हिस्से में, 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. बदलाव लागू होने का इंतज़ार करें और देखें कि डेटा अब ऐक्सेस नहीं किया जा सकता है. आम तौर पर, बदलाव कुछ ही मिनटों में लागू हो जाते हैं. हालांकि, इसमें तीन घंटे तक लग सकते हैं.

जब डेटाबेस में इस्तेमाल की गई किसी कुंजी को बंद कर दिया जाता है, तो आपको गड़बड़ी के मैसेज में 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. बदलाव लागू होने का इंतज़ार करें और देखें कि डेटा अब ऐक्सेस नहीं किया जा सकता है. आम तौर पर, बदलाव कुछ ही मिनटों में लागू हो जाते हैं. हालांकि, इसमें तीन घंटे तक लग सकते हैं.

Cloud KMS कुंजी के लिए ऑडिट लॉग देखना

Cloud KMS के डेटा ऐक्सेस ऑडिट लॉग चालू करने से पहले, आपको Cloud Audit Logs के बारे में पता होना चाहिए.

Cloud KMS के डेटा ऐक्सेस के ऑडिट लॉग से पता चलता है कि Cloud Firestore या सीएमईके कुंजी का इस्तेमाल करने के लिए कॉन्फ़िगर किए गए अन्य प्रॉडक्ट, Cloud KMS को एन्क्रिप्ट/डिक्रिप्ट करने के लिए कब कॉल करते हैं. Cloud Firestore हर डेटा अनुरोध पर, एन्क्रिप्ट/डिक्रिप्ट करने का अनुरोध नहीं करता. इसके बजाय, यह एक पोलर को बनाए रखता है, जो समय-समय पर कुंजी की जांच करता है. पोलिंग के नतीजे, ऑडिट लॉग में दिखते हैं.

Google Cloud Console में जाकर, ऑडिट लॉग सेट अप किए जा सकते हैं और उनसे इंटरैक्ट किया जा सकता है:

  1. पक्का करें कि आपके प्रोजेक्ट में Cloud KMS API के लिए, लॉगिंग चालू हो.

  2. Google Cloud Console में Cloud Logging पर जाएं.

    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 में सीएमईके कुंजी का नाम
    • KMS_KEYRING केएमएस की उस की-रिंग के साथ जिसमें कुंजी मौजूद है
    • 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"
    

ऑडिट लॉग को समझने के बारे में ज़्यादा जानने के लिए, ऑडिट लॉग को समझना लेख पढ़ें.

सीएमईके की सुविधा वाली संगठन की नीति को कॉन्फ़िगर करना

अपने संगठन के Cloud Firestoreडेटाबेस के लिए, एन्क्रिप्शन से जुड़ी ज़रूरी शर्तों को पूरा करने के बारे में बताने के लिए, सीएमईके संगठन की नीति से जुड़ी पाबंदी का इस्तेमाल करें.

CMEK की सुरक्षा ज़रूरी है

constraints/gcp.restrictNonCmekServices को कॉन्फ़िगर करें, ताकि 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. इस पाबंदी का इस्तेमाल करने के लिए, संसाधन के क्रम के हिसाब से इंडिकेटर की सूची कॉन्फ़िगर करें और पाबंदी को अनुमति दें पर सेट करें. इस कॉन्फ़िगरेशन से, काम करने वाली सेवाओं को सीमित किया जाता है. इससे सीएमईके कुंजियों को सिर्फ़ सूची में दिए गए प्रोजेक्ट, फ़ोल्डर, और संगठनों से चुना जा सकता है. कॉन्फ़िगर की गई सेवाओं में, सीएमईके से सुरक्षित किए गए संसाधन बनाने के अनुरोध तब तक पूरे नहीं किए जा सकते, जब तक कि अनुमति वाले किसी संसाधन से Cloud Firestore कुंजी न दी गई हो.

यहां दिए गए उदाहरण में, सिर्फ़ ALLOWED_KEY_PROJECT_ID से मिली कुंजियों को, तय किए गए प्रोजेक्ट में सीएमईके से सुरक्षित डेटाबेस के लिए इस्तेमाल करने की अनुमति दी गई है:

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

आगे क्या करना है