Bash में> 1 प्रोग्राम के लिए पासवर्ड पास करने का सुरक्षित तरीका


21

मैं एक bashस्क्रिप्ट लिख रहा हूं , और उपयोगकर्ता से उसके पासवर्ड के लिए पूछने और इसे पास करने की आवश्यकता है openssl। जब opensslभी हम पासवर्ड को पढ़ सकते हैं, मुझे प्रोग्राम के दो रन चाहिए और उपयोगकर्ता से दो बार पूछना नहीं चाहिए। यहाँ स्क्रिप्ट है:

cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS

# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
  sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file

unset PASS

यह सुरक्षित नहीं है क्योंकि कमांड लाइन को देखकर पासवर्ड आसानी से उपलब्ध है; psउदाहरण के लिए कोई इसे पढ़ सकता है ।

opensslएक पर्यावरण चर से एक पासवर्ड पढ़ सकते हैं, तो मैं के -k "$PASS"साथ बदल सकते हैं -pass env:PASS, लेकिन यह अभी भी सुरक्षित नहीं है; किसी भी प्रक्रिया के पर्यावरण चर को स्वतंत्र रूप से पढ़ा जा सकता है (फिर से, psयह कर सकते हैं)।

तो, मैं दो opensslउदाहरणों के लिए पासवर्ड को सुरक्षित रूप से कैसे पास कर सकता हूं ?


GnuPG और PinEntry का संयोजन यहाँ gnupg.org/related_software/pinentry/index.en.html पर
निखिल मुल्ले

"किसी भी प्रक्रिया के पर्यावरण चर को स्वतंत्र रूप से पढ़ा जा सकता है" - यह पूरी तरह से सही नहीं है। psकिसी प्रक्रिया के वातावरण को पढ़ता है /proc/<pid>/environ, लेकिन इस फ़ाइल की 0600अनुमति है, इसलिए केवल रूट और प्रक्रिया चलाने वाले उपयोगकर्ता प्रक्रिया के वातावरण को पढ़ने में सक्षम हैं। मैं कहूंगा कि यह बहुत सुरक्षित है।
मार्टिन वॉन विटिच

जवाबों:


16

इनपुट से एक अलग फाइल डिस्क्रिप्टर पर पासवर्ड को पास करें (दो बार एन्क्रिप्शन के लिए और एक बार डिक्रिप्शन के लिए)। PASSपर्यावरण को निर्यात न करें ।

read -sp 'Enter password. ' PASS
printf '%s\n' "$PASS" |
openssl enc -d -aes-256-cbc -kfile /dev/stdin -in file.old |
sed ... | {
  printf '%s\n' "$PASS" |
  openssl enc -e -aes-256-cbc -kfile /dev/stdin -in /dev/fd/3 -out file;
} 3<&0

यदि आपका सिस्टम नहीं है /dev/fd, तो आप एक ओपन फाइल डिस्क्रिप्टर से पासफ़्रेज़ को पढ़ने के लिए बताने के लिए -passतर्क का उपयोग कर सकते हैं openssl

printf '%s\n' "$PASS" | {
  printf '%s\n' "$PASS" |
  openssl enc -d -aes-256-cbc -pass fd:0 -in file.old |
  tr a-z A-Z | tee /dev/tty | {
  openssl enc -e -aes-256-cbc -pass fd:3 -out file; }
} 3<&0

जैसा कि मैं आपके दूसरे उत्तर से समझता हूं , के bashसाथ संस्करण में env:PASSभी सुरक्षित है।

printf '%s\n' "$PASS"सुरक्षित नहीं है। कोई psउदाहरण के लिए कमांड लाइन पढ़ सकता है ।

6
@ user14284 नहीं, और नहीं। env:PASSसुरक्षित नहीं है क्योंकि पासवर्ड opensslप्रक्रिया के वातावरण में दिखाई देगा (यह प्रक्रिया के वातावरण में प्रकट नहीं होगा bash, लेकिन यह पर्याप्त नहीं है)। उपयोग करना printfसुरक्षित है क्योंकि यह एक बैश बिल्ट-इन है।
गिल्स एसओ- बुराई को रोकना '

