MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में क्लाइंट-साइड फील्ड लेवल एन्क्रिप्शन का अवलोकन

डेटा को अक्सर डेटा लेनदेन के लगभग हर स्तर पर उच्च अंत सुरक्षा की आवश्यकता होती है ताकि सुरक्षा नीतियों, अनुपालन और सरकारी नियमों को पूरा किया जा सके। संवेदनशील डेटा तक अनधिकृत पहुंच होने पर संगठन की प्रतिष्ठा खराब हो सकती है, इसलिए उल्लिखित जनादेश का पालन करने में विफलता।

इस ब्लॉग में हम कुछ ऐसे सुरक्षा उपायों के बारे में चर्चा करेंगे जिन्हें आप MongoDB के संबंध में अपना सकते हैं, विशेष रूप से चीजों के ग्राहक पक्ष पर ध्यान केंद्रित करते हुए।

परिदृश्य जहां डेटा तक पहुंचा जा सकता है

ऐसे कई तरीके हैं जिनसे कोई व्यक्ति आपके MongoDB डेटा तक पहुंच सकता है, उनमें से कुछ यहां दिए गए हैं...

  1. असुरक्षित नेटवर्क पर डेटा कैप्चर करना। कोई व्यक्ति आपके डेटा को वीपीएन नेटवर्क के साथ एपीआई के माध्यम से एक्सेस कर सकता है और उन्हें ट्रैक करना मुश्किल होगा। इस मामले में अक्सर बाकी डेटा ही दोषी होता है।
  2. एक सुपर उपयोगकर्ता जैसे कि एक व्यवस्थापक के पास सीधी पहुंच है। ऐसा तब होता है जब आप उपयोगकर्ता भूमिकाओं और प्रतिबंधों को परिभाषित करने में विफल रहते हैं।
  3. बैकअप फ़ाइलों के डेटाबेस को पढ़ते समय ऑन-डिस्क डेटा तक पहुंच प्राप्त करना।
  4. सर्वर मेमोरी और लॉग किए गए डेटा को पढ़ना।
  5. स्टाफ सदस्य द्वारा डेटा का आकस्मिक प्रकटीकरण।

MongoDB डेटा श्रेणियां और वे कैसे सुरक्षित हैं

सामान्य तौर पर, किसी भी डेटाबेस सिस्टम में दो प्रकार के डेटा शामिल होते हैं: 

  1. डेटा-एट-रेस्ट :वह जो डेटाबेस फ़ाइलों में संग्रहीत होता है
  2. डेटा-इन-ट्रांजिट:एक क्लाइंट, सर्वर और डेटाबेस के बीच लेन-देन किया जाता है।

MongoDB में एक एन्क्रिप्शन एट रेस्ट फीचर है जो डिस्क पर डेटाबेस फाइलों को एन्क्रिप्ट करता है इसलिए इसे रोकना ऑन-डिस्क डेटाबेस फ़ाइलों तक पहुंच।

नेटवर्क पर डेटा-इन-ट्रांजिट डेटा को एन्क्रिप्ट करके TLS/SSL का उपयोग करके ट्रांसपोर्ट एन्क्रिप्शन के माध्यम से MongoDB में सुरक्षित किया जा सकता है।

एक स्टाफ सदस्य द्वारा गलती से डेटा का खुलासा करने की स्थिति में, उदाहरण के लिए डेस्कटॉप स्क्रीन पर एक रिसेप्शनिस्ट, MongoDB भूमिका-आधारित एक्सेस कंट्रोल को एकीकृत करता है जो प्रशासकों को उपयोगकर्ताओं के लिए संग्रह-स्तर की अनुमति देने और प्रतिबंधित करने की अनुमति देता है।

सर्वर पर लेन-देन किया गया डेटा मेमोरी में रह सकता है और ये दृष्टिकोण किसी भी बिंदु पर सर्वर मेमोरी में डेटा एक्सेस के खिलाफ सुरक्षा चिंता का समाधान नहीं करते हैं। इसलिए MongoDB ने गोपनीय डेटा वाले दस्तावेज़ के विशिष्ट फ़ील्ड को एन्क्रिप्ट करने के लिए क्लाइंट-साइड फ़ील्ड स्तर एन्क्रिप्शन की शुरुआत की।

फ़ील्ड स्तरीय एन्क्रिप्शन

