मैं अपने गुप्त कुंजी और पासवर्ड को अपने संस्करण नियंत्रण प्रणाली में सुरक्षित रूप से कैसे सहेज सकता हूं?


134

मैं अपने संस्करण नियंत्रण प्रणाली में विकास और उत्पादन सर्वर के होस्टनाम और बंदरगाहों जैसी महत्वपूर्ण सेटिंग्स रखता हूं। लेकिन मुझे पता है कि वीसीएस रिपॉजिटरी में रहस्य (निजी कुंजी और डेटाबेस पासवर्ड की तरह) रखना बुरा है।

लेकिन पासवर्ड - किसी भी अन्य सेटिंग की तरह - ऐसा लगता है कि उन्हें संस्करणित किया जाना चाहिए। तो पासवर्ड संस्करण को नियंत्रित रखने का उचित तरीका क्या है ?

मुझे लगता है कि इसमें अपनी "सीक्रेट्स सेटिंग" फाइल में सीक्रेट रखना और उस फाइल को एनक्रिप्टेड और वर्जन को नियंत्रित रखना शामिल होगा । लेकिन क्या तकनीकें? और यह कैसे ठीक से करना है? क्या पूरी तरह से इसके बारे में जाने का एक बेहतर तरीका है?


मैं आम तौर पर सवाल पूछता हूं, लेकिन अपने विशिष्ट उदाहरण में मैं git और github का उपयोग करके एक Django / पायथन साइट के लिए गुप्त कुंजी और पासवर्ड संग्रहीत करना चाहता हूं ।

इसके अलावा, एक आदर्श समाधान कुछ जादुई करता है जब मैं git के साथ धक्का / खींचता हूं - उदाहरण के लिए, यदि एन्क्रिप्टेड पासवर्ड फ़ाइल एक स्क्रिप्ट को चलाती है जो एक पासवर्ड के लिए पूछती है और इसे जगह में डिक्रिप्ट करती है।


संपादित करें: स्पष्टता के लिए, मैं उत्पादन रहस्यों को संग्रहीत करने के बारे में पूछ रहा हूं


1
वास्तव में पूरे रेपो को निजी रखने के लिए कुछ पैसे सामने रखें।
जॉन मी

29
@ जॉननी मैं वास्तव में पहले से ही एक निजी रिपॉजिटरी के लिए भुगतान करता हूं, लेकिन यह बात बनी हुई है - आपको अपनी रिपॉजिटरी में संवेदनशील जानकारी नहीं रखनी चाहिए।
क्रिस डब्ल्यू।

1
मुझे लगता है कि संतोषजनक जवाब देने का एक बड़ा कारण यह होगा कि पुराने जमाने का सादा पासवर्ड एक डेटाबेस से जुड़ने के लिए कम शत्रुतापूर्ण युग का अवशेष है। उचित उत्तर कुछ ऐसा है जैसे "आपके कोड को गुप्त की आवश्यकता नहीं होनी चाहिए", लेकिन आप जिन प्रणालियों तक पहुंच रहे हैं, वे आपको अधिक विकल्प नहीं देते हैं।
msw

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

1
संभावित डुप्लिकेट: प्रोग्रामर.स्टैकएक्सचेंज
यूजर

जवाबों:


100

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

पुश / पुल के दौरान पारदर्शी एन्क्रिप्शन / डिक्रिप्शन पर ट्यूटोरियल

यह gist https://gist.github.com/873637 पारदर्शी रूप से पुश की गई फ़ाइलों को एन्क्रिप्ट करने के लिए ओपन के साथ Git के स्मज / क्लीन फिल्टर ड्राइवर का उपयोग करने के तरीके पर एक ट्यूटोरियल दिखाता है। आपको बस कुछ प्रारंभिक सेटअप करने की आवश्यकता है।

यह कैसे काम करता है इसका सारांश

आप मूल रूप से .gitencrypt3 bash स्क्रिप्ट युक्त एक फ़ोल्डर बना रहे होंगे ,

clean_filter_openssl 
smudge_filter_openssl 
diff_filter_openssl 

जो Git द्वारा डिक्रिप्शन, एन्क्रिप्शन और सपोर्टिंग Git के लिए उपयोग किए जाते हैं। एक मास्टर पासफ़्रेज़ और नमक (निश्चित!) को इन लिपियों के अंदर परिभाषित किया गया है और आपको यह सुनिश्चित करना होगा कि .itencrypt वास्तव में कभी भी धकेल नहीं दिया जाता है। उदाहरण clean_filter_opensslलिपि:

