किसी प्रोग्राम को पासवर्ड से सुरक्षित रूप से फीड करना


9

कमांड लाइन में पासवर्ड का उपयोग करने के साथ समस्या को समझने के बाद , मुझे एक प्रोग्राम को पासवर्ड के साथ फीड करने का एक तरीका खोजने की आवश्यकता है, इसके बिना समस्या हो रही है (पासवर्ड को कहीं दर्ज किए बिना)।

मेरे पास एक बैश स्क्रिप्ट है जो स्वचालित रूप से स्रोत से पूरे LAMP सर्वर को स्थापित करती है: Apache, FastCGI, PHP और MySQL। इन प्रतिष्ठानों को एक पासवर्ड की आवश्यकता होती है, विशेष रूप से MySQL के लिए।

मैं पासवर्ड का खुलासा किए बिना स्क्रिप्ट को पूरी तरह से स्वचालित कैसे बना सकता हूं?

संपादित करें (9 जून, 3:55 यूटीसी):
मैं रूट के माध्यम से कमांड लाइन पर पासवर्ड के साथ mysql लगा रहा हूं:

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(PASS = "p4ssw0rd" हमारे मामले में)
और मैं ps aux | grep mysqlअपने नियमित उपयोगकर्ता (dor) के माध्यम से निष्पादित करता हूं, जो मुझे पासवर्ड नहीं दिखाता है !
(कुछ) psआउटपुट है:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

यह कैसे संभव है?


इसके अलावा unix.stackexchange.com/q/385339/135943 देखें , लेकिन ध्यान दें कि यह सुरक्षित नहीं है!
वाइल्डकार्ड

जवाबों:


11

आपके अपडेट के संबंध में:

जब एक प्रक्रिया शुरू की जाती है तो इसमें मेमोरी का एक समर्पित क्षेत्र होता है जहां तर्क संग्रहीत किए जाते हैं और एक इंट जो बताता है कि कितने तर्क पारित किए गए थे।

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQL जाँच करें कि क्या पासवर्ड कमांड लाइन पर द्वारा पारित किया गया था -p, और अगर यह एक नए चर के लिए कॉपी किया गया था जो दिखाई नहीं दे रहा है, तो स्मृति के उस क्षेत्र को x'एस' के साथ अधिलेखित करें ।

सरल शब्दों में जैसे:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

आप इसे client/mysqladmin.ccस्रोत कोड की तरह पा सकते हैं :

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

जब psइसे चलाया जाता है तो यह तर्कों के मेमोरी क्षेत्र ( argv[N]) को पढ़ता है , और इस प्रकार यह होता है xxxx

पासवर्ड दिखाई देते समय बहुत कम समय के लिए, लेकिन केवल कुछ सीपीयू चक्रों के लिए।


आप विशेष --init-fileविकल्प और प्रक्रिया का उपयोग करके MySQL पासवर्ड को अपडेट कर सकते हैं । C.5.4.1.2। रूट पासवर्ड रीसेट करना: यूनिक्स सिस्टम

mysqld_safe --init-file=/home/me/mysql-init &

संपादित करें:

जैसा कि @Gilles कहते हैं, आप स्क्रिप्ट से दस्तावेज़ का उपयोग कर सकते हैं echo,printf या कर सकते हैं here

आप इसे .my.cnfअपनी होम निर्देशिका या ( अस्थायी ) फ़ाइल में भी जोड़ सकते हैं और --defaults-extra-fileविकल्प का उपयोग कर सकते हैं । (विश्वास है कि आपको कमांड लाइन पर जल्दी से उस विकल्प को जोड़ना होगा।) वैकल्पिक रूप से उपयोगकर्ता भी शामिल है। जब तक आप केवल उस फ़ाइल को कॉन्फ़िगरेशन के रूप में उपयोग करना चाहते हैं, तब तक विकल्प के नाम पर अतिरिक्त ध्यान दें :

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

वैकल्पिक रूप से [client]समूहन mysqldविन्यास को छोड़ देता है।

एक भी उपयोग कर सकते हैं MYSQL_PWDवातावरण चर, लेकिन यह चाहिए कभी नहीं कई में के रूप में आप पर्यावरण सूचीबद्ध कर सकते हैं इस्तेमाल किया जा, psद्वारा कार्यान्वयन ps -e, में /proc/<PID>/environलिनक्स आदि पर फ़ाइल

tr '\0' '\n' < /proc/<PID>/environ

विषय पर अधिक यहाँ

आप MySQL कॉन्फ़िगरेशन उपयोगिता पर एक नज़र डालना चाहते हैं जो आपको अपने होम डायरेक्टरी में एन्क्रिप्टेड फ़ाइल में पासवर्ड स्टोर करने में सक्षम बनाता है - .mylogin.cnf


क्या mysql-initपासवर्ड के साथ फ़ाइल में एक टोकन को बदलने का एक तरीका है जो एक बैश चर में संग्रहीत है? (बिना बताए)
डोर

4
@ कुछ echo 'password=p4ssw0rd' >>mysql.cnfऐसा सुरक्षित है, क्योंकि echoएक अंतर्निहित है, इसलिए पासवर्ड किसी भी प्रक्रिया की कमांड लाइन पर दिखाई नहीं देता है। यहां एक दस्तावेज भी सुरक्षित है।
गिल्स एसओ- बुराई को रोकना '

4

विशिष्ट समाधान फ़ाइल से या मानक इनपुट से पासवर्ड को पढ़ना है (या किसी अन्य फ़ाइल डिस्क्रिप्टर से जिसे एक पैरामीटर के रूप में पारित करना होगा)।


3

कुछ प्रोग्राम ( ftpउदाहरण के लिए कमांड लाइन ) /dev/ttyप्रति-प्रक्रिया विशेष फ़ाइल से पासवर्ड पढ़ते हैं , जो 'टीटीवाई को नियंत्रित करने' की प्रक्रिया का प्रतिनिधित्व करता है। यह प्रोग्राम को स्क्रीन पर पासवर्ड वापस नहीं करने देता है, और पासवर्ड कहां से आता है, इसके बारे में थोड़ा और आश्वासन दिया है।

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

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