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

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

अपनी CMEK कुंजियाँ तैयार करें

CMEK-संरक्षित Cloud Firestore डेटाबेस बनाने से पहले, आपको निम्नलिखित चरण पूरे करने होंगे:

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

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

ऐक्सेस मांगें

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

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

कुंजी बनाना

आप सीधे क्लाउड KMS में बनाई गई कुंजी या बाहरी रूप से प्रबंधित कुंजी का उपयोग कर सकते हैं, जिसे आप क्लाउड बाहरी कुंजी प्रबंधक के साथ उपलब्ध कराते हैं.

क्लाउड KMS कुंजी स्थान उस Cloud Firestore डेटाबेस के स्थान के समान होना चाहिए जिसके साथ इसका उपयोग किया जाएगा.

  • क्षेत्रीय डेटाबेस की जगहों के लिए, की-रिंग, कुंजी, और डेटाबेस के लिए एक ही जगह का नाम इस्तेमाल करें. ऐसा इसलिए, क्योंकि जगहों के नामों की मैपिंग एक से एक होती है.

    उदाहरण के लिए, अगर आपको us-west1 में CMEK से सुरक्षित डेटाबेस बनाना है, तो us-west1 में एक की रिंग और कुंजी बनाएं.

  • बहु-क्षेत्रीय डेटाबेस स्थानों के लिए, KMS बहु-क्षेत्रीय स्थान के स्थान नाम का उपयोग करें:

    • Cloud Firestore nam5 मल्टी-रीजन लोकेशन के लिए, Cloud KMS us मल्टी-रीजन लोकेशन का इस्तेमाल करें.
    • Cloud Firestore eur3 बहु-क्षेत्रीय स्थान के लिए क्लाउड KMS europe बहु-क्षेत्रीय स्थान का उपयोग करें.

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

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

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

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

कंसोल

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

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

    IAM पेज पर जाएं

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

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

  4. क्लाउड KMS क्रिप्टोकी एन्क्रिप्टर/डिक्रिप्टर भूमिका चुनें.

  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 की सुविधा वाला डेटाबेस बनाना

CMEK कुंजियां बनाने और कॉन्फ़िगर करने के बाद, 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 सेवा खाते को कुंजी की अनुमति देने के लिए कहा जाए, तो अनुमति दें पर क्लिक करें. CMEK डेटाबेस बनाने के लिए, आपके Cloud Firestore सेवा खाते को cloudkms.cryptoKeyEncrypterDecrypter की भूमिका दी जानी चाहिए.

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

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

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

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

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

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

  • डेटाबेस के लिए Cloud Firestore जगह की जानकारी के साथ FIRESTORE_DATABASE_LOCATION
  • 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 की कुंजी के पूरे संसाधन आईडी पर सेट किया जाता है. केवल उसी स्थान पर स्थित कुंजी की अनुमति है जहां यह डेटाबेस स्थित है.

यह मान projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} के प्रारूप में क्लाउड KMS कुंजी संसाधन आईडी होना चाहिए

अन्य फ़ील्ड के बारे में अधिक जानकारी के लिए, 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 डिफ़ॉल्ट रूप से नॉन-सीएमईके डेटाबेस बनाता है.

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

पुष्टि करें कि आपका Cloud Firestore डेटाबेस Firebase CLI से सुरक्षित है:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

प्रतिक्रिया संदेश में निम्नलिखित CMEK जानकारी दिखाई देती है:

  • केएमएस की का नाम फ़ील्ड में, उस पूरे की रिसॉर्स का नाम दिखता है जिसका इस्तेमाल आपके 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 जिसमें डेटाबेस के लिए आईडी मौजूद हो
  • डेटाबेस के लिए Cloud Firestore स्थान के साथ FIRESTORE_DATABASE_LOCATION
  • DATABASE_TYPE, मूल मोड के लिए FIRESTORE_NATIVE या डेटास्टोर मोड के लिए DATASTORE_MODE के साथ.
  • KMS_KEY_NAME को उस नाम से जोड़ें जो आपने कुंजी को दिया है. कुंजी के लिए पूर्ण संसाधन नाम का उपयोग निम्न प्रारूप में करें:

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

CMEK-संरक्षित डेटाबेस तक पहुँच

CMEK-संरक्षित डेटाबेस को भेजे गए सभी पठन, लेखन और क्वेरी संचालन उसी प्रकार कार्य करने चाहिए, जैसे कि Google डिफ़ॉल्ट एन्क्रिप्टेड डेटाबेस के साथ होता है. उदाहरण के लिए, आपको प्रत्येक अनुरोध के लिए कुंजी प्रदान करने की आवश्यकता नहीं है.

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

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

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

gcloud

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

CMEK एन्क्रिप्शन को पुनर्स्थापित करने के लिए, पुनर्स्थापित डेटाबेस के लिए एन्क्रिप्शन प्रकार कॉन्फ़िगर करने हेतु वैकल्पिक encryption-type और kms-key-name फ़्लैग के साथ gcloud firestore databases restore कमांड चलाएँ. अगर आपने एन्क्रिप्शन टाइप की जानकारी नहीं दी है, तो वापस लाए गए डेटाबेस में एन्क्रिप्शन के उसी कॉन्फ़िगरेशन का इस्तेमाल किया जाएगा जो बैकअप में इस्तेमाल किया गया था.

  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

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

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

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

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

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-संरक्षित डेटाबेस का क्लोन बनाना

इससे पहले कि आप CMEK-संरक्षित डेटाबेस को क्लोन करें:

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

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

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

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

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

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: CMEK से सुरक्षित किए गए डेटाबेस में फ़िलहाल इस्तेमाल किए जा रहे सभी कुंजी वर्शन की सूची. कुंजी रोटेशन के दौरान, आपके पास चालू कुंजी के एक से ज़्यादा वर्शन हो सकते हैं. की रोटेशन के दौरान, कुंजी का पुराना और नया, दोनों वर्शन उपलब्ध होने चाहिए. जब तक activeKeyVersion फ़ील्ड में पुराना वर्शन नहीं दिखता, तब तक उसे बंद न करें.

REST API

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

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

अनुरोध बॉडी में cmek_config.kms_key_name फ़ील्ड में CMEK कॉन्फ़िगर करें. क्लाउड KMS कुंजी की पूर्ण संसाधन ID पर सेट करें. सिर्फ़ उस कुंजी का इस्तेमाल किया जा सकता है जो इस डेटाबेस की तरह ही एक ही जगह पर मौजूद हो.

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

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

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

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

आप Google क्लाउड कंसोल में ऑडिट लॉग सेट अप और उनके साथ इंटरैक्ट कर सकते हैं:

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

  2. Google क्लाउड कंसोल में Cloud Logging पर जाएं.

    Cloud Logging पर जाएं

  3. क्वेरी बिल्डर में निम्नलिखित पंक्तियाँ जोड़कर लॉग प्रविष्टियों को अपनी क्लाउड KMS कुंजी तक सीमित करें:

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

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

    • CMEK कुंजी के नाम के साथ KMS_KEY
    • 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 सुरक्षा की ज़रूरत है

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

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

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