#!/bin/bash

SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>

openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED

के लिए समान smudge_filter_open_sslऔर diff_filter_oepnssl। जिस्ट देखें

संवेदनशील जानकारी के साथ आपके रेपो में एक .gitattribute फ़ाइल (अनएन्क्रिप्टेड और रेपो में शामिल) होनी चाहिए जो .itencrypt डायरेक्टरी को संदर्भित करता है (जिसमें सब कुछ Git को प्रोजेक्ट को पारदर्शी रूप से एन्क्रिप्ट / डिक्रिप्ट करने की आवश्यकता होती है) और जो आपके स्थानीय मशीन पर मौजूद है।

.gitattribute सामग्री:

* filter=openssl diff=openssl
[merge]
    renormalize = true

अंत में, आपको अपनी .git/configफ़ाइल में निम्न सामग्री जोड़ने की आवश्यकता होगी

[filter "openssl"]
    smudge = ~/.gitencrypt/smudge_filter_openssl
    clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
    textconv = ~/.gitencrypt/diff_filter_openssl

अब, जब आप अपनी संवेदनशील जानकारी वाले रिपॉजिटरी को दूरस्थ रिपॉजिटरी में धकेलते हैं, तो फाइलें पारदर्शी रूप से एन्क्रिप्ट हो जाएंगी। जब आप एक स्थानीय मशीन से खींचते हैं, जिसमें .itencrypt डायरेक्टरी होती है (जिसमें आपका पासफ़्रेज़ होता है), फाइलें पारदर्शी रूप से एन्क्रिप्ट की जाएंगी।

टिप्पणियाँ

मुझे ध्यान देना चाहिए कि यह ट्यूटोरियल केवल आपकी संवेदनशील सेटिंग्स फ़ाइल को एन्क्रिप्ट करने का तरीका नहीं बताता है। यह पूरी तरह से संपूर्ण भंडार को एन्क्रिप्ट करेगा जो दूरस्थ वीसी होस्ट को धकेल दिया जाता है और संपूर्ण भंडार को डिक्रिप्ट करता है, इसलिए यह पूरी तरह से स्थानीय रूप से डिक्रिप्ट किया जाता है। आप जो व्यवहार चाहते हैं, उसे प्राप्त करने के लिए, आप एक संवेदनशील या कई प्रोजेक्ट्स के लिए संवेदनशील संवेगों में जगह कर सकते हैं। आप की जांच कर सकता है कि यह कैसे पारदर्शी एन्क्रिप्शन तकनीक Git submodules के साथ काम करता http://git-scm.com/book/en/Git-Tools-Submodules यदि आप वास्तव में संवेदनशील फ़ाइलें जरूरत है एक ही भंडार में किया जाना है।

एक निश्चित पासफ़्रेज़ के उपयोग से सैद्धांतिक रूप से ब्रूट-फोर्स भेद्यता हो सकती है यदि हमलावरों के पास कई एन्क्रिप्टेड रिपॉजिट या फ़ाइलों तक पहुंच होती है। IMO, इस की संभावना बहुत कम है। इस ट्यूटोरियल के निचले भाग पर एक नोट के रूप में, एक निश्चित पासफ़्रेज़ का उपयोग नहीं करने से विभिन्न मशीनों पर रेपो के स्थानीय संस्करण हमेशा दिखाई देंगे, जिसमें यह दिखाया जाएगा कि परिवर्तन 'स्थिति' के साथ हुए हैं।


1
ओह बहुत दिलचस्प है। यह लगभग वैसा ही लगता है जैसा मैं चाहता हूँ (इसके संपूर्ण भंडार को एन्क्रिप्ट करने के अलावा)।
क्रिस डब्ल्यू।

आप या तो एक एन्क्रिप्टेड रिपॉजिटरी में कई एप्लिकेशनों के लिए सभी संवेदनशील सेटिंग फ़ाइलों को रख सकते हैं या अपने प्रोजेक्ट में संवेदनशील सेटिंग्स के साथ एन्क्रिप्टेड रिपॉजिटरी को Git submodule के रूप में यहां git-scm.com/book/en/Git-Tools-Submodules के रूप में जोड़ सकते हैं
dg

(एन्क्रिप्टेड) ​​सबमॉड्यूल में उत्पादन पासवर्ड / सेटिंग्स को स्टोर करना असामान्य नहीं है। stackoverflow.com/questions/11207284/… । इससे परियोजनाओं में सेटिंग्स को प्रबंधित करना और भी आसान हो जाएगा।
dg

