2013-03-04 7 views
29

मेरे जीवन के लिए, मैं इसे हर जगह ढूंढ रहा हूं और जवाब नहीं मिला है। मुझे आशा है कि मैं डुप्लिकेट पोस्ट नहीं कर रहा हूं।गुप्त कुंजी स्टोर करने के लिए कहां DJANGO

यह हर जगह सलाह दी जाती है कि आपको अपनी गुप्त कुंजी को अपनी सामान्य सेटिंग्स से अलग फ़ाइल में रखना चाहिए। साथ ही, आपको अपनी "गुप्त.py" फ़ाइल कभी भी नहीं लेनी चाहिए जिसमें SECRET_KEY, AWS_SECRET_KEY जैसी कुंजी शामिल हैं।

मेरा प्रश्न है: आपके उत्पादन सर्वर में, आपको अपनी गुप्त कुंजी का संदर्भ देने की आवश्यकता है, इसका मतलब है कि आपकी "गुप्त.py" सेटिंग्स फ़ाइल, सर्वर के आसपास कहीं भी रहनी चाहिए? यदि हां, तो आप उत्पादन में अपनी गुप्त कुंजी की रक्षा कैसे करते हैं?

उत्तर

18

उत्पादन के लिए कुछ विकल्प हैं। जिस तरह से मैं करता हूं वह मेरे संवेदनशील डेटा वैरिएबल को उत्पादन वातावरण पर पर्यावरणीय चर के रूप में सेट करके है। तब मैं तो जैसे os.environ.get() के माध्यम से settings.py में चर को पुनः प्राप्त:

secret_KEY=os.environ.get('secret_KEY') 

एक अन्य संभावित विकल्प आपके तैनाती स्क्रिप्ट के माध्यम से secret.py फ़ाइल में कॉपी करने के लिए है।

मुझे यकीन है कि विभिन्न वेब सर्वरों के लिए अन्य विशिष्ट विकल्प भी हैं।

+2

लिनक्स के लिए: http://unix.stackexchange.com/questions/21598/how-do-i-set-a-user-environment-variable- स्थायी रूप से- नहीं। उपर्युक्त मेरे उदाहरण के लिए, आप अपने '.bash_profile',' .bash_login' या 'profile' में 'निर्यात secret_KEY =' ABABABABABDSFJKEWLSK 'जोड़ देंगे - जो मौजूद है उसके आधार पर। –

+0

मैंने अपनी गुप्त कुंजी को .bash_profile पर ले जाया और os.environ.get का उपयोग किया, और यह पूरी तरह से मेरी साइट तोड़ दी, भले ही '$ SARERET_KEY' echo ठीक काम किया। – swizzard

+2

यह सुरक्षा के लिए बुरा है: प्रक्रिया के पर्यावरण चर अन्य उपयोगकर्ताओं द्वारा पढ़ा जा सकता है। –

6

आपको अपनी सेटिंग्स को मॉड्यूलर तरीके से स्टोर करना चाहिए। इसके द्वारा मेरा मतलब है कि कई सेटिंग्स में अपनी सेटिंग्स फैलाना है।

उदाहरण के लिए, आपके पास अपनी सभी बेस सेटिंग्स को स्टोर करने के लिए base_settings.py हो सकता है; आपके विकास सर्वर सेटिंग्स के लिए dev_settings.py; और अंत में सभी उत्पादन सेटिंग्स के लिए prod_base_settings.py। सभी गैर आधार सेटिंग्स फ़ाइलें सभी आधार सेटिंग्स आयात करेगा और उसके बाद ही बदल जो कुछ भी आवश्यक है:

# base_settings.py 
... 

# dev_settings.py 
from base_settings import * 
DEBUG = TRUE 
... 

# prod_base_settings.py 
from base_settings import * 
DEBUG = FALSE 
... 

यह दृष्टिकोण आप अलग अलग व्यवस्था से अलग सेटिंग्स की अनुमति देता है। आप उत्पादन सर्वर पर छोड़कर इन सभी फ़ाइलों को भी प्रतिबद्ध कर सकते हैं, आप वास्तविक उत्पादन सेटिंग्स फ़ाइल prod_settings.py बना सकते हैं जहां आप सभी संवेदनशील सेटिंग्स निर्दिष्ट करेंगे। इस फ़ाइल में कहीं भी प्रतिबद्ध नहीं किया जाना चाहिए और उसकी सामग्री सुरक्षित रखा:

