पासवर्ड और अन्य रहस्यों को संग्रहीत करने के लिए कुछ विकल्प हैं जिन्हें पायथन प्रोग्राम का उपयोग करने की आवश्यकता है, विशेष रूप से एक प्रोग्राम जिसे पृष्ठभूमि में चलाने की आवश्यकता है जहां यह उपयोगकर्ता को पासवर्ड टाइप करने के लिए नहीं कह सकता है।
समस्याओं से बचने के लिए:
- पासवर्ड को स्रोत नियंत्रण में जाँचना जहां अन्य डेवलपर्स या यहां तक कि जनता इसे देख सकती है।
- एक कॉन्फ़िगरेशन फ़ाइल या स्रोत कोड से पासवर्ड पढ़ने वाले एक ही सर्वर पर अन्य उपयोगकर्ता।
- किसी स्रोत फ़ाइल में पासवर्ड होने से जहाँ आप इसे संपादित कर रहे हैं, वहीं अन्य इसे अपने कंधे पर देख सकते हैं।
विकल्प 1: एसएसएच
यह हमेशा एक विकल्प नहीं है, लेकिन यह शायद सबसे अच्छा है। आपकी निजी कुंजी कभी भी नेटवर्क पर प्रसारित नहीं होती है, SSH सिर्फ यह साबित करने के लिए गणितीय गणना करता है कि आपके पास सही कुंजी है।
इसे काम करने के लिए, आपको निम्नलिखित की आवश्यकता होगी:
- डेटाबेस या आप जो भी एक्सेस कर रहे हैं, उसे SSH द्वारा एक्सेस करने की आवश्यकता है। "एसएसएच" के लिए खोज करें जो भी सेवा आप एक्सेस कर रहे हैं। उदाहरण के लिए, "ssh postgresql" । यदि आपके डेटाबेस में यह सुविधा नहीं है, तो अगले विकल्प पर जाएँ।
- उस सेवा को चलाने के लिए एक खाता बनाएं जो डेटाबेस को कॉल करेगा, और एक एसएसएच कुंजी उत्पन्न करेगा ।
- या तो उस सेवा में सार्वजनिक कुंजी जोड़ें जिसे आप कॉल करने जा रहे हैं, या उस सर्वर पर एक स्थानीय खाता बनाएं, और वहां सार्वजनिक कुंजी स्थापित करें।
विकल्प 2: पर्यावरण चर
यह सबसे सरल है, इसलिए यह शुरू करने के लिए एक अच्छी जगह हो सकती है। यह बारह फैक्टर ऐप में अच्छी तरह से वर्णित है । मूल विचार यह है कि आपका स्रोत कोड केवल पर्यावरण चर से पासवर्ड या अन्य रहस्यों को खींचता है, और फिर आप प्रत्येक सिस्टम पर उन पर्यावरण चर को कॉन्फ़िगर करते हैं जहां आप प्रोग्राम चलाते हैं। यदि आप डिफ़ॉल्ट मान का उपयोग करते हैं तो यह एक अच्छा स्पर्श भी हो सकता है जो अधिकांश डेवलपर्स के लिए काम करेगा। आपको अपने सॉफ़्टवेयर को "डिफ़ॉल्ट रूप से सुरक्षित" बनाने के विरुद्ध संतुलन बनाना होगा।
यहां एक उदाहरण है जो पर्यावरण चर से सर्वर, उपयोगकर्ता नाम और पासवर्ड को खींचता है।
import os
server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')
db_connect(server, user, password)
अपने ऑपरेटिंग सिस्टम में पर्यावरण चर कैसे सेट करें, और अपने खाते के तहत सेवा चलाने पर विचार करें। जब आप अपने खाते में प्रोग्राम चलाते हैं तो इस तरह से आपके पास पर्यावरण चर में संवेदनशील डेटा नहीं होता है। जब आप उन पर्यावरण चर को सेट करते हैं, तो अतिरिक्त ध्यान रखें कि अन्य उपयोगकर्ता उन्हें नहीं पढ़ सकते हैं। उदाहरण के लिए फ़ाइल अनुमतियों की जाँच करें। बेशक रूट अनुमति वाले कोई भी उपयोगकर्ता उन्हें पढ़ पाएंगे, लेकिन उनकी मदद नहीं की जा सकती।
विकल्प 3: कॉन्फ़िगरेशन फ़ाइलें
यह पर्यावरण चर के समान है, लेकिन आप पाठ फ़ाइल के रहस्यों को पढ़ते हैं। मुझे अभी भी तैनाती के उपकरण और निरंतर एकीकरण सर्वर जैसी चीजों के लिए पर्यावरण चर अधिक लचीला लगता है। यदि आप एक कॉन्फ़िगरेशन फ़ाइल का उपयोग करने का निर्णय लेते हैं, तो पायथन मानक लाइब्रेरी में कई स्वरूपों का समर्थन करता है, जैसे JSON , INI , netrc , और XML । आप PyYAML और TOML जैसे बाहरी पैकेज भी पा सकते हैं । व्यक्तिगत रूप से, मुझे JSON और YAML का उपयोग करने के लिए सबसे सरल लगता है, और YAML टिप्पणियों की अनुमति देता है।
कॉन्फ़िगरेशन फ़ाइलों के साथ विचार करने के लिए तीन चीजें:
- फाइल कहां है? हो सकता है कि एक
~/.my_app
अलग स्थान का उपयोग करने के लिए एक डिफ़ॉल्ट स्थान , और एक कमांड-लाइन विकल्प।
- सुनिश्चित करें कि अन्य उपयोगकर्ता फ़ाइल नहीं पढ़ सकते हैं।
- जाहिर है, स्रोत कोड के लिए कॉन्फ़िगरेशन फ़ाइल प्रतिबद्ध नहीं है। आप ऐसा टेम्प्लेट करना चाहते हैं जिसे उपयोगकर्ता अपने होम डायरेक्टरी में कॉपी कर सकें।
विकल्प 4: पायथन मॉड्यूल
कुछ परियोजनाओं ने अपने रहस्यों को ठीक पायथन मॉड्यूल में डाल दिया।
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
फिर मान प्राप्त करने के लिए उस मॉड्यूल को आयात करें।
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
इस तकनीक का उपयोग करने वाला एक प्रोजेक्ट Django है । जाहिर है, आपको settings.py
स्रोत नियंत्रण के लिए प्रतिबद्ध नहीं होना चाहिए , हालांकि आप एक फाइल करना चाहते हैं जिसे settings_template.py
उपयोगकर्ता कॉपी और संशोधित कर सकते हैं।
मैं इस तकनीक के साथ कुछ समस्याओं को देखता हूं:
- डेवलपर्स गलती से फ़ाइल को स्रोत नियंत्रण के लिए प्रतिबद्ध कर सकते हैं। इसे जोड़ना
.gitignore
उस जोखिम को कम करता है।
- आपका कुछ कोड स्रोत नियंत्रण में नहीं है। यदि आप अनुशासित हैं और केवल तार और संख्याएँ यहाँ डालते हैं, तो यह समस्या नहीं होगी। यदि आप यहां लॉगिंग फिल्टर क्लासेस लिखना शुरू करते हैं, तो रुकें!
यदि आपकी परियोजना पहले से ही इस तकनीक का उपयोग करती है, तो पर्यावरण चर के लिए संक्रमण करना आसान है। बस पर्यावरण चर के लिए सभी सेटिंग मानों को स्थानांतरित करें, और उन पर्यावरण चर से पढ़ने के लिए पायथन मॉड्यूल को बदलें।