यह अद्यतन समाधान के लिए github.com/AGWA/git-crypt की जाँच के लायक हो सकता है । इसमें अलग-अलग फ़ाइलों को एनक्रिप्ट करने की अनुमति देने का लाभ है, और यह "अस्थायी रूप से सुरक्षित रूप से सुरक्षित" होने का दावा करता है। जिस्ट के लेखक ने खुद यह सुझाव दिया कि यह टूल github.com/shadowhand/git-encrypt पर बेहतर है ।
गीकले जूल

52

हरोकू धक्का मारता है सेटिंग्स और गुप्त कुंजी के लिए पर्यावरण चर का उपयोग करता है:

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

एक बेहतर समाधान पर्यावरण चर का उपयोग करना है, और कुंजी को कोड से बाहर रखना है। एक पारंपरिक होस्ट या स्थानीय स्तर पर काम करने से आप अपने bashrc में पर्यावरण संस्करण सेट कर सकते हैं। हरोकू पर, आप कॉन्फिग वर्जन का उपयोग करते हैं।

फोरमैन के साथ और .env फाइलों के साथ हरोकू पर्यावरण चर को निर्यात, आयात और सिंक्रनाइज़ करने के लिए एक महत्वपूर्ण उपकरण उपलब्ध कराता है।


निजी तौर पर, मेरा मानना ​​है कि कोड के साथ गुप्त कुंजी को सहेजना गलत है। यह मूल रूप से स्रोत नियंत्रण के साथ असंगत है, क्योंकि चाबियाँ सेवाओं के लिए हैं कोड के लिए बाह्य । एक वरदान यह होगा कि एक डेवलपर HEAD को क्लोन कर सकता है और बिना किसी सेटअप के एप्लिकेशन चला सकता है। हालाँकि, मान लीजिए कि एक डेवलपर कोड के ऐतिहासिक संशोधन की जाँच करता है। उनकी कॉपी में पिछले साल के डेटाबेस पासवर्ड शामिल होंगे, इसलिए आवेदन आज के डेटाबेस के खिलाफ विफल हो जाएगा।

उपरोक्त हरोकू पद्धति के साथ, एक डेवलपर पिछले साल के ऐप को चेकआउट कर सकता है, इसे आज की कुंजियों के साथ कॉन्फ़िगर कर सकता है और इसे आज के डेटाबेस के खिलाफ सफलतापूर्वक चला सकता है।


1
इस उत्तर पर पर्याप्त ध्यान नहीं दिया गया है, लेकिन यह लिनक्स के रास्ते के साथ मेल खाता है।
निकोले फोमिनीह

11
तो अगर आपके bashrc में पर्यावरण var सेट हैं, और आप एक नया सर्वर तैनात कर रहे हैं, तो bashrc क्या बनाता है? क्या यह केवल आपके स्रोत कोड रेपो, और आपके परिनियोजन कॉन्फ़िगरेशन में से पासवर्ड को स्थानांतरित नहीं करता है? (जो संभवतः स्रोत कोड रेपो में या स्वयं के रेपो में भी है?)
जोनाथन हार्टले

@JonathanHartley अपने .bashrc को आपके Django ऐप के लिए कोड रेपो में नहीं होना चाहिए।
स्टीव

4
क्षमा करें, मेरी टिप्पणी अस्पष्ट है, लेकिन ऐसा इसलिए है क्योंकि मैं वास्तव में भ्रमित हूं। मुझे इस उत्तर के दृष्टिकोण की ध्वनि बहुत पसंद है, लेकिन इसे कभी भी पूरी तरह से समझ नहीं पाया। यदि मैं कई अलग-अलग वातावरणों में तैनात कर रहा हूं, जिनमें से प्रत्येक में कई होस्ट और शायद कई प्रकार के होस्ट हैं, तो जाहिर है मुझे .bashrc फ़ाइलों के निर्माण को स्वचालित करने की आवश्यकता है जो कि प्रत्येक होस्ट पर मौजूद होंगे अपने पर्यावरण चर सेट करने के लिए। तो क्या यह उत्तर है कि मेरे पास एक दूसरा रेपो होना चाहिए , जो मेरे स्रोत से अलग हो, जिसमें सभी सेटिंग्स हों जो तैनाती पर पर्यावरण चर बन जाए।
जोनाथन हार्टले