# prod_settings.py 
from prod_base_settings import * 
SECRET_KEY = 'foo' 

फ़ाइल नाम आप उपयोग कर सकते हैं जो कुछ भी फ़ाइल नाम यदि आपको लगता है उपयुक्त हैं का सवाल है। व्यक्तिगत तौर पर मैं वास्तव में सेटिंग्स के लिए एक अजगर पैकेज बनाने और उसके बाद पैकेज के अंदर विभिन्न सेटिंग्स रखें:

project/ 
    project/ 
    settings/ 
     __init__.py 
     base.py 
     dev.py 
     ... 
    app1/ 
    models.py 
    ... 
    app2/ 
    models.py 
    ... 
+0

आपके उत्तर के लिए धन्यवाद। हालांकि, मैं देख रहा था कि इन चाबियों की रक्षा कैसे करें। – nitochi

+6

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

4

यदि/तो तर्क आप संवेदनशील डेटा बाहर बाँटे के लिए बनाया गया एक उपकरण का उपयोग करना चाहिए करने के बजाय। मैं यामजम https://pypi.python.org/pypi/yamjam/ का उपयोग करता हूं। यह os.environ विधि के सभी फायदे की अनुमति देता है लेकिन सरल है - आपको अभी भी उन परिवेश चर सेट करना होगा, आपको उन्हें कहीं किसी स्क्रिप्ट में रखना होगा। यामजम मशीन कॉन्फ़िगरेशन स्टोर में इन कॉन्फ़िगरेशन सेटिंग्स को संग्रहीत करता है और प्रोजेक्ट की ओवरराइड करने की प्रोजेक्ट की अनुमति देता है।

from YamJam import yamjam 

variable = yamjam()['myproject']['variable'] 

मूल उपयोग है। और os.environ विधि की तरह, यह ढांचा विशिष्ट नहीं है, आप इसे Django या किसी अन्य ऐप/ढांचे के साथ उपयोग कर सकते हैं। मैंने उन सभी की कोशिश की है, एकाधिक सेटिंग्स.py फाइलें, अगर/फिर और पर्यावरण wrangling के भंगुर तर्क। अंत में, मैंने यमजम में स्विच किया और खेद नहीं किया।

4

मुझे पता है कि यह एक लंबा समय रहा है, लेकिन मैंने अभी एक छोटा सा Django ऐप खोल दिया है जिसका उपयोग मैं एक नई गुप्त कुंजी उत्पन्न करने के लिए कर रहा हूं यदि यह अभी तक अस्तित्व में नहीं है। इसे django-generate-secret-key कहा जाता है।

pip install django-generate-secret-key 
फिर

, जब प्रावधान/एक नए सर्वर मेरे Django परियोजना चल तैनाती, मैं (Ansible से) निम्नलिखित कमांड चलाएँ: अगर एक

  • चेक:

    python manage.py generate_secret_key 
    

    यह बस गुप्त कुंजी उत्पन्न होने की आवश्यकता है

  • इसे secretkey.txt फ़ाइल (अनुकूलित किया जा सकता है) में उत्पन्न करता है

तुम सब तो जरूरत है अपनी सेटिंग्स फ़ाइल में है:

with open('/path/to/the/secretkey.txt') as f: 
    SECRET_KEY = f.read().strip() 

अब आप अपने भंडार में एक स्थिर गुप्त कुंजी स्टोर करने के लिए बिना एक पूरी तरह से स्वचालित प्रावधान प्रक्रिया से लाभ उठा सकते।

+0

हम्म, नवीनतम django (1.11) के साथ हो रहा है: 'FileNotFoundError: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं:'/home /.../ project/secretkey.txt'' –

+0

@BabkenVardanyan क्या आपने 'पायथन प्रबंधन' चलाया था। py gener_secret_key' पहले? अगर उसने फ़ाइल नहीं बनाई है या कुछ गलत है, तो कृपया यहां कोई समस्या खोलें: https://github.com/MickaelBergem/django-generate-secret-key/issues/new ताकि हम इसके बारे में बात कर सकें –

संबंधित मुद्दे