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


17

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

Naively, मैं इसे इस तरह करना होगा

{
  echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
  echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)

हालाँकि मैं नए पासवर्ड को कमांडलाइन तर्क के रूप में पारित करने के बारे में चिंता करता हूं echo, क्योंकि तर्क आमतौर पर अन्य उपयोगकर्ताओं के लिए दिखाई देते हैंps -aux (हालांकि मैंने कभी भी कोई echoलाइन दिखाई नहीं दी ps)।

क्या मेरे लौटाए गए पासवर्ड के लिए एक मूल्य निर्धारित करने का एक वैकल्पिक तरीका है, और फिर इसे पास करना है chpasswd?


6
echoएक खोल में निर्मित है। यह प्रक्रिया तालिका में नहीं बदलेगा।
Kusalananda

जवाबों:


15

आपका कोड सुरक्षित होना चाहिए echo क्योंकि यह एक शेल-इन होने के बाद से प्रक्रिया तालिका में दिखाई नहीं देगा।

यहाँ एक वैकल्पिक समाधान है:

#!/bin/bash

n=20
paste -d : <( seq -f 'student%.0f' 1 "$n" ) \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

यह आपके छात्र के नाम और पासवर्ड बनाता है, n उनमें से, बिना किसी कमांड के किसी भी कमांड लाइन पर कोई पासवर्ड पारित किए बिना।

pasteउपयोगिता गोंद एक साथ कॉलम और आवेषण परिसीमक उन्हें बीच में के रूप में कई फ़ाइलों। यहां, हम उपयोग करते हैं: सीमांकक के रूप में करते हैं और इसे दो "फाइलें" (प्रक्रिया प्रतिस्थापन) देते हैं। पहले में एक seqकमांड का आउटपुट होता है जो 20 छात्र उपयोगकर्ता नाम बनाता है, और दूसरे में एक पाइपलाइन का आउटपुट होता है जो लंबाई 13 के 20 यादृच्छिक तार बनाता है।

यदि आपके पास पहले से उत्पन्न उपयोगकर्ता नाम वाली फ़ाइल है:

#!/bin/bash

n=$(wc -l <usernames.txt)

paste -d : usernames.txt \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

ये secret.txtटर्मिनल में उत्पन्न पासवर्ड दिखाने के बजाय पासवर्ड और उपयोगकर्ता नाम फ़ाइल में सहेजेंगे ।


2
यह एक चतुर समाधान है, जिसकी आवश्यकता नहीं है echoया printf, हालांकि कोड को समझने के लिए थोड़ा अजीब है
निल्स वर्नर

@ निल्सवर्नर ने थोड़ा और स्पष्टीकरण जोड़ा। अगर कोई खास बात है, तो आप मुझे बता सकते हैं कि मुझे विस्तार करना है।
Kusalananda

1
आपको echoशेल शेल बनने पर भरोसा नहीं करना चाहिए । अधिकांश गोले पर यह होता है, लेकिन इसकी कोई आवश्यकता नहीं है।
ऑस्टिन हेमेलर्गरन

1
@ कुसलानंद बस जिज्ञासु, क्या इसके बीच एक प्रभावी अंतर है tee secret.txt > >(chpasswd)और tee secret.txt | chpasswd? उत्तरार्द्ध कहीं अधिक सामान्य लगता है, इसलिए मैं सोच रहा हूं कि आपने एक सादे पाइप के बजाय प्रक्रिया प्रतिस्थापन का उपयोग करने के लिए क्यों चुना
क्रिस्टोफर श्रोबा

1
@ChristopherShroba इसके अलावा और कोई कारण नहीं है जो उस कोड के समान है जो पहले से ही प्रश्न में है (प्रक्रिया प्रतिस्थापन के साथ tee)। अब जब आपने इसे इंगित किया है, तो मुझे लगता है कि मैं वास्तव में इसे बदल दूंगा (यह बेहतर लग रहा है)। धन्यवाद।
Kusalananda

8

echo शेल में निर्मित होने की संभावना है, इसलिए यह अंदर नहीं जाएगा ps एक अलग प्रक्रिया के रूप ।

लेकिन आपको कमांड प्रतिस्थापन का उपयोग करने की आवश्यकता नहीं है, आप सीधे पाइप लाइन से उत्पादन कर सकते हैं chpasswd:

{  printf "%s:" "$username";
   head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
} | chpasswd 