MongoDB उन दस्तावेज़ों के साथ काम करता है जिनमें परिभाषित फ़ील्ड होते हैं। कुछ क्षेत्रों में गोपनीय जानकारी जैसे क्रेडिट कार्ड नंबर, सामाजिक सुरक्षा नंबर, धैर्य निदान डेटा और बहुत कुछ रखने की आवश्यकता हो सकती है।

फ़ील्ड स्तर एन्क्रिप्शन हमें फ़ील्ड सुरक्षित करने में सक्षम करेगा और उन्हें केवल डिक्रिप्शन कुंजियों के साथ अधिकृत कर्मियों द्वारा ही एक्सेस किया जा सकता है।

एन्क्रिप्शन दो तरह से किया जा सकता है

  1. गुप्त कुंजी का उपयोग करना। एन्क्रिप्ट और डिक्रिप्टिंग दोनों के लिए एक ही कुंजी का उपयोग किया जाता है इसलिए इसे स्रोत और गंतव्य ट्रांसमिशन पर प्रस्तुत किया जाना चाहिए लेकिन सभी पक्षों द्वारा गुप्त रखा जाता है।
  2. सार्वजनिक कुंजी का उपयोग करना। कुंजियों की एक जोड़ी का उपयोग करता है जिससे एक का उपयोग एन्क्रिप्ट करने के लिए किया जाता है और दूसरे का उपयोग डिक्रिप्ट करने के लिए किया जाता है

फ़ील्ड स्तरीय एन्क्रिप्शन लागू करते समय मौजूदा डेटाबेस के बजाय नए डेटाबेस सेटअप का उपयोग करने पर विचार करें।

क्लाइंट-साइड फील्ड लेवल एन्क्रिप्शन (CSFLE)

MongoDB संस्करण 4.2 एंटरप्राइज़ में पेश किया गया है जो डेटाबेस व्यवस्थापकों को उन मानों को शामिल करने वाले एन्क्रिप्टेड फ़ील्ड के समायोजन के साथ प्रदान करता है जिन्हें सुरक्षित करने की आवश्यकता होती है। कहने का तात्पर्य यह है कि संवेदनशील डेटा क्लाइंट द्वारा एन्क्रिप्ट या डिक्रिप्ट किया जाता है और केवल एन्क्रिप्टेड रूप में सर्वर से और उससे संचार किया जाता है। इसके अलावा, यहां तक ​​कि सुपर उपयोगकर्ता जिनके पास एन्क्रिप्शन कुंजी नहीं है, उनका भी इन एन्क्रिप्टेड डेटा फ़ील्ड पर नियंत्रण नहीं होगा।

CSFLE कैसे लागू करें

क्लाइंट-साइड फ़ील्ड स्तर एन्क्रिप्शन को लागू करने के लिए, आपको निम्नलिखित की आवश्यकता है:

  1. MongoDB Server 4.2 Enterprise
  2. MongoDB  CSFLE के साथ संगत
  3. फाइल सिस्टम अनुमतियां
  4. विशिष्ट भाषा ड्राइवर। (हमारे ब्लॉग में हम Node.js का उपयोग करने जा रहे हैं)

कार्यान्वयन प्रक्रिया में शामिल हैं:

  • क्लाइंट और सर्वर चलाने के लिए सॉफ़्टवेयर के साथ एक स्थानीय विकास परिवेश
  • एन्क्रिप्शन कुंजियां बनाना और उनका सत्यापन करना।
  • क्लाइंट को स्वचालित फ़ील्ड-स्तरीय एन्क्रिप्शन के लिए कॉन्फ़िगर करना
  • एन्क्रिप्टेड फ़ील्ड की क्वेरी के संदर्भ में पूरे ऑपरेशन के दौरान।

CSFLE कार्यान्वयन

CSFLE लिफाफा एन्क्रिप्शन रणनीति का उपयोग करता है जिसके तहत डेटा एन्क्रिप्शन कुंजी को मास्टर कुंजी के रूप में जानी जाने वाली एक अन्य कुंजी के साथ एन्क्रिप्ट किया जाता है। क्लाइंट एप्लिकेशन एक मास्टर कुंजी बनाता है जो स्थानीय कुंजी प्रदाता में अनिवार्य रूप से स्थानीय फाइल सिस्टम में संग्रहीत होती है। हालांकि, यह भंडारण दृष्टिकोण असुरक्षित है इसलिए उत्पादन में, किसी को कुंजी प्रबंधन प्रणाली (केएमएस) में कुंजी को कॉन्फ़िगर करने की सलाह दी जाती है जो स्टोर करता है और डेटा एन्क्रिप्शन कुंजियों को दूरस्थ रूप से डिक्रिप्ट करता है।

