2009-02-18 13 views
17

हम अपने सभी एप्लिकेशन और डीबी पासवर्ड को स्रोत नियंत्रण में सादा पाठ में संग्रहीत करते हैं। हम ऐसा करते हैं क्योंकि हमारी बिल्ड/तैनाती प्रक्रिया आवश्यक कॉन्फ़िगरेशन फ़ाइलों को उत्पन्न करती है और वास्तविक पासवर्ड जो इन पासवर्ड की आवश्यकता होती है (यानी: किसी डेटाबेस के विरुद्ध चलने वाले SQL के लिए आपको वैध क्रेडेंशियल का उपयोग करके डीबी पर लॉगऑन करना आवश्यक है)। क्या किसी के पास समान आवश्यकता है जहां आप सादे पाठ में पासवर्ड संग्रहीत करते समय इस प्रकार की कार्यक्षमता को लागू करने में सक्षम थे?स्रोत नियंत्रण में पासवर्ड संग्रहण

+1

पासवर्ड को ओ/एस उपयोगकर्ता पर्यावरण चर में रखें। –

उत्तर

21

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

पहला कट, आपके पास कॉन्फ़िगरेशन फ़ाइलों में सादा पाठ पासवर्ड हैं। यह अच्छा नहीं है, उन्हें किसी भी व्यक्ति द्वारा पढ़ा जा सकता है जो फाइल देख सकता है।

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

सार्वजनिक/निजी कुंजी का उपयोग करने के बारे में कैसे? पासवर्ड के समान समस्या, कुंजी को कोड में होना चाहिए।

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

जो हमें डिस्क पर पासवर्ड डालने का कारण बताता है, यह एक बुरा विचार है। यह एक सुरक्षा फ़ायरवॉल की अवधारणा का उल्लंघन करता है। लॉगिन समझौता वाली एक समझौता मशीन का मतलब है कि अन्य मशीनों से समझौता किया जाएगा। एक खराब रखरखाव मशीन आपके पूरे संगठन को फाड़ सकती है।

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

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

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

+0

"लेकिन बॉक्स को रूट किया जाना चाहिए आप खराब हो गए हैं" मैं उलझन में हूं - क्या सुरक्षा प्रोटोकॉल हैं जहां रूट किया जा रहा है खतरे के मॉडल का हिस्सा है? मैं कल्पना नहीं कर सकता कि आप रूट हमले के खिलाफ कैसे बचाव करेंगे। – christianbundy

+0

@ क्रिस्टियनबंडी जब एक प्रणाली घुसना जाती है, तो आप यह सुनिश्चित करना चाहते हैं कि वे इसका उपयोग किसी अन्य सिस्टम में प्रवेश करने के लिए नहीं कर सकते। इस मामले में, यदि आप डिस्क पर अपना डेटाबेस पासवर्ड संग्रहीत करते हैं और एक मशीन घुमाती है, तो हमलावर अब आपके डेटाबेस तक पहुंच सकता है। मुझे लगता है कि आवेदन सर्वर और डेटाबेस विभिन्न सर्वरों पर चल रहे हैं। एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल को पढ़ने के लिए आपको रूट होने की आवश्यकता नहीं है, आपको बस एप्लिकेशन उपयोगकर्ता होना चाहिए जो बहुत आसान है। आपको इसकी आवश्यकता भी नहीं है, आपको बस अपनी कॉन्फ़िगरेशन फ़ाइल देखने में ऐप को मूर्ख बनाना होगा। – Schwern

+0

यदि आपका सिस्टम घुस गया है, तो हमलावर को पासवर्ड पढ़ने से कैसे रोकना संभव है? इसे फाइल सिस्टम में सहेजना एफएस I/O के माध्यम से पढ़ना आसान है, इसे पर्यावरण में सहेजना/proc/के माध्यम से पढ़ना आसान है, और इसे रैम में सहेजना '/ dev/mem' के माध्यम से पढ़ना आसान है। आप किस विकल्प का सुझाव दे रहे हैं? – christianbundy

-8

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

char pass[]={72, 101, 108, 108, 111}; 
+1

Boshfpngvba qbrf abg cebivqr frphevgl! – Schwern

+0

eewwwwwwwwwwwww –

-5

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

+3

