कमांड लाइन पर MySQL पासवर्ड का उपयोग करने का एक सुरक्षित विकल्प क्या है?


35

हमारे पास एक डेटाबेस कमांड करने के लिए PHP कमांड-लाइन स्क्रिप्ट है। जब भी किसी डेवलपर ने एक नया डेटाबेस पैच जोड़ा है, तो हम यह स्क्रिप्ट चलाते हैं।

स्क्रिप्ट MySQL कमांड-लाइन के साथ पैच चलाता है:

system('mysql --user=xxx --password=xxx < patch.sql');

हालाँकि, MySQL 5.6 अब निम्नलिखित चेतावनी जारी करता है:

चेतावनी: कमांड लाइन इंटरफेस पर पासवर्ड का उपयोग करना असुरक्षित हो सकता है

जो स्पष्ट रूप से सच है, लेकिन उपयोगकर्ता के लिए समस्या हो सकती है या नहीं भी हो सकती है।

  • फिर सुरक्षित विकल्प क्या है ?
  • वैकल्पिक रूप से, क्या इस चेतावनी को अक्षम करना संभव है?

कृपया ध्यान दें कि मुझे बाहरी पासवर्ड फ़ाइल पर निर्भर नहीं रहना है।


2
किसी फ़ाइल में आपका क्रेडेंशियल्स होना किसी समस्या का बड़ा हिस्सा नहीं है। यदि किसी व्यक्ति के पास आपके सर्वर पर रूट विशेषाधिकार हैं, तो वे प्रमाणीकरण प्रणाली को पूरी तरह से बायपास कर सकते हैं, बस एक विशेष विकल्प के साथ mysql सर्वर को पुनरारंभ करके।
ज़ॉदाचेस

यह वैसी समस्या नहीं है जैसी कि डुप्लीकेट डुप्लिकेट में होती है । MySQL पासवर्ड के लिए संकेत नहीं दे रहा है, मैं इसे प्रदान कर रहा हूं और यह ठीक काम कर रहा है। मुझे पासवर्ड प्रदान करने के लिए विकल्प की तलाश है, पासवर्ड फ़ाइल को छोड़कर।
बेंजामिन

जवाबों:


17

MySQL के हालिया GA संस्करण में, अर्थात संस्करण 5.6 , आप इसे mysql_config_editor कमांड के माध्यम से कर सकते हैं, जैसा कि http://dev.mysql.com/doc/refman/5.6/en/myshl-config-editor.html में वर्णित है

मूल रूप से यह क्या करता है: अपने उपयोगकर्ता को एन्क्रिप्ट करें / एक मेजबान उर्फ ​​के साथ क्रेडेंशियल्स पास करें, और फिर आप मेजबान उपनाम का उपयोग करें, इस जानकारी को अपने घर निर्देशिका में एक कॉन्फ़िगर फ़ाइल में डालें, और फिर, जब आपको इसकी आवश्यकता होती है, तो ऐसा कुछ करने के बजाय :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

आप इसके बजाय लिखते हैं:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

जिससे आपका पासवर्ड क्लियरटेक्स्ट में किसी स्क्रिप्ट में डालने से बचता है।

इसे काम करने के लिए, आपको पहले (केवल एक बार) इस myhostaliasरूप में परिभाषित करना होगा :

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

आप अलग-अलग खातों और / या मेजबानों के लिए अलग-अलग लॉगिन पथ का उपयोग कर सकते हैं। बहुत अच्छा विचार है अगर आप मुझसे पूछें।

एक नोट के रूप में, मेरा मानना ​​है कि यह कार्यक्षमता 5.6 से नीचे किसी भी संस्करण में मौजूद नहीं है।


नोट: मुझे पता है कि mysql_config_editor वास्तव में एक बाहरी पासवर्ड फ़ाइल बनाता है, हालांकि, यह आपके द्वारा नहीं किया जाता है, इसका सिस्टम कैसे काम करता है, इसलिए आपके लिए कोई मैनुअल en / de / crypting नहीं है।
टुनके गोनकुओलू

धन्यवाद, मैं MySQL 5.6 का उपयोग कर रहा हूं, इसलिए यह कोई समस्या नहीं है। उस ने कहा, आपका दृष्टिकोण अभी भी समस्याग्रस्त है (कम से कम हम वर्तमान में कैसे काम करते हैं), क्योंकि मैं वास्तविक समय में एक PHP कॉन्फिगर फाइल से पासवर्ड लेना चाहता हूं, और इसे कमांड लाइन में गतिशील रूप से पास करता हूं। आपके सुझाव के साथ, मुझे अभी भी कॉल करते समय कमांड लाइन पर पासवर्ड का उपयोग करना होगा mysql_config_editor, इसलिए यह दुर्भाग्य से बहुत अधिक मूल्य नहीं लाता है। मैं डेवलपर को मैन्युअल रूप से करने से बचने की कोशिश कर रहा हूं, इस प्रकार PHP कॉन्फिग फाइल और mysql कॉन्फिगर दोनों को बनाए रखना है ।
बेंजामिन

