
पासवर्ड रखना हमेशा से सिरदर्द रहा है। क्लासिक संस्करण में, आपके पास एक ऐसा उपयोगकर्ता होता है जो बहुत प्रयास कर रहा है कि वह इस गुप्त पासवर्ड "qwerty123" को भूल न जाए और इस पासवर्ड से हैश को स्टोर कर ले। एक अच्छी प्रणाली भी सावधानी से नमक हैश करता है ताकि बुरे लोगों के जीवन को जहर दिया जा सके जो हैशेड पासवर्ड वाले डेटाबेस को चुरा सकते हैं। यहाँ सब कुछ स्पष्ट है। कुछ पासवर्ड सिर में जमा होते हैं, और कुछ कोकैप में एन्क्रिप्ट किया जाता है।
जब हम योजना से एक व्यक्ति को निकालते हैं, तो सब कुछ बदल जाता है, जो कागज के एक टुकड़े से कुंजी को सावधानीपूर्वक दर्ज करता है। दो सूचना प्रणालियों की बातचीत में, किसी भी स्थिति में, पासवर्ड को सिस्टम के लिए एक खुले रूप में क्लाइंट की तरफ संग्रहीत किया जाना चाहिए ताकि इसे प्रेषित किया जा सके और संदर्भ हैश के साथ तुलना की जा सके। और इस स्तर पर, व्यवस्थापक आमतौर पर एक साइकिल निर्माण संयंत्र की स्थानीय शाखा को खोलते हैं और स्क्रिप्ट कोड में गुप्त कुंजी को सावधानीपूर्वक छिपाने, बाधित करने और दफनाने लगते हैं। इनमें से कई विकल्प न केवल बेकार हैं, बल्कि खतरनाक भी हैं। मैं अजगर के लिए इस समस्या का एक सुविधाजनक और सुरक्षित समाधान देने की कोशिश करूंगा। और थोड़ा पॉवरशेल पर टच करें।
कैसे नहीं करना है
हर कोई "अस्थायी पटकथा" की अवधारणा से परिचित है। यहां, शाब्दिक रूप से, केवल डेटा को डेटाबेस से जल्दी से पार्स किया जा सकता है और हटा दिया जा सकता है। और फिर अचानक यह पता चलता है कि स्क्रिप्ट देव क्षेत्र से उत्पादन में पहले ही कहीं चली गई है। और फिर प्रारंभिक "डिस्पोज़ेबिलिटी" से अप्रिय आश्चर्य उभरने लगता है।
सबसे आम विकल्प की शैली में है:
db_login = 'john.doe' password = 'password!'
समस्या यह है कि यहाँ पासवर्ड स्पष्ट रूप से चमकता है और स्वचालित खोज द्वारा पुरानी लिपियों के जमाव के बीच काफी आसानी से पाया जाता है। थोड़ा और अधिक जटिल संस्करण अस्पष्टता के माध्यम से सुरक्षा के मार्ग का अनुसरण करता है, कोड में एक एन्क्रिप्टेड रूप में संग्रहीत पासवर्ड के साथ। इस स्थिति में, डिक्रिप्शन बैक को तुरंत किया जाना चाहिए, अन्यथा क्लाइंट इस पासवर्ड को सर्वर साइड में प्रस्तुत करने में सक्षम नहीं होगा। यह विधि एक आकस्मिक लुक से अधिकतम बचाएगी, लेकिन मैन्युअल रूप से कोड का कोई भी गंभीर विश्लेषण आपको आसानी से गुप्त कुंजी निकालने की अनुमति देगा। नीचे दिए गए कोड केवल "कंधे सर्फर्स" से बचाएंगे:
>>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password
सबसे अप्रिय परिदृश्य संवेदनशील जानकारी के साथ ऐसी फ़ाइलों के लिए संस्करण नियंत्रण प्रणाली, जैसे गिट का उपयोग है। भले ही लेखक सभी पासवर्डों को खाली करने का फैसला करता है, लेकिन वे भंडार के इतिहास में बने रहेंगे। वास्तव में, यदि आप गिट में गुप्त डेटा के साथ एक फ़ाइल चलाते हैं, तो आप स्वचालित रूप से उन्हें समझौता करने पर विचार कर सकते हैं और तुरंत सभी प्रभावित क्रेडेंशियल्स को बदलने के लिए प्रक्रिया शुरू कर सकते हैं।
सिस्टम स्टोरेज का उपयोग करना
एक शांत
कीरिंग लाइब्रेरी है। ऑपरेशन का मूल सिद्धांत इस तथ्य पर आधारित है कि ओएस के प्रत्येक उपयोगकर्ता का अपना एन्क्रिप्टेड स्टोरेज है, जिसकी पहुंच उपयोगकर्ता द्वारा सिस्टम में लॉग करने के बाद ही संभव है। यह क्रॉस-प्लेटफ़ॉर्म है और ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए पासवर्ड को संग्रहीत करने के लिए बैकएंड का उपयोग करेगा:
- KDE4 और KDE5 KWallet (dbus आवश्यक)
- फ़्रीडेस्कटॉप सीक्रेट सर्विस - GNOME सहित कई DE
- विंडोज क्रेडेंशियल लॉकर
- macOS किचेन
आप
वैकल्पिक बैकएंड का उपयोग भी कर सकते हैं या अपना खुद का लिख सकते हैं, अगर बिल्कुल कुछ अजीब चाहिए।
हमले की कठिनाई की तुलना करें
पासवर्ड को सीधे स्क्रिप्ट में संग्रहीत करते समय, आपको आवश्यकता होती है :
- कोड को स्वयं चुराएं (आसान)
- यदि आवश्यक हो (तो आसान है)
स्थानीय कीरिंग का उपयोग करते समय, एक हमलावर को निम्न की आवश्यकता होती है:- कोड को स्वयं चुराएं (आसान)
- यदि आवश्यक हो (तो आसान है)
- हमलावर उपयोगकर्ता (मुश्किल) के रूप में लॉग इन करके स्थानीय मशीन से समझौता करना
सैद्धांतिक रूप से, स्थानीय संग्रहण तक पहुंच वर्तमान उपयोगकर्ता की ओर से चल रहे किसी भी स्थानीय कार्यक्रम द्वारा प्राप्त की जा सकती है, यदि वह गुप्त पासवर्ड के लिए एक्सेस सेटिंग्स जानता है। हालांकि, यह कोई समस्या नहीं है, क्योंकि एक समझौता किए गए खाते की स्थिति में, एक हमलावर सभी संवेदनशील डेटा को बाधित करने में सक्षम होगा। अन्य उपयोगकर्ताओं और उनके सॉफ़्टवेयर का उपयोग स्थानीय कीस्टॉर तक नहीं होगा।
उदाहरण का उपयोग करें
import argparse import getpass import keyring def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--newpass", required=False, help="Set new password", action="store_true") arguments = parser.parse_args() return arguments def fake_db_connection():
पासवर्ड सुरक्षा
एक और आम गुप्त पासवर्ड लीक कमांड लाइन का इतिहास है। यहाँ मानक इनपुट का उपयोग करने की अनुमति नहीं है:
age = input("What is your age? ") print "Your age is: ", age type(age) >>output What is your age? 100 Your age is: 100 type 'int'>
ऊपर के उदाहरण में, मैंने पहले ही
गेटपास लाइब्रेरी का उल्लेख किया है:
इसका उपयोग करते समय डेटा दर्ज करना लॉगिन पर क्लासिक * निक्स दृष्टिकोण के समान है। किसी भी सिस्टम लॉग में डेटा किसी भी स्क्रीन पर लिखा या प्रदर्शित नहीं होता है।
पॉवरशेल के बारे में एक छोटी सी
पॉवर्सशेल के लिए, सही विकल्प मानक विंडोज क्रेडेंशियल लॉकर का उपयोग करना है।
यह
क्रेडेंशियल मैनजर मॉड्यूल द्वारा कार्यान्वित किया जाता है।
उपयोग उदाहरण:
Install-Module CredentialManager -force New-StoredCredential -Target $url -Username $ENV:Username -Pass .... Get-StoredCredential -Target ....