तो आप डिक्रिप्शन कुंजी कहां डालते हैं? – Schwern

-1

तुम इतनी यहाँ भाषा का उल्लेख नहीं था, एक vb.net समाधान हम उपयोग करते हैं:

Imports System.Web.Security 
Imports System.Security.Cryptography 
Imports System.Text 
Imports Microsoft.Win32 

Public Class myCrypt 

Private myKey As String = "somekeyhere" 
Private cryptDES3 As New TripleDESCryptoServiceProvider() 
Private cryptMD5Hash As New MD5CryptoServiceProvider() 


Private Function Decrypt(ByVal myString As String) As String 
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey)) 
    cryptDES3.Mode = CipherMode.ECB 
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateDecryptor() 
    Dim buff() As Byte = Convert.FromBase64String(myString) 
    Decrypt = ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length)) 
End Function 

Private Function Encrypt(ByVal myString As String) As String 
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey)) 
    cryptDES3.Mode = CipherMode.ECB 
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateEncryptor() 
    Dim MyASCIIEncoding = New ASCIIEncoding() 
    Dim buff() As Byte = ASCIIEncoding.ASCII.GetBytes(myString) 
    Encrypt = Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length)) 
End Function 

End Class 
+0

हमारी बिल्ड/तैनाती प्रक्रिया एएनटी है। हमारा आवेदन कोड जावा होना होता है। –

+3

एमडी 5? TripleDES? डॉन, एमडी 5 पहले ही समझौता कर चुका है और 3 डीईएस इसके रास्ते पर है। एईएस और SHA256 का प्रयोग करें। सबसे महत्वपूर्ण बात यह है कि, जब आप लॉगिन प्रमाण-पत्र एन्क्रिप्ट कर लेते हैं, तो आप डिक्रिप्शन कुंजी कहां डालते हैं? मुर्गी का अंडा। – Schwern

6

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

यहां मैं यह कैसे करता हूं। मैंने इस पैटर्न को TikiWiki से डुप्लिकेट किया है, जो यह भी करता है।

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

दूसरी फ़ाइल में, जो बनाया गया है, यदि यह वहां नहीं है, तो वास्तविक पासवर्ड डालें। पहली फ़ाइल द्वारा इस फ़ाइल को शामिल, आयातित, जो कुछ भी शामिल करने की व्यवस्था करें।

उस फ़ाइल को अनदेखा करने के लिए अपने स्रोत नियंत्रण की व्यवस्था करें। इस तरह कुछ दिख सकता है:

# in .gitignore 
localsettings.py 

# in settings.py 
## Alter this value to log into the snack machine: 
## developers: DON'T alter this, instead alter 'localsettings.py' 
SECRET_VALUE = "" 
try: 
    from localsettings import * 
except: 
    pass 

# in localsettings.py 
SECRET_VALUE = "vi>emacs" 
1

मैंने सिस्टम बनाया है जहां डेटाबेस उपयोगकर्ता आईडी/पासवर्ड जोड़े कोड ड्रॉप का हिस्सा नहीं हैं। कुंजी साइट-विशिष्ट कॉन्फ़िगरेशन तंत्र सेट अप करना है। फिर आप कोड-बेस का हिस्सा होने के बिना, इस जानकारी को बॉक्स में प्रश्न में डाल सकते हैं।

एक बोनस है: आपके पास अलग-अलग कोड बूंदों के लिए अलग-अलग पासवर्ड नहीं हो सकते हैं, बल्कि विभिन्न डेवलपर्स के लिए भी। :-)

+0

अच्छा बिंदु। हमारे पास एक परिदृश्य है जहां हमारी तैनाती स्क्रिप्ट एक डीबी के खिलाफ एसक्यूएल चलाती है (देव, क्यूए, प्रोड, आदि हो सकती है)। यह सब एक ही तैनाती सर्वर पर किया जाता है। सुनिश्चित नहीं है कि इस मामले में इस समाधान को कैसे कार्यान्वित किया जाए। –

+0

ऐसा करने का तरीका एसक्यूएल-अपडेट स्क्रिप्ट के लिए एंड-टार्गेट सर्वर पर चलाने के लिए है। फिर यह डेटाबेस खोजने के लिए स्थानीय विन्यास का उपयोग कर सकते हैं। :-) – staticsan

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