2010-07-08 9 views
23

देने के बिना मैं अपने रेल के ऐप्स को स्रोत कैसे खोलूं, मेरे पास गिटहब पर होस्ट किए गए कई रेल ऐप्स हैं। वे सभी वर्तमान में निजी हैं, और मैं अक्सर उन्हें अपने गिटहब भंडार से तैनात कर दूंगा। मैं उनमें से कुछ को ओपन सोर्स बनाने में सक्षम होना चाहता हूं, जैसे कि आप http://opensourcerails.com पर पा सकते हैं।ऐप की गुप्त कुंजी और क्रेडेंशियल

मेरा प्रश्न है: मैं इन रहस्यों को सुपर गुप्त प्रमाण-पत्र दिए बिना सार्वजनिक कैसे बना सकता हूं?

उदाहरण के लिए, मैं /config/initializers/cookie_verification_secret.rb में देख सकता हूं और उनमें से लगभग हर किसी के लिए कुकी रहस्य देख सकता हूं। मुझे समझ में नहीं आता कि यह कैसे स्वीकार्य है। क्या ये उपयोगकर्ता इन मूल्यों को अपने तैनाती वातावरण में किसी भी तरह बदल रहे हैं?

कुछ उपयोगकर्ता भी अपने एडब्ल्यूएस गुप्त और कुंजी का पर्दाफाश करते हैं! हालांकि मैं किस बिंदु वे कहते हैं कि मूल्य स्थापित कर रहे हैं पर यकीन नहीं है

ENV['aws-secret'] 

: दूसरों के बजाय की तरह कुछ करने के लिए अपने एडब्ल्यूएस गुप्त सेट हो जाएगा।

तो, अपने ऐप की सुरक्षा समझौता किए बिना अपने रेल ऐप को खोलने के लिए सर्वोत्तम प्रथाएं क्या हैं।

उत्तर

15

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

कॉन्फ़िग दुकान: http://github.com/tsigo/jugglf/blob/master/config/initializers/juggernaut.rb

उदाहरण उपयोग: https://github.com/tsigo/jugglf/blob/6b91baae72fbe4b1f7efa2759bb472541546f7cf/config/initializers/session_store.rb

तुम भी स्रोत नियंत्रण से फ़ाइल है कि इन गुप्त मानों का उपयोग के सभी इतिहास निकालने के लिए कर सकते हैं। गिट में ऐसा करने के लिए यहां एक मार्गदर्शिका दी गई है जिसका मैंने उपयोग किया: http://help.github.com/removing-sensitive-data/

+1

महान सलाह। साथ ही, यदि आप इतिहास को हटाना नहीं चाहते हैं, और यदि यह संभव है, तो आप ताजा तैनाती के बाद मूल्यों को बदल सकते हैं (और वे .gitignore के माध्यम से छिपाए जाने के बाद), जिससे पुरानी मान बेकार हो जाती है। यह निश्चित रूप से विफलता के लिए कुछ हद तक अतिसंवेदनशील है, यदि आप महत्वपूर्ण मूल्यों में से किसी एक को बदलना भूल जाते हैं, तो आपको हो सकता है। – jefflunt

+1

चूंकि यह उत्तर अभी भी वोट प्राप्त कर रहा है, मुझे लगता है कि मुझे यह अपडेट करना चाहिए कि मैं आज (और क्या करता हूं): https://github.com/bkeepers/dotenv –

4

कोई भी गुप्त मूल्य संग्रहीत नहीं है। एक गिट रेपो के इतिहास में किसी भी समय। साथ

  • बाहरी रेपो
  • से सही मान पढ़ सकते हैं और अंतिम कॉन्फ़िग फ़ाइल पूरा निर्माण करने के लिए (:
    उन मूल्यों कहीं और संग्रहीत किया जाना चाहिए, छोड़ने के केवल टेम्पलेट config फ़ाइलों संस्करणीकृत, एक स्क्रिप्ट में सक्षम के साथ इसमें गुप्त मूल्य)

डेटा के अलग-अलग सेट को सेट करके (एक तरफ स्रोत, दूसरे पर गुप्त मूल्य), फिर आप किसी भी रहस्य के बिना स्रोत रेपो स्रोत खोल सकते हैं।

+0

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

+0

@ballgame: "उस मशीन को मेरी स्थानीय मशीन पर एक रेपो से गुप्त मूल्य पढ़ते हैं": लेकिन यह आपकी "स्थानीय मशीन" न केवल कहीं से भी मूल्य पढ़ सकता है। डेटा के बाहरी स्रोत तक पहुंचने के लिए इसे केवल (तैनात सर्वर से) की आवश्यकता होती है। – VonC