1
वे केवल उसी समय कॉन्फ़िगर किए जाने की आवश्यकता होती है जब आप प्रति मशीन पर तैनात हो जाते हैं। यदि आपकी परिनियोजन प्रक्रिया "एक नई मशीन को स्पिन करना है और ट्रैफ़िक को रीडायरेक्ट करने से पहले इसे ठीक करना है और फिर पुराने को सिर में गोली मारना है", जिसे आईएमएचओ सबसे अच्छा अभ्यास है, तो आपको वास्तव में जो भी सेट बनाना है उसे स्वचालित करने की आवश्यकता है env vars।
जोनाथन हार्टले

16

मेरी राय में सबसे साफ तरीका पर्यावरण चर का उपयोग करना है। उदाहरण के लिए आपको .dist फ़ाइलों से निपटना नहीं पड़ेगा , और उत्पादन वातावरण पर प्रोजेक्ट स्थिति आपके स्थानीय मशीन के समान होगी।

मेरा सुझाव है कि बारह-फैक्टर ऐप के कॉन्फिग चैप्टर को पढ़ना , दूसरों को भी अगर आप रुचि रखते हैं।


6
ऐसा लगता है कि पर्यावरण चर, गुप्त सेटिंग्स के साथ एप्लिकेशन को चलाने का एक अच्छा तरीका है ... लेकिन यह अभी भी इस सवाल का जवाब नहीं देता है कि इन सेटिंग्स को कहां रखा जाए ।
क्रिस डब्ल्यू।

2
आपके पास आमतौर पर आपके प्रत्येक ऐप के लिए एक README फाइल होनी चाहिए। इसमें, निर्दिष्ट करें कि कौन सा पर्यावरण चर सेट किया जाना चाहिए, और हर बार जब आप किसी प्रोजेक्ट को तैनात करते हैं, तो बस चरणों का पालन करें और उनमें से प्रत्येक को सेट करें। आप कई के साथ एक शेल स्क्रिप्ट भी बना सकते हैं export MY_ENV_VAR=, और जब आप तैनात करते हैं, तो इसे सही मानों और sourceइसके साथ भरें । तो द्वारा रख आप मतलब संस्करण सेटिंग्स, आप पहली जगह में यह कर नहीं होना चाहिए।
सामी डिंडाने

इसके अलावा, बारह फैक्टर अनुप्रयोग के लिए upvote - बहुत बढ़िया सामान।
क्रिस डब्ल्यू।

4
@ सामी: और अगर आपने स्वचालित तैनाती की है?
जोनाथन हार्टले

3
@ नमस्कार मुझे अभी भी समझ में नहीं आया है कि पर्यावरण चर कैसे सेट होंगे। 12 फैक्टर ऐप पेज या तो यह स्पष्ट नहीं करता है (जब तक कि आप हरोकू पर नहीं हैं, जो कि मेरा वर्तमान प्रोजेक्ट नहीं है।) क्या हम कह रहे हैं कि एक सेंट्रल स्क्रिप्ट स्टोर से एक स्क्रिप्ट को पूछने की जरूरत है "मैं मशीन एक्स हूं, कृपया मुझे अपना कॉन्फिग डेटा दें ", और यह पर्यावरण के चर के मूल्यों के साथ प्रतिक्रिया करता है जिसे सेट किया जाना चाहिए। उस स्थिति में, मुझे नहीं लगता कि आपको किसी भी तरह की स्क्रिप्ट की आवश्यकता है। मैं यहाँ बेतहाशा सट्टा लगा रहा हूँ, क्या मैं सही पेड़ को काट रहा हूँ?
जोनाथन हार्टले

10

एक विकल्प यह होगा कि प्रोजेक्ट-बाउंड क्रेडेंशियल्स को एक एन्क्रिप्टेड कंटेनर (ट्रू क्रिप्टेक या कीपास) में रखा जाए और इसे पुश किया जाए।

नीचे मेरी टिप्पणी से उत्तर के रूप में अद्यतन करें:

दिलचस्प सवाल btw। मैंने अभी-अभी यह पाया: github.com/shadowhand/git-encrypt जो स्वचालित एन्क्रिप्शन के लिए बहुत आशाजनक लग रहा है


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

7
दिलचस्प सवाल btw। मैंने अभी-अभी यह पाया: github.com/shadowhand/git-encrypt जो स्वचालित एन्क्रिप्शन के लिए बहुत आशाजनक लग रहा है।
श्नाइक