डेटा एन्क्रिप्शन कुंजी उत्पन्न होने के बाद, वे एन्क्रिप्टेड डेटा के रूप में उसी MongoDB प्रतिकृति सेट में वॉल्ट संग्रह में संग्रहीत की जाती हैं।

मास्टर कुंजी बनाएं

नोड जेएस में, हमें 96-बाइट स्थानीय रूप से प्रबंधित मास्टर कुंजी जेनरेट करने की आवश्यकता होती है और इसे उस निर्देशिका में एक फ़ाइल में लिखना होता है जहां से मुख्य स्क्रिप्ट निष्पादित की जाती है: 

$npm install fs && npm install crypto

फिर स्क्रिप्ट में:

const crypto = require(“crypto”)

const fs = require(“fs”)



try{

fs.writeFileSync(‘masterKey.txt’, crypto.randomBytes(96))

}catch(err){

throw err;

}

डेटा एन्क्रिप्शन कुंजी बनाएं

इस कुंजी को एक कुंजी वॉल्ट संग्रह में संग्रहीत किया जाता है जहां CSFLE सक्षम क्लाइंट एन्क्रिप्शन/डिक्रिप्शन के लिए कुंजी तक पहुंच सकते हैं। एक उत्पन्न करने के लिए, आपको निम्नलिखित की आवश्यकता होगी:

  • स्थानीय रूप से प्रबंधित मास्टर कुंजी
  • आपके डेटाबेस से कनेक्शन यानी MongoDB कनेक्शन स्ट्रिंग
  • कुंजी वॉल्ट नेमस्पेस (डेटाबेस और संग्रह)

डेटा एन्क्रिप्शन कुंजी जेनरेट करने के चरण

  1. पहले जनरेट की गई स्थानीय मास्टर कुंजी पढ़ें

const localMasterKey = fs.readFileSync(‘./masterKey.txt’);
  1. KMS प्रदाता सेटिंग निर्दिष्ट करें जिसका उपयोग क्लाइंट द्वारा मास्टर कुंजी खोजने के लिए किया जाएगा।

const kmsProvider = {

local: {

key: localMasterKey

}

}
  1. डेटा एन्क्रिप्शन कुंजी बनाना। हमें MongoDB कनेक्शन स्ट्रिंग और कुंजी वॉल्ट नेमस्पेस कॉन्फ़िगरेशन के साथ क्लाइंट बनाने की आवश्यकता है। मान लीजिए कि हमारे पास उपयोगकर्ता नामक एक डेटाबेस होगा और इसके अंदर एक कीवॉल्ट संग्रह होगा। आपको पहले कमांड चलाकर uuid-base64 इंस्टॉल करना होगा

$ npm install uuid-base64

फिर आपकी स्क्रिप्ट में

const base64 = require('uuid-base64');

const keyVaultNamespace = 'users.keyVaul';

const client = new MongoClient('mongodb://localhost:27017', {

  useNewUrlParser: true,

  useUnifiedTopology: true,

});

async function createKey() {

  try {

    await client.connect();

    const encryption = new ClientEncryption(client, {

      keyVaultNamespace,

      kmsProvider,

    });

    const key = await encryption.createDataKey('local');

    const base64DataKeyId = key.toString('base64');

    const uuidDataKeyId = base64.decode(base64DataKeyId);

    console.log('DataKeyId [UUID]: ', uuidDataKeyId);

    console.log('DataKeyId [base64]: ', base64DataKeyId);

  } finally {

    await client.close();

  }

}

createKey();

फिर आपको कुछ ऐसे परिणाम प्रस्तुत किए जाएंगे जो मिलते-जुलते हैं

DataKeyId [UUID]: ad4d735a-44789-48bc-bb93-3c81c3c90824

DataKeyId [base64]: 4K13FkSZSLy7kwABP4HQyD==

क्लाइंट के पास निर्दिष्ट कुंजी वॉल्ट नेमस्पेस पर रीडराइट अनुमतियां होनी चाहिए

 

  1. यह सत्यापित करने के लिए कि डेटा एन्क्रिप्शन कुंजी बनाई गई थी

const client = new MongoClient('mongodb://localhost:27017', {

  useNewUrlParser: true,

  useUnifiedTopology: true,

});



