हमारे पिछले लेख, द रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स में, हमने आपको दिखाया कि पर्यावरण चर प्रणाली कैसे काम करती है, और कुछ सामान्य मिथकों का भंडाफोड़ किया। लेकिन जैसा कि एक मददगार पाठक ने बताया, हमने सुरक्षा के बारे में ज्यादा कुछ नहीं कहा।
चूंकि गुप्त एपीआई कुंजी और अन्य मूल्यवान जानकारी संग्रहीत करने के लिए env vars का उपयोग करना आम हो गया है, इसलिए सुरक्षा प्रभावों को समझना महत्वपूर्ण है। आइए एक नज़र डालते हैं:
सबसे खराब स्थिति परिदृश्य
कल्पना करें कि एक हैकर ने रूट के रूप में या आपके वेब एप्लिकेशन के स्वामी के रूप में आपके सर्वर तक पहुंच प्राप्त कर ली है। उस स्थिति में, आपके पर्यावरण चरों से समझौता किया जाएगा, साथ ही अन्य सभी चीजें जो अत्यधिक एन्क्रिप्टेड नहीं हैं।
यहां समाधान यह है कि लोगों को आपके सर्वर तक रूट एक्सेस करने से रोका जाए। :)पी>
ट्रोजन हॉर्स
डॉक द्वारा एक गली में मिले किसी व्यक्ति ने आपको इमेजमैजिक का एक विशेष सूप-अप संस्करण दिया। उनका दावा है कि यह स्टॉक इमेजमैजिक से दुगनी तेजी से चलेगी।
...तो तुम वही करो जो कोई करेगा। आप इसे उत्पादन में स्थापित करते हैं। एकमात्र समस्या यह है कि इसे आपके पर्यावरण चर को चुराने के लिए डिज़ाइन किया गया है।
यहां, मैं बैक-टिक सिंटैक्स का उपयोग करके रूबी से अपना "दुर्भावनापूर्ण" mogrify कमांड चला रहा हूं। Mogrify फिर मेरे पर्यावरण चर चुरा लेता है, और एक ताना देने वाला संदेश प्रिंट करता है।
पर्यावरण चर पैरेंट प्रोसेस (irb) से चाइल्ड पोज़ (mogrify) में कॉपी हो जाते हैं
यह वास्तव में "हैक" नहीं है। इस तरह पर्यावरण चर काम करते हैं। वे मूल प्रक्रिया से बाल प्रक्रिया में कॉपी हो जाते हैं। यदि आप मैलवेयर चलाते हैं, तो वे किसी भी अन्य ऐप की तरह ही पर्यावरण चर को इनहेरिट करेंगे।
ऐसा होने के दो तरीके हैं:
-
कोई व्यक्ति आपको अपने टूलचेन में दुर्भावनापूर्ण सॉफ़्टवेयर का एक टुकड़ा स्थापित करने के लिए मना लेता है
-
आपके टूलचैन के "सौम्य" टुकड़े में एक भेद्यता है और इसका उपयोग आपके पर्यावरण चर को प्रकट करने के लिए किया जाता है।
वास्तविक समाधान उन दोनों में से किसी को भी होने से रोकने में सक्रिय होना है। लेकिन एक एहतियाती कदम है जिससे आप नुकसान को सीमित करने के लिए उठा सकते हैं यदि कुछ ENV चोरी करने वाले डाकू आपके टूलचेन में बंद हो जाते हैं।
पर्यावरण को स्वच्छ बनाना
जब भी आप इमेजमैजिक या किसी अन्य प्रोग्राम को चलाने के लिए रूबी से बाहर निकलते हैं, तो उस प्रोग्राम को आपके ऐप के ईएनवी की एक प्रति विरासत में मिलती है। यदि आपके पास ENV में कोई रहस्य है, तो वह उसे भी प्राप्त कर लेगा। जब तक आप उन्हें बाहर नहीं निकाल देते।
जब आप नई प्रक्रिया बनाते हैं, तो सिस्टम विधि में हैश पास करके आप विशिष्ट पर्यावरण चर को ओवरराइड कर सकते हैं:
रूबी के सिस्टम मेथड में कस्टम एनवायरनमेंट वेरिएबल कैसे पास करें
यदि आप शेल आउट करते समय कोई पर्यावरण चर भेजना बंद करना चाहते हैं, तो आप नीचे दिए गए उदाहरण की तरह कुछ कर सकते हैं। यहां हम एक हैश बनाते हैं जो ENV को प्रतिबिंबित करता है, सिवाय इसके कि इसके सभी मान शून्य पर सेट किए गए हैं। यह सुंदर नहीं है, लेकिन शेल कमांड निष्पादित करते समय सभी env vars को हटाने का यही एकमात्र तरीका है।
जब आप रूबी से शेल कमांड चलाते हैं तो किसी भी पर्यावरण चर को भेजने से कैसे रोकें
बच्चे को नहाने के पानी से बाहर न फेंकें
वंशानुक्रम ENV चरों की सबसे उपयोगी विशेषताओं में से एक है।
मान लीजिए कि आपको एक कमांड चलाने की जरूरत है जो S3 को लिखता है। एनवायरनमेंट वैरिएबल इनहेरिटेंस का मतलब है कि कमांड आपके रूबी ऐप से एपीआई कीज़ को सहज तरीके से शेयर कर सकता है। यदि आपने कभी विरासत की अनुमति नहीं दी तो आप उस क्षमता को खो देंगे।
दृढ़ता
प्रत्येक प्रक्रिया में पर्यावरण चर का अपना सेट होता है जो प्रक्रिया के समाप्त होने पर मर जाता है। आप अपने रूबी ऐप में पर्यावरण चर सेट कर सकते हैं, लेकिन जैसे ही वह ऐप बंद होगा, वे गायब हो जाएंगे।
यदि आपको रिबूट के बाद आसपास रहने के लिए एक पर्यावरण चर की आवश्यकता है, तो इसे कहीं संग्रहीत करने की आवश्यकता है। वह आमतौर पर फाइल सिस्टम पर कहीं होता है।
अपने ऐप के git रेपो का उपयोग न करें
मुझे यकीन है कि जीथब के लोग हममें से बाकी लोगों की तरह ईमानदार हैं, लेकिन क्या आप वास्तव में चाहते हैं कि आपके स्रोत कोड तक पहुंच रखने वाले सभी लोग आपकी एपीआई कुंजी प्राप्त करने और $10,000 का एडब्ल्यूएस बिल चलाने में सक्षम हों?
सीक्रेट्स के लिए .bashrc या .bash-profile का उपयोग करने से बचें
जब आप .bashrc जैसी फ़ाइलों में रहस्यों को संग्रहीत करते हैं, तो वे उस उपयोगकर्ता के रूप में आपके द्वारा चलाए जाने वाले प्रत्येक प्रोग्राम में पर्यावरण चर के रूप में भेजे जाते हैं। इनमें से अधिकांश कार्यक्रमों को आपके रहस्यों को जानने की आवश्यकता नहीं है। तो उन्हें उन्हें क्यों दें?
अपने रहस्यों को केवल उन्हीं प्रक्रियाओं के सामने प्रकट करें जिनकी उन्हें आवश्यकता है
यदि आपका रेल ऐप ही एकमात्र ऐसी प्रक्रिया है जिसके लिए आपके HONEYBADGER_API_KEY को जानना आवश्यक है, तो इसे केवल उस प्रक्रिया के लिए उपलब्ध कराना एक अच्छा विचार है।
ऐसे कई रत्न हैं जो आपको रेल शुरू होने पर लोड की गई फ़ाइल में पर्यावरण चर जोड़ने देते हैं। ये env var केवल आपकी रेल प्रक्रिया और इसकी बाल प्रक्रियाओं के लिए उपलब्ध हैं। द रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स के निचले भाग में फिगारो और डॉटनव रत्नों पर एक अनुभाग है।
अपनी कॉन्फ़िगरेशन फ़ाइलें सुरक्षित करें
यदि आप किसी कॉन्फ़िगरेशन फ़ाइल से अपना परिवेश लोड कर रहे हैं, तो आप यह सुनिश्चित करना चाहेंगे कि इसकी अनुमतियाँ सेट की गई हैं ताकि यह केवल आपके वेब ऐप को चलाने वाले उपयोगकर्ता द्वारा ही पठनीय हो।
यहां, मैं अपनी कॉन्फ़िगरेशन फ़ाइल को केवल उस उपयोगकर्ता द्वारा पठनीय और लिखने योग्य बना रहा हूं जिसने इसे बनाया है। इस मामले में, यह वही उपयोगकर्ता है जो मेरे रेल एप्लिकेशन का स्वामी है:
कॉन्फ़िगरेशन फ़ाइलों को केवल उस उपयोगकर्ता द्वारा पढ़ने योग्य बनाएं जिन्हें उन्हें पढ़ने की आवश्यकता है
चूंकि आप इसे जीथब में चेक नहीं कर रहे हैं, इसलिए आपको सर्वर में या तो एसएसएच की आवश्यकता होगी और इसे मैन्युअल रूप से संपादित करना होगा या इसे अपने लिए प्रबंधित करने के लिए शेफ जैसे टूल का उपयोग करना होगा।
जहां संभव हो वहां "फ़ायरवॉल" बनाएं
एडब्ल्यूएस के बारे में वास्तव में महान चीजों में से एक यह है कि यह आपको एक्सेस कंट्रोल नीतियां बनाने की सुविधा देता है जो सुपर ग्रेन्युलर हैं। बहुत से सेवा प्रदाताओं के पास इस तरह की विशेषताएं हैं।
इसका क्या मतलब है? इसका मतलब है कि आपके पास एपीआई कुंजियों का एक सेट हो सकता है जो केवल उनके पास S3 पर एक बकेट में अपलोड करने की अनुमति देगा। आपको अलग-अलग गतिविधियों के लिए अलग-अलग की-पेयर्स बनानी चाहिए। छवियों को अपलोड करने के लिए एक कीपेयर। आपके डेटाबेस बैकअप के लिए एक और। और इसी तरह।
इस तरह से संचालन करके आप किसी एक सुरक्षा उल्लंघन के नुकसान को सीमित कर सकते हैं।