+1

@ballgame: यदि आप अपने वेब ऐप को लात मारने के लिए फोरमैन का उपयोग कर रहे हैं, तो आप अपने रेपो की जड़ पर एक .env फ़ाइल बना सकते हैं जहां आप अपना चर सेट करते हैं, और इसे .gitignore में जोड़ते हैं। – Alban

0

[संपादित करें - निम्नलिखित विधि को आवश्यक कुकीज़ को शामिल करने के लिए "रेल सर्वर" चलाने के लिए उत्पादन शाखा में स्विच करने की परेशानी है। इस प्रकार, सर्वर को मुश्किल होने पर संपादन करना ... और मैं अभी भी एक अच्छा समाधान ढूंढ रहा हूं]

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

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

मुझे ऐसा करने में सक्षम होना चाहिए क्योंकि हेरोकू और अन्य होस्टों को अपने सर्वर पर धक्का देने के लिए एक सिंगल गिट रेपो की आवश्यकता होती है।

अधिक यहाँ जानकारी:

http://groups.google.com/group/heroku/browse_thread/thread/d7b1aecb42696568/26d5249204c70574

+0

BallGame, क्या आपको कोई अच्छा समाधान मिला? –

3

मैं वास्तव में एक संकेत के अपने प्रश्न से, ले लिया ENV का उपयोग कर।

मेरे पास तीन अलग-अलग गुप्त मूल्य थे जिन्हें मैं उपलब्ध नहीं करना चाहता था। वे निश्चित रूप से ऐप का गुप्त टोकन हैं, और ट्विटर की उपभोक्ता कुंजी और रहस्य हैं। अपने गुप्त टोकन प्रारंभकर्ता में:

KinTwit::Application.config.secret_token = ENV['SECRET_TOKEN'] 

Twitter.consumer_key      = ENV['CONSUMER_KEY'] 
Twitter.consumer_secret     = ENV['CONSUMER_SECRET'] 

मैं Heroku पर अपने प्रोजेक्ट की मेजबानी कर रहा हूँ, इसलिए मैं Heroku के विन्यास चर के रूप में इन गयी।

[03:07:48] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_KEY=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v7 
    CONSUMER_KEY => ub3rs3cr3tk3y 
[03:08:40] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_SECRET=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v8 
    CONSUMER_SECRET => ub3rs3cr3tk3y 
[03:08:57] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add SECRET_TOKEN=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v9 
    SECRET_TOKEN => ub3rs3cr3tk3y 

अब, मेरे अगले धक्का पर मूल्य तैयार हैं। लेकिन, अगर आप Heroku का उपयोग नहीं कर रहे हैं तो क्या होगा? मैं स्पष्ट रूप से हर एकल रेल परिनियोजन (जीश, यहां तक ​​कि एक हेरोकू समर्थक) पर एक विशेषज्ञ नहीं हूं, लेकिन इसका एक उदाहरण डीबी कर रहा है: परीक्षण के लिए माइग्रेट करें।

$ RAILS_ENV=test rake db:migrate 

कुंजी = मान जोड़ी से पहले आदेश वातावरण चर सेट है, तो यह आदेश चलाकर, echo ENV['RAILS_ENV']test प्रिंट होगा। तो हालांकि यह आपके पर्यावरण में स्थापित है यह है कि आप इसे कैसे करेंगे। लेकिन, पर्यावरण चर आपके कोड में नहीं हैं, इसलिए यह चाल है।

9

यदि आप फोरमैन का उपयोग कर रहे हैं, तो अपने ऐप की रूट में .env फ़ाइल डालें। (foreman docs)

.env डालने जब आप कुंजी का उपयोग करने की जरूरत है तो फिर

AWS_SECRET=xxx 
AWS_ACCESS=yyy 

होगा,:

ENV['AWS_SECRET'] 
ENV['AWS_ACCESS'] 

हालांकि यह महत्वपूर्ण है कि आप अपने संस्करण नियंत्रण को यह .env प्रतिबद्ध नहीं है। तो यदि आप गिट का उपयोग कर रहे हैं, तो .env को अपने .gitignore पर जोड़ें।


बोनस दौर! - Heroku

यदि हेरोोकू पर तैनाती है, तो इन पर्यावरण चर को भी हेरोकू पर्यावरण में कॉन्फ़िगर करने की आवश्यकता है।

  1. मैन्युअल heroku config:add आदेश
  2. अपने स्थानीय वातावरण चर, दोनों तरीकों से सिंक्रनाइज़ करने के लिए heroku-config मणि का उपयोग के माध्यम से कुंजियां जोड़ें: वहाँ दो विकल्प हैं।
संबंधित मुद्दे