1
वाह महान। git-encryptध्वनियों का वर्णन जैसे मैं क्या देख रहा हूं "जब एक दूरस्थ गिट रिपॉजिटरी के साथ काम करना जो कि एक तृतीय-पक्ष भंडारण सर्वर पर होस्ट किया जाता है, तो डेटा गोपनीयता कभी-कभी एक चिंता का विषय बन जाती है। यह लेख आपको गिट रिपॉजिटरी स्थापित करने की प्रक्रियाओं के माध्यम से चलता है। जिसके लिए आपके स्थानीय कामकाजी निर्देशिका सामान्य (अन-एन्क्रिप्टेड) ​​हैं लेकिन प्रतिबद्ध सामग्री एन्क्रिप्टेड है। " (बेशक, मैं केवल अपनी सामग्री का एक उप एन्क्रिप्टेड चाहता हूँ ...)
क्रिस डब्ल्यू।

@schneck आपकी टिप्पणी को एक उत्तर के रूप में पोस्ट करता है ताकि क्रिस इसे स्वीकार कर सके - ऐसा लगता है जैसे यह वही है जिसे वह खोज रहा है।
टोनी अबू-असलेह

9

मेरा सुझाव है कि इसके लिए कॉन्फ़िगरेशन फ़ाइलों का उपयोग करना और उन्हें संस्करणबद्ध नहीं करना है।

आप हालाँकि फ़ाइलों के उदाहरणों को संस्करणित कर सकते हैं।

मुझे विकास सेटिंग साझा करने की कोई समस्या नहीं दिख रही है। परिभाषा के अनुसार इसमें कोई मूल्यवान डेटा नहीं होना चाहिए।


1
लेकिन फिर कैनोनिकल पासवर्ड रिकॉर्ड को कहाँ स्टोर करना है? यह मुझे परेशान कर देगा कि डेटा केवल एक मशीन पर एक कॉन्फ़िगरेशन फ़ाइल में बैठा है जो किसी दिन उड़ सकता है।
क्रिस डब्ल्यू।

@ChrisW। यदि मशीन ऊपर उड़ती है, तो आपको अब पासवर्ड की आवश्यकता नहीं है ... हालाँकि, यदि आपके पास अपने उत्पादन मशीन के डेटा की केवल एक प्रति है, तो आपको एक लाल झंडा उठाना चाहिए। लेकिन इसका मतलब यह नहीं है कि यह वीसीएस में होना चाहिए। RAID होना चाहिए, चुंबकीय और ऑप्टिकल मीडिया पर वृद्धिशील बैकअप द्वारा पूरक पूर्ण बैकअप। बहुत सारे निगमों में एक परिवर्तन नियंत्रण प्रक्रिया होती है, जो पासवर्ड और अन्य संवेदनशील सामग्रियों को कागज पर भी कैसे और कहाँ संग्रहीत करती है, यह तय कर सकती है।
स्टीव बुज़ोनास

@ क्रिस मैं न तो किसी न किसी तरह बनना चाहता हूं, लेकिन ऐसा लगता है कि आप हमें सच्चाई नहीं बताते हैं और जिन पासवर्ड को आप स्टोर करना चाहते हैं, वे विकास में नहीं बल्कि उत्पादन में उपयोग किए जाते हैं। क्या यह सच नहीं है? अन्यथा, आप एक विकास या परीक्षण मशीन और विकास पासवर्ड की देखभाल क्यों करते हैं? कोई भी ऐसा नहीं करेगा।
tiktak

BTW, हमारी कंपनी में, सभी विकास पासवर्ड कागज पर और इंट्रानेट पर उपलब्ध हैं। क्योंकि उनका कोई मूल्य नहीं है। वे वहां मौजूद हैं क्योंकि हमारे द्वारा विकसित सॉफ्टवेयर को प्रमाणीकरण की आवश्यकता है।
तैक्तक

@tiktak, आप सही हैं - मेरा सवाल उत्पादन पासवर्ड के संबंध में क्या है। मैं स्पष्ट रूप से ए VCS में विकास पासवर्ड संग्रहीत करने के बारे में परवाह नहीं करता। क्षमा करें यदि मैंने वह स्पष्ट नहीं किया है।
क्रिस डब्ल्यू।

7

ब्लैक बॉक्स को हाल ही में StackExchange द्वारा जारी किया गया था और जबकि मुझे अभी इसका उपयोग करना बाकी है, यह समस्याओं का ठीक से पता लगाने और इस प्रश्न में मांगी गई विशेषताओं का समर्थन करने के लिए लगता है।