async function checkClient() {

  try {

    await client.connect();

    const keyDB = client.db(users);

    const keyColl = keyDB.collection(keyVault);

    const query = {

      _id: ‘4K13FkSZSLy7kwABP4HQyD==’,

    };

    const dataKey = await keyColl.findOne(query);

    console.log(dataKey);

  } finally {

    await client.close();

  }

}

checkClient();

आपको कुछ प्रकार का परिणाम प्राप्त होना चाहिए

{

  _id: Binary {

    _bsontype: 'Binary',

    sub_type: 4,

    position: 2,

    buffer: <Buffer 68 ca d2 10 16 5d 45 bf 9d 1d 44 d4 91 a6 92 44>

  },

  keyMaterial: Binary {

    _bsontype: 'Binary',

    sub_type: 0,

    position: 20,

    buffer: <Buffer f1 4a 9f bd aa ac c9 89 e9 b3 da 48 72 8e a8 62 97 2a 4a a0 d2 d4 2d a8 f0 74 9c 16 4d 2c 95 34 19 22 05 05 84 0e 41 42 12 1e e3 b5 f0 b1 c5 a8 37 b8 ... 110 more bytes>

  },

  creationDate: 2020-02-08T11:10:20.021Z,

  updateDate: 2020-02-08T11:10:25.021Z,

  status: 0,

  masterKey: { provider: 'local' }

}

लौटाए गए दस्तावेज़ डेटा में शामिल हैं:डेटा एन्क्रिप्शन कुंजी आईडी (UUID), एन्क्रिप्टेड रूप में डेटा एन्क्रिप्शन कुंजी, मास्टर कुंजी की KMS प्रदाता जानकारी और दिन की तरह मेटाडेटा सृजन।

JSON स्कीमा का उपयोग करके एन्क्रिप्ट किए जाने वाले फ़ील्ड निर्दिष्ट करना

एक JSON स्कीमा एक्सटेंशन का उपयोग MongoDB ड्राइवरों द्वारा स्वचालित क्लाइंट-साइड एन्क्रिप्शन और एक संग्रह में दस्तावेज़ों के निर्दिष्ट क्षेत्रों के डिक्रिप्शन को कॉन्फ़िगर करने के लिए किया जाता है। इस स्कीमा के लिए CSFLE कॉन्फ़िगरेशन की आवश्यकता होगी:प्रत्येक फ़ील्ड को एन्क्रिप्ट करते समय उपयोग करने के लिए एन्क्रिप्शन एल्गोरिथ्म, CSFLE मास्टर कुंजी और प्रत्येक फ़ील्ड के BSON प्रकार के साथ एन्क्रिप्टेड एक या सभी एन्क्रिप्शन कुंजी।

हालाँकि, यह CSFLE JSON स्कीमा दस्तावेज़ सत्यापन का समर्थन नहीं करता है अन्यथा कोई भी सत्यापन उदाहरण क्लाइंट को एक त्रुटि देने का कारण बनेगा।

उपयुक्त क्लाइंट-साइड JSON स्कीमा के साथ कॉन्फ़िगर नहीं किए गए क्लाइंट को सर्वर-साइड JSON स्कीमा का उपयोग करके अनएन्क्रिप्टेड डेटा को फ़ील्ड में लिखने से प्रतिबंधित किया जा सकता है।

मुख्य रूप से दो एन्क्रिप्शन एल्गोरिदम हैं:यादृच्छिक और नियतात्मक।

हम JSON स्कीमा के रूट स्तर पर कुछ एन्क्रिप्ट मेटाडेटा कुंजी को परिभाषित करेंगे और इसे स्कीमा के गुण फ़ील्ड में परिभाषित करके एन्क्रिप्ट किए जाने वाले फ़ील्ड के साथ कॉन्फ़िगर करेंगे, इसलिए वे इस एन्क्रिप्शन कुंजी को इनहेरिट करने में सक्षम होंगे ।

{

    "bsonType" : "object",

    "encryptMetadata" : {

        "keyId" : // keyId generated here

    },

    "properties": {

        // field schemas here

    }

}

मान लें कि आप बैंक खाता संख्या फ़ील्ड को एन्क्रिप्ट करना चाहते हैं, तो आप कुछ ऐसा करेंगे:

"bankAccountNumber": {

    "encrypt": {

        "bsonType": "int",

        "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"

    }

}

