पहला , जैसा कि कई लोग पहले ही कह चुके हैं, साख को स्क्रिप्ट से अलग रखना जरूरी है। (बढ़ी हुई सुरक्षा के अलावा, इसका मतलब यह भी है कि आप एक ही स्क्रिप्ट को विभिन्न क्रेडेंशियल वाली कई प्रणालियों के लिए फिर से इस्तेमाल कर सकते हैं)
दूसरा , आपको न केवल क्रेडेंशियल्स की सुरक्षा पर विचार करना चाहिए, बल्कि उन क्रेडेंशियल्स से समझौता किए जाने पर भी प्रभाव पड़ेगा। आपके पास डेटाबेस तक सभी पहुंच के लिए सिर्फ एक पासवर्ड नहीं होना चाहिए, आपके पास अलग-अलग स्तर के एक्सेस के साथ अलग-अलग क्रेडेंशियल्स होने चाहिए। उदाहरण के लिए, आपके पास एक डीबी उपयोगकर्ता हो सकता है जो डेटाबेस में खोज करने की क्षमता रखता है - उस उपयोगकर्ता के पास केवल-पढ़ने के लिए उपयोग होना चाहिए। किसी अन्य उपयोगकर्ता के पास नए रिकॉर्ड सम्मिलित करने की अनुमति हो सकती है, लेकिन उन्हें हटाने के लिए नहीं। किसी तीसरे व्यक्ति के पास रिकॉर्ड हटाने की अनुमति हो सकती है।
प्रत्येक खाते के लिए अनुमतियों को प्रतिबंधित करने के अलावा, आपको इस बात पर भी प्रतिबंध होना चाहिए कि प्रत्येक खाते का उपयोग कहां से किया जा सकता है। उदाहरण के लिए, आपके वेब सर्वर द्वारा उपयोग किए जाने वाले खाते को वेब सर्वर की तुलना में किसी अन्य आईपी पते से कनेक्ट करने की अनुमति नहीं दी जानी चाहिए। डेटाबेस के लिए पूर्ण रूट अनुमतियों वाला एक खाता वास्तव में बहुत प्रतिबंधित होना चाहिए, जहां से यह कनेक्ट हो सकता है और कभी भी इंटरेक्टिव रूप से उपयोग नहीं किया जाना चाहिए। डेटाबेस में संग्रहीत प्रक्रियाओं का उपयोग करने पर भी विचार करें ताकि यह सुनिश्चित किया जा सके कि प्रत्येक खाते द्वारा क्या किया जा सकता है।
इन प्रतिबंधों को सिस्टम के DB-सर्वर साइड पर लागू करने की आवश्यकता है, ताकि क्लाइंट पक्ष से समझौता करने पर भी प्रतिबंधों को इससे बदला नहीं जा सके। (और, जाहिर है, डीबी सर्वर को डीबी कॉन्फ़िगरेशन के अलावा फायरवॉल आदि के साथ संरक्षित करने की आवश्यकता है ...)
एक डीबी खाते के मामले में जिसे केवल सीमित रीड-ओनली एक्सेस की अनुमति है, और केवल एक विशेष आईपी पते से, आपको डेटा की संवेदनशीलता और होस्ट की स्क्रिप्ट की सुरक्षा के आधार पर, इससे आगे किसी भी क्रेडेंशियल्स की आवश्यकता नहीं हो सकती है। से चलाया जा रहा है। एक उदाहरण आपकी वेब साइट पर एक खोज फ़ॉर्म हो सकता है, जिसे एक उपयोगकर्ता के साथ चलाया जा सकता है जिसे केवल एक संग्रहीत प्रक्रिया का उपयोग करने की अनुमति है जो केवल उस जानकारी को निकालता है जिसे वेब पेज पर प्रस्तुत किया जाएगा। इस स्थिति में, पासवर्ड जोड़ना वास्तव में किसी भी अतिरिक्त सुरक्षा प्रदान नहीं करता है, क्योंकि यह जानकारी पहले से ही सार्वजनिक है, और उपयोगकर्ता किसी अन्य डेटा तक नहीं पहुंच सकता है जो अधिक संवेदनशील होगा।
यह भी सुनिश्चित करें कि डेटाबेस का कनेक्शन टीएलएस का उपयोग करके बनाया गया है, या नेटवर्क पर सुनने वाला कोई भी व्यक्ति आपकी साख प्राप्त कर सकता है।
तीसरा , विचार करें कि किस तरह की साख का उपयोग करना है। पासवर्ड केवल एक रूप हैं, और सबसे सुरक्षित नहीं हैं। इसके बजाय आप सार्वजनिक / निजी कुंजी जोड़ी, या AD / PAM या पसंद के कुछ रूप का उपयोग कर सकते हैं।
चौथा , उन शर्तों पर विचार करें जिनके तहत स्क्रिप्ट को चलाया जाएगा:
यदि यह अंतःक्रियात्मक रूप से चलाया जाता है, तो आपको पासवर्ड, या पासवर्ड को निजी कुंजी, या निजी कुंजी में दर्ज करना चाहिए, या वैध केर्बरोस टिकट के साथ लॉग इन किया जाना चाहिए, जब आप इसे चलाते हैं - दूसरे शब्दों में, स्क्रिप्ट को इसे प्राप्त करना चाहिए। उस समय आपसे सीधे तौर पर क्रेडेंशियल्स, जो आप इसे चलाते हैं, बजाय उन्हें किसी फ़ाइल से पढ़ने के।
यदि यह एक वेबसर्वर से चलाया जाता है, तो उस समय क्रेडेंशियल्स सेट करने पर विचार करें जब आप वेबसर्वर शुरू करते हैं। यहां एक अच्छा उदाहरण एसएसएल प्रमाणपत्र है - उनके पास एक सार्वजनिक प्रमाण पत्र और एक निजी कुंजी है, और निजी कुंजी में एक पासवर्ड है। आप वेबसर्वर पर निजी कुंजी संग्रहीत कर सकते हैं, लेकिन अपाचे शुरू करने के बाद भी आपको पासवर्ड दर्ज करना होगा। आप किसी प्रकार के हार्डवेयर, जैसे भौतिक कार्ड या HSM पर भी क्रेडेंशियल रख सकते हैं, जिसे सर्वर के चालू होने के बाद हटाया या लॉक किया जा सकता है। (बेशक, इस विधि के लिए नकारात्मक पक्ष यह है कि सर्वर कुछ भी होने पर अपने आप को पुनरारंभ नहीं कर सकता है। मैं इसे अपने सिस्टम से समझौता होने के जोखिम के लिए पसंद करूंगा, लेकिन आपका माइलेज भिन्न हो सकता है ...)
यदि स्क्रिप्ट को क्रोन से चलाया जा रहा है, तो यह कठिन हिस्सा है। आप नहीं चाहते हैं कि आपके सिस्टम में कहीं भी क्रेडेंशियल्स पड़े हों, जहां कोई उन्हें एक्सेस कर सके - लेकिन क्या आप चाहते हैं कि वे चारों ओर झूठ बोलें ताकि आपकी स्क्रिप्ट उन्हें एक्सेस कर सके, है ना? खैर, बिल्कुल सही नहीं है। ठीक से विचार करें कि स्क्रिप्ट क्या कर रही है। डेटाबेस को इसकी क्या अनुमति चाहिए? क्या इसे प्रतिबंधित किया जा सकता है ताकि कोई फर्क न पड़े कि गलत व्यक्ति उन अनुमतियों से जुड़ता है या नहीं? क्या आप इसके बजाय उस स्क्रिप्ट को सीधे DB सर्वर पर चला सकते हैं, जिस तक किसी और की पहुंच नहीं है, बजाय उस सर्वर से जिसके अन्य उपयोगकर्ता हैं? यदि किसी कारण है कि मैं सोच भी नहीं सकते, तो आप पूरी तरह चाहिए स्क्रिप्ट चल रहा है एक असुरक्षित सर्वर पर है और यह करना चाहिए कुछ खतरनाक / विनाशकारी करने में सक्षम हो ... अब अपनी वास्तुकला पर फिर से विचार करने का एक अच्छा समय है।
पांचवां , यदि आप अपने डेटाबेस की सुरक्षा को महत्व देते हैं, तो आपको इन लिपियों को उन सर्वरों पर नहीं चलाना चाहिए, जिनकी अन्य लोगों तक पहुंच है। यदि कोई आपके सिस्टम में लॉग इन है, तो उन्हें आपके क्रेडेंशियल्स पर प्राप्त करने की संभावना होगी । उदाहरण के लिए, एसएसएल प्रमाणपत्र के साथ एक वेबसर्वर के मामले में, किसी के पास रूट हासिल करने और httpd प्रक्रिया के मेमोरी क्षेत्र तक पहुंचने और क्रेडेंशियल्स को निकालने में सक्षम होने की कम से कम एक सैद्धांतिक संभावना है। हाल के दिनों में कम से कम एक शोषण हुआ है जहां ऐसा एसएसएल पर किया जा सकता है, यहां तक कि हमलावर को लॉग इन करने की भी आवश्यकता नहीं है।
इसके अलावा SELinux या apparmor का उपयोग करने पर विचार करें या जो कुछ भी आपके सिस्टम के लिए उपलब्ध है उसे प्रतिबंधित करें जो उपयोगकर्ता कर सकते हैं। वे उपयोगकर्ताओं को डेटाबेस से कनेक्ट करने का प्रयास करने के लिए भी अस्वीकार कर सकते हैं, भले ही वे क्रेडेंशियल्स तक पहुंच प्राप्त करने का प्रबंधन करते हों।
यदि यह सब आपको लगता है , और आप इसे बर्दाश्त नहीं कर सकते हैं या करने का समय नहीं है - तो, मेरी (अभिमानी और अभिजात्य) राय में, आपको अपने डेटाबेस में महत्वपूर्ण या संवेदनशील कुछ भी संग्रहीत नहीं करना चाहिए। और अगर आप कुछ भी महत्वपूर्ण या संवेदनशील नहीं जमा कर रहे हैं, तो जहाँ आप अपनी साख जमाते हैं, वह भी महत्वपूर्ण नहीं है - किस स्थिति में, एक पासवर्ड का उपयोग क्यों करें?
अंत में , यदि आप किसी तरह की साख जमा करने से बिल्कुल नहीं बच सकते हैं, तो आपके पास केवल और केवल जड़ के स्वामित्व वाली क्रेडेंशियल्स ही हो सकती हैं, जब कोई स्क्रिप्ट द्वारा ऐसा करने का अनुरोध किया जाता है, तो रूट और रूट एक अत्यधिक अस्थायी आधार पर स्वामित्व दे सकते हैं (क्योंकि आपकी स्क्रिप्ट नहीं होनी चाहिए जब तक बिल्कुल आवश्यक न हो, रूट के रूप में चलाएं और डेटाबेस से कनेक्ट करना आवश्यक नहीं है)। लेकिन यह अभी भी एक अच्छा विचार नहीं है।