बच्चे की प्रक्रिया के लिए पासवर्ड कैसे पास करें?


18

कमांड लाइन पर एक पासवर्ड पास करना (मेरे कार्यक्रम से शुरू हुई एक बच्चे की प्रक्रिया के लिए) असुरक्षित माना जाता है (क्योंकि यह ps कमांड वाले अन्य उपयोगकर्ताओं द्वारा भी देखा जा सकता है)। क्या इसके बजाय इसे पर्यावरण चर के रूप में पारित करना ठीक है?

इसे पास करने के लिए मैं और क्या उपयोग कर सकता हूं? (पर्यावरण चर को छोड़कर) सबसे आसान समाधान एक पाइप का उपयोग करने के लिए लगता है, लेकिन यह सबसे आसान समाधान आसान नहीं है।

मैं पर्ल में कार्यक्रम करता हूं।


2
यह आसान क्यों नहीं है? इसके लिए एक अलग / नामित पाइप होना जरूरी नहीं है, बस नियमित स्टडी / आउट करना होगा ... जो कि किसी भी भाषा में बहुत अधिक परेशानी नहीं होनी चाहिए। यदि आप यह सुनिश्चित कर सकते हैं कि यह केवल ब्याज की प्रक्रियाओं द्वारा पठनीय है (जो कि लगता है की तुलना में बहुत कठिन है) इसे एक सादा विन्यास फाइल में डाल सकते हैं।
१२:३३ पर ठंढसूटज़

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

जवाबों:


26

प्रक्रिया तर्क सभी उपयोगकर्ताओं के लिए दिखाई देते हैं, लेकिन पर्यावरण केवल एक ही उपयोगकर्ता ( कम से कम लिनक्स पर , और मैं हर आधुनिक यूनिक्स संस्करण पर सोचता हूं) के लिए दिखाई देता हूं। इसलिए एक पर्यावरण चर के माध्यम से पासवर्ड पास करना सुरक्षित है। यदि कोई आपके पर्यावरण चर को पढ़ सकता है, तो वे आपके रूप में प्रक्रियाओं को निष्पादित कर सकते हैं, इसलिए यह पहले से ही गेम है।

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

यह सुनिश्चित करना आसान है कि पासवर्ड गलती से किसी ऐसे चैनल से गुजर कर लीक न हो जाए, जिसे पाइप के रूप में ई-मेल करने के लिए डिज़ाइन नहीं किया गया है। यह भेजने के पक्ष में करना बहुत आसान है। उदाहरण के लिए, यदि आपके पास शेल चर में पासवर्ड है, तो आप बस कर सकते हैं

echo "$password" | theprogram

अगर theprogramइसके मानक इनपुट पर पासवर्ड की उम्मीद है। ध्यान दें कि यह सुरक्षित है क्योंकि echoएक बिलिन है; यह एक बाहरी आदेश के साथ सुरक्षित नहीं होगा क्योंकि psआउटपुट में तर्क उजागर किया जाएगा । उसी प्रभाव को प्राप्त करने का एक और तरीका यहां एक दस्तावेज के साथ है:

theprogram <<EOF
$password
EOF

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

get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP

यदि प्रोग्राम को फ़ाइल डिस्क्रिप्टर से पढ़ने के लिए नहीं कहा जा सकता है, लेकिन किसी फ़ाइल से पढ़ने के लिए कहा जा सकता है, तो आप इसे एक फ़ाइल डिस्क्रिप्टर से पढ़ने के लिए कह सकते हैं जैसे `/ dev / fd / 3।

theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF

Ksh, bash या zsh में, आप इसे प्रक्रिया प्रतिस्थापन के माध्यम से और अधिक संक्षेप में कर सकते हैं।

theprogram --password-from-file=<(echo "$password")

सोलारिस 9 और पुराने पर, /usr/ucb/psरूट सेट किया गया था ताकि अन्य प्रक्रियाओं के पर्यावरण चर को पढ़ा और प्रदर्शित किया जा सके - यह सोलारिस 10 में हटा दिया गया था, इसलिए उपरोक्त "हर अन्य आधुनिक यूनिक्स संस्करण" सोलरिस रिलीज पर 2005 और उसके बाद से लागू होता है।
एलक

@ अलंकार वास्तव में, मैं इन दिनों सोलारिस <10 को आधुनिक नहीं मानता। सोलारिस 9 लगभग विंडोज एक्सपी जितना ही पुराना है!
गिल्स एसओ- बुराई को रोकना '

गिलेस: ऐसे दिन हैं, जब मेरे पास सोलारिस 10 को आधुनिक मानने का एक कठिन समय है, जिसमें सोलारिस 11 को 5 साल से अधिक समय हो गया है, इसलिए मैं पूरी तरह से समझता हूं और सहमत हूं, लेकिन दुख की बात है कि कुछ लोग अभी भी सोलारिस 8 या 9. चलाते हैं
अलंक जूल

10

एक तर्क या एक पर्यावरण चर के माध्यम से सीधे पासवर्ड पारित करने के बजाय

#!/bin/bash
#filename: passwd_receiver
echo "The password is: $1"

फ़ाइल नाम पास करने के लिए समान तर्क या पर्यावरण चर का उपयोग करें :

#!/bin/bash
#filename: passwd_receiver
echo "The password is: $(< "$1")"

तो फिर आप या तो एक पारित कर सकते हैं अनुमति संरक्षित नियमित रूप से फ़ाइल (हालांकि कि एक ही उपयोगकर्ता के तहत चल अन्य प्रक्रियाओं से बचाने नहीं होगा), या /dev/stdinऔर पाइप उस में (AFAIK एक ही उपयोगकर्ता के तहत चल अन्य प्रक्रियाओं से बचाने देंगे):

 echo PASSWORD | ./passwd_receiver /dev/stdin 

यदि आप /dev/stdinयहां उपयोग करते हैं, तो यह जरूरी है कि यह एक पाइप है । यदि यह एक टर्मिनल है, तो यह उसी उपयोगकर्ता के तहत चल रही अन्य प्रक्रियाओं द्वारा पठनीय होगा।

यदि आपको पहले से ही /dev/stdinकिसी और चीज़ के लिए उपयोग करने की आवश्यकता है , तो आप प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं यदि आप एक शेल पर हैं जो इसका समर्थन करता है, जो अनिवार्य रूप से पाइप का उपयोग करने के लिए बराबर है:

./passwd_receiver <(echo PASSWORD)

नामांकित पाइप (FIFO) ऐसा लग सकता है कि वे समान हैं, लेकिन वे इंटरसेप्टेबल हैं।

ये समाधान पूरी तरह से सुरक्षित नहीं हैं , लेकिन वे पर्याप्त रूप से बंद हो सकते हैं बशर्ते कि आप एक स्मृति बाधा प्रणाली पर नहीं हैं जो बहुत स्वैप करता है।

आदर्श रूप से, आप इन फ़ाइलों को पढ़ेंगे (पाइप एक फ़ाइल भी है) nonswappable के रूप में mlock (2) के साथ चिह्नित मेमोरी में , जो कि पासवर्ड को हैंडल करना है जैसे कि gnupg।

टिप्पणियाँ:

  1. फाइलिंग पासर्स के रूप में फाइलिंग फाइलर्स के रूप में पास करना सैद्धांतिक रूप से अच्छा है, लेकिन फाइलनाम अधिक व्यावहारिक होते हैं, क्योंकि <()आपको एक फाइलनेम देता है, न कि एक फाइलस्क्रिप्ट नंबर (और coprocएस आपको एफडी_सीएलएक्सएक्सईसी चिह्नित किया जाता है , जो उन फाइलस्क्रिप्ट्स को इस संदर्भ में अनुपयोगी बनाता है)।

  2. यदि आप एक Linux सिस्टम जहां पर हैं
    /proc/sys/kernel/yama/ptrace_scopeकरने के लिए सेट कर दिया जाता 0AFAIK, तो, वहाँ (वे अपनी प्रक्रिया को देते हैं और अपनी स्मृति को पढ़ने के लिए ptrace उपयोग कर सकते हैं) एक ही उपयोगकर्ता के तहत चल अन्य प्रक्रियाओं से अपने आप को रक्षा करने का कोई रास्ता नहीं है बुलेटप्रूफ

  3. यदि आपको केवल अपना पासवर्ड अलग-अलग (नॉनरोट) उपयोगकर्ताओं के तहत चलने वाली प्रक्रियाओं से दूर रखने की आवश्यकता है, तो तर्क, पर्यावरण चर, पाइप और अनुमति संरक्षित फाइलें सभी करेंगे।


7

नहीं, पर्यावरण चर आसानी से भी पढ़ा जाता है, और बाल प्रक्रियाओं में रिसाव होता है। एक पाइप का उपयोग करके इसे पास करें।


2
"पर्यावरण चर ... बाल प्रक्रियाओं में रिसाव" एक पर्यावरण चर का उपयोग करने का पूरा बिंदु है। यदि वे विरासत में नहीं मिले तो वे बेकार हो जाएंगे। "पर्यावरण चर आसानी से भी पढ़े जाते हैं", नहीं वे नहीं हैं।
पैट्रिक

2
चर को पढ़ें, इसे अनसेट करें। यह मुश्किल नहीं है। और आप पाइप के बारे में एक ही तर्क का उपयोग कर सकते हैं। यदि पाइप से नहीं पढ़ा जाता है, तो इसे चाइल्ड प्रोसेस को पास कर दिया जाता है, और चाइल्ड प्रोसेस इसे पढ़ सकता है और पासवर्ड प्राप्त कर सकता है।
पैट्रिक

1
@Patrick unsetting वातावरण चर के दस्तावेज साधन जरूरी स्थान से मूल्य साफ़ नहीं है जहां psऔर /procइसे देख सकते हैं।

1
क्या कुछ प्रणाली आपको मनमानी प्रक्रियाओं के पर्यावरण चर पढ़ने देती है? मुझे नहीं लगता कि लिनक्स इसे दूसरों के स्वामित्व वाली प्रक्रियाओं के लिए अनुमति देता है, और यदि आप एक ही उपयोगकर्ता हैं तो आप केवल ptrace()लक्ष्य कर सकते हैं और वैसे भी इसकी मेमोरी पढ़ सकते हैं।
इलकाचू १६'१६

5
यह उत्तर गलत है। पर्यावरण चर अन्य उपयोगकर्ताओं द्वारा पढ़ा नहीं जा सकता है।
गाइल्स का SO- बुराई पर रोक '

1

यदि कुछ और सूट नहीं करता है, तो लिनक्स की-रिटेंशन सर्विस (कर्नेल कीयर) पर विचार करें।

पर शुरू: सुरक्षा / चाबियाँ । डिफ़ॉल्ट कीरिंग्स में से एक को माता-पिता और बच्चे की प्रक्रियाओं के बीच क्लोन किया जा सकता है।

यह सबसे आसान समाधान नहीं है, लेकिन यह वहां है और इसका रखरखाव और उपयोग किया जाता है (इसे पिछले साल एक एंड्रॉइड बग में भी फंसाया गया था।)

मुझे इसकी "राजनीतिक" स्थिति के बारे में पता नहीं है, लेकिन मुझे इसकी समान आवश्यकता थी, और एक गुइल बंधन पर काम करना शुरू कर दिया। पहले से मौजूद पर्ल सपोर्ट में नहीं आए।

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