यदि आप एक रन के साथ कई पासवर्ड बदलना चाहते हैं chpasswd, तो आवश्यक भागों को दोहराया जाना आसान होना चाहिए। या इसे एक समारोह में बनाएँ:

genpws() {
    for user in "$@"; do
        printf "%s:" "$user";
        head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13
        echo
    done
}
genpws username1 username2... | chpasswd 

एक तरफ के रूप में: यह head /dev/urandomथोड़ा अजीब लगता है क्योंकि urandomलाइन-उन्मुख नहीं है। यह इससे अत्यधिक मात्रा में बाइट्स को पढ़ सकता है, जो उपलब्ध एंट्रोपी की कर्नेल की धारणा को प्रभावित करेगा, जिससे आगे /dev/randomअवरुद्ध हो सकता है । यह केवल डेटा की एक निश्चित मात्रा को पढ़ने के लिए क्लीनर हो सकता है, और base64यादृच्छिक बाइट्स को प्रिंट करने योग्य वर्णों में परिवर्तित करने के लिए कुछ का उपयोग करने के लिए (केवल आपके द्वारा प्राप्त बाइट्स के लगभग 3/4 को दूर करने के बजाय)।

कुछ इस तरह से आपको लगभग मिलेगा। 16 वर्ण और संख्या:

head -c 12 /dev/urandom | base64 | tr -dc A-Za-z0-9 

(यह है कि, के उत्पादन में वर्णों की मात्रा कम से कम 16 है +और या तो प्रति वर्ण का 1/32 है, इसलिए यदि मुझे मेरा संयोजन सही मिले, तो कम से कम 14 वर्णों को छोड़ने का 99% मौका मिलता है, और कम से कम 12. छोड़ने का 99.99% मौका)/base64


आपका printfसमाधान वह नहीं करता है जो मेरा मूल कोड करता है: कई उपयोगकर्ता नाम के लिए कई लाइनें लौटाता है, लेकिन मैं आपकी टिप्पणी की सराहना करता हूंhead urandom
Nils Werner

@ निल्सवर्नर, ठीक है, मैं हालांकि कई उपयोगकर्ताओं के लिए विस्तार स्पष्ट है। लेकिन कोई बात नहीं, हम उपयोगकर्ता नाम बनाने के लिए एक फ़ंक्शन बना सकते हैं: एक बार में कई उपयोगकर्ताओं के लिए पासवर्ड जोड़े। (देखें संपादित करें)
ilkachachu

3
आप वास्तव में यूरेनियम से पहले 10 "लाइनों" पर भरोसा नहीं कर सकते हैं जिसमें आप चाहते हैं कि बहुत सारे अक्षर हैं। बस इसके बजाय सीधे ट्रे के माध्यम से यूरेनियम को चलाएं।
Kusalananda

@ कुसलानंद, क्या मेरा मतलब है मेरी head -c 10 | base64पाइपलाइन, या निल्स के साथ head | tr? यादृच्छिक बाइट्स की 10 "लाइनें" सैकड़ों बाइट्स होने की संभावना है (यह देखते हुए कि 256 में केवल 1 ही नईलाइन होगी), हालांकि सिद्धांत रूप में यह बिल्कुल 10 बाइट्स हो सकता है, लेकिन इसके बारे में पूरी तरह से नगण्य हैं। इसी तरह उपयोग करते समय base64, यदि यादृच्छिक बाइट्स सिर्फ कहने के लिए होते हैं \xff, तो बेस 64 सिर्फ स्लैश का एक स्ट्रिंग होगा, लेकिन यह अभी भी स्पष्ट नहीं है। यदि आप परवाह करते हैं, तो आप 10 से अधिक बाइट्स पढ़ सकते हैं, उस की बाधाओं को कम कर सकते हैं, और फिर परिणामी आउटपुट की लंबाई में कटौती कर सकते हैं।
ilkachachu

1
@ilkkachu मैं दोनों कोड की बात कर रहा हूं। यदि आप यादृच्छिक बाइट्स पढ़ते हैं, और जो आप नहीं चाहते हैं उसे फ़िल्टर करने के बाद एक विशेष लंबाई के कुछ चाहते हैं, तो डेटा स्रोत को काट न दें जब तक कि आप सुनिश्चित नहीं हो जाते कि आपको क्या चाहिए। जैसा कि आप कहते हैं, यह बहुत संभावना नहीं है कि आपको दस से अधिक सुर्खियां मिलेंगी /dev/urandom, लेकिन जोखिम 0% नहीं है।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.