Https://github.com/StackExchange/blackbox पर विवरण से :

वीसीएस रेपो (यानी गिट या मर्क्यूरियल) में सुरक्षित रूप से स्टोर किए गए रहस्य। ये कमांड आपके लिए रेपो में विशिष्ट फ़ाइलों को एन्क्रिप्ट करने के लिए GPG को एन्क्रिप्ट करना आसान बनाते हैं ताकि वे आपकी रिपॉजिटरी में "आराम से एन्क्रिप्टेड" हों। हालाँकि, स्क्रिप्ट को उन्हें डिक्रिप्ट करना आसान हो जाता है जब आपको उन्हें देखने या संपादित करने की आवश्यकता होती है, और उन्हें उत्पादन में उपयोग के लिए डिक्रिप्ट किया जाता है।


7

यह सवाल पूछने के बाद से मैं एक समाधान पर बैठ गया हूं, जिसका उपयोग मैं लोगों की एक छोटी टीम के साथ छोटे अनुप्रयोग विकसित करते समय करता हूं।

Git-तहखाने

जब उनके नाम कुछ पैटर्न से मेल खाते हों तो git-crypt पारदर्शी रूप से फ़ाइलों को एन्क्रिप्ट करने के लिए GPG का उपयोग करता है। इरादा के लिए, यदि आप अपनी .gitattributesफ़ाइल में जोड़ते हैं ...

*.secret.* filter=git-crypt diff=git-crypt

... तो एक फ़ाइल की तरह config.secret.json हमेशा की एन्क्रिप्शन के साथ दूरस्थ रिपोज को धक्का दिया जाएगा, लेकिन आपके स्थानीय फ़ाइल सिस्टम पर अनएन्क्रिप्टेड बने रहें।

अगर मैं आपके रेपो में एक नई GPG कुंजी (एक व्यक्ति) जोड़ना चाहता हूं जो संरक्षित फ़ाइलों को डिक्रिप्ट कर सकती है तो चलाएं git-crypt add-gpg-user <gpg_user_key>। यह एक नई प्रतिबद्धता बनाता है। नया उपयोगकर्ता बाद के कमिट को डिक्रिप्ट कर सकेगा।


5

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

नहीं, बस मत करो, भले ही यह आपका निजी रेपो हो और आप इसे साझा करने का इरादा नहीं रखते हों, नहीं।

आपको एक स्थानीय_सेटिंग्सहोम बनाना चाहिए इसे वीसीएस इग्नोर करें और अपनी सेटिंग में कुछ ऐसा करें

from local_settings import DATABASES, SECRET_KEY
DATABASES = DATABASES

SECRET_KEY = SECRET_KEY

यदि आपकी गोपनीयता सेटिंग्स बहुमुखी हैं, तो मैं यह कहने के लिए उत्सुक हूं कि आप कुछ गलत कर रहे हैं


9
लेकिन मैं अब भी उन रहस्यों का ट्रैक रखने की आवश्यकता होगी कहीं । जैसे, कीपास या उन लाइनों के साथ कुछ, सही?
क्रिस डब्ल्यू।

निजी डेटा संग्रहीत करने का विनियमन और कार्यान्वयन कंपनी की परियोजना की नीति पर निर्भर करता है। मुझे संदेह है कि परियोजना का स्रोत कोड उचित स्थान है क्योंकि किसी भी तीसरे पक्ष के परीक्षक या प्रोग्रामर ये देख सकते हैं
Hedde van der Heide

4

संपादित करें: मुझे लगता है कि आप अपने पिछले पासवर्ड संस्करणों का ट्रैक रखना चाहते हैं - कहते हैं, एक स्क्रिप्ट के लिए जो पासवर्ड के पुन: उपयोग को रोक देगा आदि।

मुझे लगता है कि GnuPG जाने का सबसे अच्छा तरीका है - यह पहले से ही एक git-related प्रोजेक्ट (git-annex) में क्लाउड सेवाओं पर संग्रहीत भंडार सामग्री को एन्क्रिप्ट करने के लिए उपयोग किया जाता है। GnuPG (gnu pgp) एक बहुत ही मजबूत कुंजी-आधारित एन्क्रिप्शन प्रदान करता है ।

  1. आप अपने स्थानीय मशीन पर एक कुंजी रखें।
  2. आप नजरअंदाज की गई फाइलों में 'mypassword' जोड़ते हैं।
  3. प्री-कमिट हुक पर आप mypassword फाइल को mypassword.gpg फ़ाइल में git द्वारा ट्रैक करते हैं और इसे कमिट में जोड़ते हैं।
  4. मर्ज पोस्ट हुक पर आप बस mypassword.gpg को mypassword में डिक्रिप्ट करते हैं।