मेरा सबसे अच्छा समाधान शायद अब के लिए चेतावनी को नजरअंदाज करना है। मैं वास्तव में सोच रहा था कि क्या कोई सुरक्षा मुद्दा है: क्योंकि यह PHP से कहा जाता है, मुझे लगता है कि कमांड लाइन को बैश इतिहास या मशीन पर कहीं और संग्रहीत नहीं किया गया है?
बेंजामिन

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

9

--defaults-fileया --defaults-extra-fileविकल्प का उपयोग करें । आप इसमें यूजर-आईडी और पासवर्ड निर्दिष्ट कर सकते हैं। इसका प्रारूप भी वैसा ही है /etc/my.cnf

आगे पढ़ते हुए, आप कहते हैं कि आपको बाहरी पासवर्ड फ़ाइल पर भरोसा नहीं करना है, लेकिन यह वास्तव में सुरक्षित तरीका है। कुछ और प्रक्रिया तालिका या कुछ में निशान छोड़ देंगे। यदि आप वास्तव में चाहते हैं तो आप पासवर्ड फ़ाइल को संस्करण नियंत्रण में भी रख सकते हैं। इसे 600 (या 400) और केवल mysql या इसके द्वारा चलाए जा रहे उपयोगकर्ता द्वारा ही पढ़ा जा सकता है।


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

विंडोज सर्वर 2012 पर यह कैसे करें? विन्यास फाइल कहाँ है जिसमें --defaults-file विकल्प है?
जेक

आप फ़ाइल को विकल्प के रूप में निर्दिष्ट करते हैं - फाइल-फ़ाइल के रूप में:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@ बैंजामिन, इसलिए यदि यह सुरक्षा के बारे में नहीं है, तो बस कमांड लाइन में पासवर्ड टाइप करें। ऐसा करने में (सुरक्षा के अलावा) क्या गलत है?
पचेरियर

@Benjamin यदि आप पहले से ही PHP से MySQL का उपयोग कर रहे हैं, तो आप mysqlकंसोल क्लाइंट को क्यों कर रहे हैं ?
जोसिप रॉडिन

5

आपके पास http://dev.mysql.com/doc/refman/5.1/en/password-security-usc.html प्रति 4 विकल्प हैं

  • कमांड लाइन पर -pyour_passया --password=your_passविकल्प का उपयोग करें
  • कोई पासवर्ड मान निर्दिष्ट नहीं के साथ कमांड लाइन पर -pया --passwordविकल्प का उपयोग करें । इस स्थिति में, क्लाइंट प्रोग्राम संवादात्मक रूप से पासवर्ड को हल करता है:
  • एक विकल्प फ़ाइल में अपना पासवर्ड स्टोर करें।
  • MYSQL_PWDपर्यावरण चर में अपना पासवर्ड स्टोर करें

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


1
MYSQL_PWD कम सुरक्षित तब कमांड लाइन कैसे होगी? पीडब्लू प्रक्रिया की सूची में कभी नहीं
दिखा

1
ज़रूर करता है। man psहै -E Display the environment as well. अपने MySQL पासवर्ड अत्यंत असुरक्षित विचार किया जाना चाहिए और नहीं किया जाना चाहिए निर्दिष्ट करने का यह तरीका: यूआरएल मैं से जुड़ा हुआ से। पीएस के कुछ संस्करणों में चल रही प्रक्रियाओं के वातावरण को प्रदर्शित करने का एक विकल्प शामिल है। कुछ सिस्टम पर, यदि आप MYSQL_PWD सेट करते हैं, तो आपका पासवर्ड पीएस चलाने वाले किसी अन्य उपयोगकर्ता के संपर्क में है। पीएस के ऐसे संस्करण के बिना सिस्टम पर भी, यह मान लेना नासमझी है कि कोई अन्य तरीका नहीं है जिसके द्वारा उपयोगकर्ता प्रक्रिया वातावरण की जांच कर सकते हैं।
RS

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

@kormoc, कृपया अंतिम पैराग्राफ पर विस्तृत जानकारी दें। क्या आप के बारे में बात कर रहे थे कि काफी जटिल समाधान है?
पचेरियर

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

4

यदि आपकी PHP स्क्रिप्ट में पहले से ही एक खुला डेटाबेस कनेक्शन है, तो आप mysqli_multi_query().sql फ़ाइल को आयात करने के लिए उपयोग क्यों नहीं करते ? यदि .sql फ़ाइल का वाक्यविन्यास मान्य है, तो ...


मुझे यकीन नहीं है कि कितना अच्छा है कि काफी बड़ी .sql फ़ाइलों के साथ काम करेगा?
बेंजामिन

1
@Benjamin मैं कल्पना करता हूं कि MySQL क्लाइंट की तुलना में कोई भी बदतर नहीं है - यदि आप वास्तव में सुरक्षा के बारे में चिंतित हैं, तो इसके बारे में जाने के लिए सबसे कम हैकिश तरीका होगा, और आकार एक समस्या है जिसे आप कई तरीकों से हल कर सकते हैं।
voretaq7

क्या आपको पता है कि यह पीडीओ के साथ संभव है?
बेंजामिन

पीडीओ को एक साथ सभी डेटाबेस में प्रश्नों का एक गुच्छा फेंकने के लिए एक समान कार्य नहीं लगता है। माफ़ कीजिये। यह एक विचार था ...
माइकल हैम्पटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.