इको एक बैश में बनाया गया है, तो क्या एक साधारण इको कमांड सुरक्षित नहीं होगा? echo $PASS | openssl ...। यह पीएस लिस्टिंग में नहीं दिखाई देगा। एक ही जगह आप पास कर सकते हैं bash प्रक्रिया मेमोरी में होगा। मुझे लगता है ?
gaoithe

1
@gaoithe हाँ, echoसुरक्षित होगा उसी कारण के printfलिए सुरक्षित है (और printfएक शेल में सुरक्षित नहीं होगा जहां यह नहीं बनाया गया है)। मेरे द्वारा उपयोग printfन किए जाने echoका कारण यह है कि echoबैकस्लैश (बैश विकल्पों के आधार पर) को मैंग्ल कर सकता है।
गाइल्स का SO- बुराई पर रोक '18

8

बैश का उपयोग करना यह printf '%s\n' "$PASS"तथाकथित बैंग execकमांड कमांड का उपयोग करके फाइल डिस्क्रिप्टर के साथ एक तथाकथित स्ट्रिंग को जोड़कर उपयोग किया जा सकता है ।

अधिक जानकारी के लिए देखें: कमांड लाइन के मापदंडों की शेल स्क्रिप्ट पासवर्ड सुरक्षा

(

# sample code to edit password-protected file with openssl
# user should have to enter password only once
# password should not become visible using the ps command

echo hello > tmp.file

#env -i bash --norc   # clean up environment
set +o history
unset PASS || exit 1

read -sp 'Enter password. ' PASS; echo

# encrypt file and protect it by given password
exec 3<<<"$PASS"
openssl enc -e -aes-256-cbc -pass fd:3  -in tmp.file -out file

cp file{,.old}

# decode | edit | encode
exec 3<<<"$PASS" 4<<<"$PASS"
openssl enc -d -aes-256-cbc -pass fd:3 -in file.old | 
   sed 's/l/L/g' | 
   openssl enc -e -aes-256-cbc -pass fd:4 -out file

exec 3<<<"$PASS"
openssl enc -d -aes-256-cbc -pass fd:3 -in file

rm -P tmp.file file.old
unset PASS

)

1

क्षमा करें, मेरा पिछला उत्तर ओपनसेल मैन से था, न कि ओपनसेल एनएल डॉक्स।

यह समाधान पाइपलाइन नहीं है, लेकिन मेरा मानना ​​है कि यह समाधान पासवर्ड को ps से दिखाई देने से रोकता है।

यहां एक दस्तावेज़ का उपयोग करके, केवल ओपनस्ल पासवर्ड का पाठ देखता है।
जब तक आप मध्यवर्ती फ़ाइल को समाप्त करने के लिए निश्चित हैं, कोई निशान नहीं रहता है। हो सकता है कि कोई व्यक्ति पाइप लाइन में ऐसा करने और मध्यवर्ती फ़ाइल को खत्म करने में मदद कर सकता है?

# cp file{,.old}  don't need this anymore since intermediate becomes same
read -sp 'Enter password. ' PASS; echo
#no need to export, env's are readable, as mentioned

# decode into intermediate file
openssl <<HERE 2>&1 >/dev/null
enc -d -aes-256-cbc -k "$PASS" -in file -out intermediate
HERE

# edit intermediate

# encode intermediate back into file
openssl <<HERE 2>&1 >/dev/null
enc -e -aes-256-cbc -k "$PASS" -in intermediate -out file 
HERE
unset PASS
rm -f intermediate

यह एक बेहतर उत्तर होगा यदि यह समझाया जाए कि स्विच का उपयोग कैसे किया जाए। यह गलत नहीं है (सिवाय इसके कि encकमांड में कोई -knस्विच नहीं है , कम से कम वर्तमान संस्करणों पर, यह -pass), लेकिन बहुत जानकारीपूर्ण नहीं है। (नीचे की ओर मेरा नहीं है।)
गाइल्स का SO-

धन्यवाद @Gilles, डॉक्स को देखा और मेरे ब्लंडर को देखा, एक अलग दृष्टिकोण के साथ अद्यतन जवाब।
bsd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.