उच्च कार्डिनैलिटी और क्षेत्र क्वेरी योग्य होने के कारण, हम नियतात्मक दृष्टिकोण का उपयोग करते हैं। ब्लड ग्रुप जैसे संवेदनशील फ़ील्ड जिनमें क्वेरी प्लान कम है और कार्डिनैलिटी कम है, उन्हें रैंडम तरीके से एन्क्रिप्ट किया जा सकता है।

ऐरे फ़ील्ड को सभी तत्वों के लिए ऑटो-एन्क्रिप्शन को बढ़ाने के लिए CSFLE के साथ यादृच्छिक एन्क्रिप्शन का उपयोग करना चाहिए।

मोंगोक्रिप्टेड एप्लिकेशन

MongoDB Enterprise Service 4.2 और बाद के संस्करण में स्थापित, यह एक अलग एन्क्रिप्शन अनुप्रयोग है जो क्लाइंट-साइड फ़ील्ड स्तर एन्क्रिप्शन को स्वचालित करता है। जब भी कोई CSFLE  सक्षम क्लाइंट बनाया जाता है, तो यह सेवा डिफ़ॉल्ट रूप से स्वचालित रूप से शुरू हो जाती है:

  • JSON स्कीमा में उल्लिखित एन्क्रिप्शन निर्देशों को मान्य करें, पता लगाएं कि थ्रूपुट संचालन में कौन से फ़ील्ड एन्क्रिप्ट किए जाने हैं।
  • असमर्थित कार्यों को एन्क्रिप्टेड फ़ील्ड पर निष्पादित होने से रोकें।

डेटा डालने के लिए हम सामान्य इंसर्ट क्वेरी करेंगे और परिणामी दस्तावेज़ में बैंक खाता फ़ील्ड के संबंध में नमूना डेटा होगा।

{

…

"bankAccountNumber":"Ac+ZbPM+sk7gl7CJCcIzlRAQUJ+uo/0WhqX+KbTNdhqCszHucqXNiwqEUjkGlh7gK8pm2JhIs/P3//nkVP0dWu8pSs6TJnpfUwRjPfnI0TURzQ==",

…

}

जब कोई अधिकृत कर्मचारी कोई क्वेरी करता है, तो ड्राइवर इस डेटा को डिक्रिप्ट करेगा और एक पठनीय प्रारूप में वापस आ जाएगा अर्थात 

{

…

"bankAccountNumber":43265436456456456756,

…

}

ध्यान दें:  यादृच्छिक रूप से एन्क्रिप्ट किए गए फ़ील्ड पर दस्तावेज़ों के लिए क्वेरी करना तब तक संभव नहीं है जब तक कि आप उस दस्तावेज़ को खोजने के लिए किसी अन्य फ़ील्ड का उपयोग नहीं करते हैं जिसमें यादृच्छिक रूप से एन्क्रिप्ट किए गए फ़ील्ड डेटा का अनुमान है।

निष्कर्ष

आराम और पारगमन के संबंध में सभी स्तरों पर डेटा सुरक्षा पर विचार किया जाना चाहिए। MongoDB एंटरप्राइज 4.2 सर्वर क्लाइंट-साइड फील्ड लेवल एन्क्रिप्शन का उपयोग करके क्लाइंट साइड से डेटा एन्क्रिप्ट करने के लिए डेवलपर्स को एक विंडो प्रदान करता है इसलिए डेटाबेस होस्ट प्रदाताओं और असुरक्षित नेटवर्क एक्सेस से डेटा सुरक्षित करता है। सीएसएफएलई लिफाफा एन्क्रिप्शन का उपयोग करता है जहां डेटा एन्क्रिप्शन कुंजी को एन्क्रिप्ट करने के लिए एक मास्टर कुंजी का उपयोग किया जाता है। इसलिए कुंजी प्रबंधन प्रणाली जैसे प्रमुख प्रबंधन टूल का उपयोग करके मास्टर कुंजी को सुरक्षित रखा जाना चाहिए।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक प्रमुख फ़ील्ड द्वारा MongoDB संग्रह में सभी डुप्लिकेट दस्तावेज़ खोजें

  2. PyMongo के साथ रेगेक्स क्वेरी करना

  3. डॉकर का उपयोग करके MongoDB को तैनात करना

  4. MongoDB एटलस का अवलोकन:भाग एक

  5. PyMongo लेनदेन त्रुटि:लेन-देन संख्या केवल एक प्रतिकृति सेट सदस्य या mongos पर अनुमति दी जाती है