MySQL एन्क्रिप्शन और कुंजी प्रबंधन


10

मैं अपने क्लाइंट डेटा को प्रबंधित करने के लिए PHP / MySQL में एक स्थानीय इंट्रानेट प्रणाली विकसित कर रहा हूं। ऐसा लगता है कि सबसे अच्छा अभ्यास MySQL सर्वर पर संवेदनशील डेटा को एन्क्रिप्ट करना होगा क्योंकि यह दर्ज किया जा रहा है।

हालांकि, यह स्पष्ट नहीं है कि डेटा को आसानी से उपलब्ध होने के दौरान यह करने का सबसे अच्छा तरीका क्या होगा।

यह उत्तर देने के लिए एक कठिन प्रश्न की तरह लगता है: कुंजी (एस) कहाँ संग्रहीत है? कुंजी की सुरक्षा कैसे करें? यदि प्रत्येक उपयोगकर्ता की मशीन पर कुंजी संग्रहीत है, तो मशीन का शोषण होने पर इसे कैसे संरक्षित किया जाए? यदि कुंजी का दोहन किया जाता है, तो कुंजी कैसे बदलें?

यदि कुंजी को डीबी में संग्रहीत किया जाना है, तो इसे कैसे संरक्षित करें? उपयोगकर्ता इसे कैसे एक्सेस करेंगे?


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

उत्तर के लिए धन्यवाद! मुझे बैकअप की इतनी चिंता नहीं है। मैं किसी ऐसे व्यक्ति के बारे में चिंतित हूं जो किसी उपयोगकर्ता मशीन का शोषण कर रहा है और फिर SQL इंजेक्शन के माध्यम से वहां से साइट तक पहुंच रहा है, या उपयोगकर्ताओं के एप्लिकेशन क्रेडेंशियल्स को नष्ट कर रहा है। मैं मशीन के बारे में बहुत चिंतित नहीं हूँ; र के लिए क्रेडेंशियल बहुत मजबूत हैं (मैं किसी भ्रम में नहीं हूं कि यह 100% सुरक्षित है, हालांकि)।
तूफान

जवाबों:


9

परिष्कृत एन्क्रिप्टेड कुंजी सेटअप को संभालने के लिए वास्तव में कोई अंतर्निहित MySQL सुविधाएँ नहीं हैं। आपको अपने स्वयं के PHP और / या ब्राउज़र-साइड (जावास्क्रिप्ट?) कोड में एन्क्रिप्शन तर्क के थोक को लागू करने की आवश्यकता होगी।

लेकिन आपकी बताई गई चिंताएँ थोड़ी अजीब हैं: ऐसा लगता है कि आपकी एकमात्र वास्तविक चिंताएँ एक एसक्यूएल इंजेक्शन या ब्रूट फोर्स (पासवर्ड-अनुमान लगाना, मुझे लगता है) एक दूरस्थ क्लाइंट डेस्कटॉप / लैपटॉप वर्कस्टेशन से हमला करती हैं। इससे मुझे संदेह है कि आपके पास पहले से ही कुछ अन्य, संयुक्त राष्ट्र के सुरक्षा उपायों की योजना है, और आपने समझौते के संभावित संकेतों का विश्लेषण किया है।

  • एक के लिए, मैं मान रहा हूँ कि आपके पास फ़ायरवॉल नियम हैं जो बिना किसी दूरस्थ क्लाइंट IP से किसी भी प्रकार की पहुँच के खिलाफ MySQL / PHP होस्ट की सुरक्षा करते हैं। यदि मैं सही हूं, तो यह समझ में आता है कि आप केवल समझौता किए गए उपयोगकर्ताओं के कार्यस्थानों के हमलों से चिंतित हैं।

  • इसके अलावा, मैं आपको यह समझा रहा हूं कि यदि दूरस्थ क्लाइंट होस्ट पर कोई हमलावर रूट / व्यवस्थापक निजी को बढ़ा सकता है, या सीधे वास्तविक उपयोगकर्ता के खाते से समझौता कर सकता है, तो उस ग्राहक के डेटा में एन्क्रिप्शन या किसी अन्य सुरक्षा उपायों की परवाह किए बिना शून्य सुरक्षा है। (हमलावर डिस्क पर सहेजे गए स्थान से कुंजियों को पढ़ सकते हैं, या उन्हें स्नूप कर सकते हैं क्योंकि असली उपयोगकर्ता उन्हें लॉगऑन में प्रवेश करता है, और कुंजी डेटा तक ले जाती है।)