अब यदि आपकी 'mypassword' फ़ाइल नहीं बदली गई तो इसे एन्क्रिप्ट करने का परिणाम उसी सिफरटेक्स्ट के साथ होगा और इसे अनुक्रमणिका (अतिरेक) में नहीं जोड़ा जाएगा। स्टेजिंग क्षेत्र में मूल रूप से अलग साइफरटेक्स्ट और mypassword.gpg में माइगॉवर्ड परिणामों का सबसे छोटा संशोधन रिपॉजिटरी में एक से बहुत भिन्न होता है, इस प्रकार कमिट में जोड़ा जाएगा। यहां तक ​​कि अगर हमलावर को आपकी gpg कुंजी की पकड़ मिलती है, तो भी उसे पासवर्ड को bruteforce करने की आवश्यकता है। यदि हमलावर को सिफरटेक्स्ट के साथ दूरस्थ रिपॉजिटरी तक पहुंच मिलती है तो वह सिफरटेक्स्ट के एक समूह की तुलना कर सकता है, लेकिन उनकी संख्या उसे किसी भी गैर-नगण्य लाभ देने के लिए पर्याप्त नहीं होगी।

बाद में आप अपने पासवर्ड को अलग रखने के लिए ऑन-द-फ्लाई डिक्रिप्शन प्रदान करने के लिए .gitattributes का उपयोग कर सकते हैं।

साथ ही आपके पास विभिन्न प्रकार के पासवर्ड आदि के लिए अलग-अलग कुंजी हो सकते हैं।


3

आमतौर पर, मैं पासवर्ड को एक कॉन्फ़िगर फ़ाइल के रूप में अलग करता हूं। और उन्हें परेशान करते हैं।

/yourapp
    main.py
    default.cfg.dist

और जब मैं दौड़ता हूं main.py, तो असली पासवर्ड default.cfgउस कॉपी में डालें ।

ps। जब आप git या hg के साथ काम करते हैं। आप *.cfgफ़ाइलों को बनाने .gitignoreया अनदेखा कर सकते हैं.hgignore


.dist फाइलें वही हैं जो मैं बात कर रहा था: वास्तविक कॉन्फ़िगरेशन फ़ाइलों के उदाहरण। एक अच्छा अभ्यास यह है कि केवल ".dist" एक्सटेंशन (या बेहतर: प्रतिलिपि) को हटाकर सॉफ़्टवेयर को चलाना संभव होना चाहिए, अर्थात, आपको सॉफ़्टवेयर को सेकंड में आज़मा कर देखना चाहिए, बिना इसे कॉन्फ़िगर किए बिना। पूरा दिन।
१ik:०४ पर टिट्टक

3

कॉन्फ़िगरेशन को ओवरराइड करने का एक तरीका प्रदान करें

यह कॉन्फिग पूरी करने के लिए आपके द्वारा चेकइन किए गए कॉन्फ़िगरेशन के लिए बिना किसी डिफॉल्ट के सेट का प्रबंधन करने का सबसे अच्छा तरीका है, या होस्टनाम और क्रेडेंशियल्स जैसी चीजों को शामिल करना। डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करने के कुछ तरीके हैं।

पर्यावरण चर (जैसा कि अन्य पहले ही उल्लेख कर चुके हैं) इसे करने का एक तरीका है।

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

FYI करें: क्रेडिट को एन्क्रिप्ट करना हमेशा एक सर्वोत्तम अभ्यास नहीं होता है, विशेष रूप से सीमित संसाधनों के साथ एक जगह पर। यह मामला हो सकता है कि क्रेडिट को एन्क्रिप्ट करने से आपको कोई अतिरिक्त जोखिम शमन नहीं होगा और बस जटिलता की एक अनावश्यक परत जुड़ जाएगी। निर्णय लेने से पहले उचित विश्लेषण अवश्य करें।


2

उदाहरण के लिए, GPG का उपयोग करके पासवर्ड फ़ाइल एन्क्रिप्ट करें। अपने स्थानीय मशीन पर और अपने सर्वर पर चाबियाँ जोड़ें। फ़ाइल को डिक्रिप्ट करें और इसे अपने रेपो फ़ोल्डरों के बाहर रखें।

