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

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

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

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

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

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

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

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

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

सीएमईके कुंजी बनाने से पहले, आपके पास 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 में की-रिंग और कुंजी बनाएं.

  • कई इलाकों में मौजूद डेटाबेस की जगहों के लिए, केएमएस की कई जगहों के नाम का इस्तेमाल करें:

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

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

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

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

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

कंसोल

अपने सर्विस एजेंट को 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 with the project that contains the key

टर्मिनल में, यहां दिए गए जवाब जैसा कुछ दिखना चाहिए:

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

सीएमईके की सुविधा वाला डेटाबेस बनाना

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

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

कंसोल

  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 की ओर से मैनेज किया गया के तौर पर दिखता है.

gcloud

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

सीएमईके की सुविधा वाला डेटाबेस बनाने के लिए, केएमएस कुंजी का नाम फ़ील्ड का इस्तेमाल करें. अगर --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

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

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

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

सीएमईके से सुरक्षित डेटाबेस को ऐक्सेस करना

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

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

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

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

gcloud

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

सीएमईके एन्क्रिप्शन पर वापस जाने के लिए, 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 के डिफ़ॉल्ट एन्क्रिप्शन (नॉन-सीएमईके) पर वापस जाने के लिए, encryption-type फ़्लैग को इस तरह सेट करें:

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

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

बैकअप के एन्क्रिप्शन टाइप को पहले जैसा करने के लिए, 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

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

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

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

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

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

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

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

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

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

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

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

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

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

gcloud

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

सीएमईके एन्क्रिप्शन का इस्तेमाल करके क्लोन बनाने के लिए, 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

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

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

gcloud firestore databases clone \
--encryption-type=use-source-encryption

अगर --encryption-type के बारे में नहीं बताया गया है, तो यह डिफ़ॉल्ट ऐक्शन और सेटिंग के तौर पर लागू होता है.

Firebase CLI

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

सीएमईके एन्क्रिप्शन में क्लोन करने के लिए, 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

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

सोर्स डेटाबेस के एन्क्रिप्शन टाइप के हिसाब से क्लोन बनाने के लिए, 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: उस कुंजी के मुख्य संसाधन का पूरा नाम जिसका इस्तेमाल, सीएमईके से सुरक्षित किए गए आपके डेटाबेस को एन्क्रिप्ट (सुरक्षित) करने के लिए किया जाता है.
  • 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 डेटाबेस के लिए, एन्क्रिप्शन के पालन से जुड़ी ज़रूरी शर्तें तय करने के लिए, सीएमईके संगठन की नीति की पाबंदी का इस्तेमाल करें.

सीएमईके सुरक्षा ज़रूरी है

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

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