उन दो मान्यताओं से शुरू, यह हमारे लिए यह निष्कर्ष निकालने के लिए समझ में आता है कि केवल दो प्रासंगिक खतरे ए) जानवर बल पासवर्ड अनुमान लगा रहे हैं, और बी) एसक्यूएल इंजेक्शन प्रयास:

  • यदि हमलावर को वास्तविक उपयोगकर्ता की कुंजी का एनहोल्ड नहीं मिलता है, या यदि वह वास्तविक उपयोगकर्ता के डेटा से अधिक का उपयोग करना चाहता है, तो वह वास्तविक उपयोगकर्ता या किसी अन्य खाते के लिए ब्रूट-फोर्सिंग लॉगोन क्रेडिट की कोशिश कर सकता है। (सिद्धांत में आप प्रत्येक खाते को एक विशिष्ट दूरस्थ ग्राहक आईपी में बंद कर सकते हैं, जो जोखिमों को कम करने में मदद करेगा।)
  • यदि हमलावर को वास्तविक उपयोगकर्ता के लिए एक वैध कुंजी मिलती है, तो उसके पास संभावित छोटी गाड़ी ऐप कोड के सॉफ्ट अंडरबेली के लिए लॉगऑन स्क्रीन (जो कि संभवतः सुरक्षित होने के लिए पर्याप्त सरल है) में एक एवेन्यू है। वास्तविक उपयोगकर्ता के संदर्भ से एक सफल SQL इंजेक्शन उसे अन्य क्लाइंट डेटा तक भी पहुँच दे सकता है।

अब, चलिए इस बारे में बात करते हैं कि सर्वर-साइड एन्क्रिप्शन इन स्थितियों पर कैसे लागू होता है:

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

दूसरी ओर क्लाइंट एन्क्रिप्शन, वास्तव में ब्रूट फोर्स पासवर्ड हमलों को अप्रासंगिक बनाता है। आप सही ढंग से निर्मित कुंजी को ब्रूट-बल नहीं कर सकते। क्लाइंट-साइड एन्क्रिप्शन मूल रूप से सर्वर-साइड एन्क्रिप्शन के रूप में SQL इंजेक्शन के खिलाफ सुरक्षा का समान स्तर रखता है। क्लाइंट लॉगऑन पर सर्वर की कुंजी को पारित कर सकता है, सत्र समाप्त होने तक मेमोरी में एक कॉपी रखते हुए, जो सर्वर पर क्रिप्टो सीपीयू बोझ डालता है। या, क्लाइंट ब्राउज़र में स्वयं एन्क्रिप्शन / डिक्रिप्शन को संभाल सकता है। दोनों तकनीकों में उतार-चढ़ाव हैं:

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

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


1
वाह! अद्भुत और गहन उत्तर; आपका बहुत बहुत धन्यवाद। पिछले कुछ दिनों से, मैं कुछ विकल्पों पर विचार कर रहा हूं, और जैसा कि आपने सुझाया है, क्लाइंट-साइड समाधान को लागू करने का प्रयास करें। आदर्श रूप से, चाबियाँ अंगूठे ड्राइव पर संग्रहीत की जाएंगी, जो केवल तब माउंट की जाएंगी जब कोई उपयोगकर्ता सिस्टम पर काम कर रहा हो (शारीरिक सुरक्षा बहुत तंग है) और कुंजी केवल मेमोरी में आयोजित होती है जब तक कि सत्र रहता है। आइडिया यह है कि कुंजी केवल सिस्टम में काम के घंटों के दौरान सुलभ होगी जब मैं ट्रैफिक की निगरानी के लिए वहां हूं, आदि
तूफानी

2

आप ezNcrypt को देखना चाहते हैं , जो MySQL डेटाबेस और अन्य प्रक्रियाओं के लिनक्स एन्क्रिप्शन के लिए उच्च सुरक्षा और प्रदर्शन प्रदान करने के लिए ecryptfs, एक्सेस कंट्रोल और मुख्य प्रबंधन का उपयोग करता है। नहीं, मैं उनके लिए काम नहीं करता।


2

आप Scytale का उपयोग कर सकते हैं। यह आधुनिक DBMS और वेब अनुप्रयोगों के लिए एक NoSQL crypto प्रॉक्सी है। बहु-प्राप्तकर्ता और समूह एन्क्रिप्शन का समर्थन करता है। एक मजबूत आरएसए / एईएस क्रिप्टो सिस्टम के साथ भरी हुई। यह 100% मुक्त और खुला-स्रोत भी है।

https://bitbucket.org/maximelabelle/scytale

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.