मैं अपने होम-फोल्डर में स्थित एक पासवर्ड का उपयोग करता हूं। हर तैनाती पर यह फाइल अपडेट हो जाती है।


फिर सॉफ्टवेयर को पासवर्ड फाइल को डिक्रिप्ट करना होगा।
१ik:०३ पर ११

ठीक है, केवल जब साइट को तैनात करते समय पासवर्ड डिक्रिप्ट हो जाता है और एक सादे टेक्स्ट पासवर्ड फ़ाइल को लिखा जाता है
विलियन

2

नहीं, निजी कुंजी और पासवर्ड संशोधन नियंत्रण में नहीं आते हैं। उत्पादन में उपयोग की जाने वाली संवेदनशील सेवा क्रेडेंशियल्स को जानने के साथ आपकी रिपॉजिटरी में पढ़ने की पहुंच के साथ सभी को बोझ करने का कोई कारण नहीं है, जब सबसे अधिक संभावना है कि उन सभी को उन सेवाओं तक पहुंच नहीं होनी चाहिए।

Django 1.4 के साथ शुरू, आपका Django प्रोजेक्ट अब एक project.wsgiमॉड्यूल के साथ जहाज करता है जो applicationऑब्जेक्ट को परिभाषित करता है और यह एक project.localसेटिंग मॉड्यूल के उपयोग को शुरू करने के लिए एक आदर्श स्थान है जिसमें साइट-विशिष्ट कॉन्फ़िगरेशन शामिल हैं।

इस सेटिंग मॉड्यूल को संशोधन नियंत्रण से नजरअंदाज कर दिया जाता है, लेकिन उत्पादन वातावरण के लिए विशिष्ट WSGI अनुप्रयोग के रूप में आपके प्रोजेक्ट इंस्टेंस को चलाते समय इसकी उपस्थिति आवश्यक है। यह इस तरह दिखना चाहिए:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.local")

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

अब आपके पास एक local.pyमॉड्यूल हो सकता है जो मालिक और समूह को कॉन्फ़िगर किया जा सकता है ताकि केवल अधिकृत कर्मचारी और Django प्रक्रियाएं फ़ाइल की सामग्री को पढ़ सकें।


2

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


1

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


1

मैं यह करता हूं:

  • सभी रहस्यों को $ HOME / .secrets (go-r perms) में env vars के रूप में रखें जो $ HOME / .bashrc स्रोत हैं (इस तरह यदि आप किसी के सामने .bashrc खोलते हैं, तो वे रहस्य नहीं देखेंगे)
  • कॉन्फ़िगरेशन फ़ाइलों को VCS में टेम्पलेट के रूप में संग्रहीत किया जाता है, जैसे config.properties को config.properties.tmpl के रूप में संग्रहीत किया जाता है
  • टेम्प्लेट फ़ाइलों में गुप्त के लिए एक प्लेसहोल्डर होता है, जैसे:

    my.password = ## MY_PASSWORD ##

  • एप्लिकेशन परिनियोजन पर, स्क्रिप्ट को चलाया जाता है जो टेम्प्लेट फ़ाइल को लक्ष्य फ़ाइल में बदल देता है, प्लेसहोल्डर्स को पर्यावरण चर के मानों के साथ प्रतिस्थापित करता है, जैसे ## MY_PASSWORD ## को $ MY_PASSWORD के मान में बदलना।


0

यदि आपका सिस्टम यह प्रदान करता है तो आप EncFS का उपयोग कर सकते हैं। इस प्रकार आप अपने एन्क्रिप्टेड डेटा को अपने रिपॉजिटरी के सबफ़ोल्डर के रूप में रख सकते हैं, जबकि आपके एप्लिकेशन को डेटा चोरी को अलग से डिक्रिप्टेड दृश्य प्रदान करते हैं। जैसा कि एन्क्रिप्शन पारदर्शी है, पुल या पुश पर किसी विशेष ऑपरेशन की आवश्यकता नहीं है।

हालांकि इसे एनएएफएस फोल्डर को माउंट करने की आवश्यकता होगी, जो कि आपके एप्लिकेशन द्वारा वर्जन फोल्डर के बाहर कहीं और स्टोर किए गए पासवर्ड के आधार पर किया जा सकता है (जैसे। पर्यावरण चर)।

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