ssh: स्वचालित रूप से चाबियाँ स्वीकार करते हैं


218

मैंने यह छोटी उपयोगिता लिपि लिखी है:

for h in $SERVER_LIST; do ssh $h "uptime"; done

जब एक नया सर्वर जोड़ा जाता है $SERVER_LIST, तो स्क्रिप्ट को रोका जाता है:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

मैंने कोशिश की है yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

भाग्य से नहीं।

क्या sshकिसी भी नई कुंजी को स्वचालित रूप से स्वीकार करने का एक तरीका है ?


6
Lekensteyn का उत्तर उत्कृष्ट और सही है, लेकिन मैं सिर्फ यह नोट करना चाहता था कि चूंकि ssh "हाँ" की उम्मीद कर रहा है और yesआउटपुट "y" की उम्मीद कर रहा है , तो आपको बेहतर किस्मत मिली होगी for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(अतिरिक्त हाँ पर ध्यान दें, जो बताता है कि "y" के बजाय क्या कहना चाहिए ")।
शैजोमैटिकस

जवाबों:


239

उदाहरण के लिए, StrictHostKeyChecking विकल्प का उपयोग करें:

ssh -oStrictHostKeyChecking=no $h uptime

इस विकल्प को ~ / .ssh / config में भी जोड़ा जा सकता है, जैसे:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

ध्यान दें कि जब होस्ट कुंजी बदल गई है, तो आपको इस विकल्प के साथ एक चेतावनी भी मिलेगी:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

यदि आपके मेजबानों को अक्सर पुनर्स्थापित नहीं किया जाता है, तो आप विकल्प के साथ इसे कम सुरक्षित (लेकिन अक्सर बदलते मेजबान कुंजी के लिए अधिक सुविधाजनक) बना सकते हैं -oUserKnownHostsFile=/dev/null। यह सभी होस्ट कुंजी प्राप्त करता है ताकि यह चेतावनी उत्पन्न न करे।


18.04 के साथ, एक नई संभावना है StrictHostKeyChecking=accept-new:। से man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.

10
यह सबसे अच्छा समाधान नहीं है क्योंकि यह अंतर्निहित सुरक्षा उपकरणों को बायपास करता है। ssh-keyscanयदि यह आपके सिस्टम पर उपलब्ध है, तो बेहतर है।
स्टीफन लासिवस्की 19

2
यदि आप अविश्वसनीय नेटवर्क पर हैं तो @StefanLasiewski यह मध्य हमलों में आदमी को अनुमति देता है। निश्चित मेजबानों के लिए नई कुंजी स्वीकार करने के लिए, ssh-keyscanदृष्टिकोण अधिक समझदार है। स्थानीय वर्चुअल मशीन और अन्य होस्ट के लिए भरोसेमंद नेटवर्क में गतिशील / पुन: उपयोग किए गए आईपी पते के साथ, वर्णित दृष्टिकोण काफी अच्छा है।
लेकेनस्टाइन

8
बस दो समाधानों के बीच के अंतर को स्पष्ट करने के लिए: ssh-keyscanसमाधान केवल एक आदमी के बीच में हमला करने के लिए प्रवण होता है जिसे एक बार ssh-keyscanचलाया जा रहा है। -oStrictHostKeyChecking=noसमाधान एक आदमी-इन-मध्यम हमले हर बार की संभावना है sshरन किया जा रहा है।
एरिक Sjölund 13

121

आप अपने ज्ञात_होस्ट्स के सर्वर के लिए फिंगरप्रिंट जोड़ने के लिए निम्न कमांड का उपयोग कर सकते हैं

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

नोट: आईपी ​​और डीएनएस नाम के साथ <ip-address> और <hostname> को उस सर्वर के नाम से बदलें जिसे आप जोड़ना चाहते हैं।

इसके साथ एकमात्र मुद्दा यह है कि आप अपने ज्ञात_होस्टेस में दो बार कुछ सर्वरों को समाप्त कर देंगे। यह वास्तव में एक बड़ी बात नहीं है, सिर्फ उल्लेख करना। यह सुनिश्चित करने के लिए कि कोई डुप्लिकेट नहीं है, आप पहले निम्नलिखित को चलाकर सभी सर्वरों को हटा सकते हैं:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

तो आप चला सकते हैं:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

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


1
सॉर्ट के माध्यम से इसे चलाने | uniq और उसके बाद awk का उपयोग करके डुप्लीकेट होस्ट की तलाश करना, स्क्रिप्ट को बदले हुए मेजबानों का पता लगाने में सक्षम बना देगा और उपयोगकर्ताओं को केवल उन के बारे में चेतावनी देगा, क्योंकि अलग-अलग कुंजी वाले एक ही होस्ट का मतलब परेशानी हो सकता है
लेन्नर्ट रोलैंड

2
आप एक नोट जोड़ना चाह सकते हैं जिसमें -Hहोस्टनाम और पते होंश हों।
डेविड कुलेन

25

मुझे इस प्रतिक्रिया के साथ थोड़ी देर हो गई है, लेकिन समझदार तरीका यह होगा कि आप नई मशीन पर एक ssh-keycan करें, इससे पहले कि आप अपटाइम को चलाएं।

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

सुविधा की खातिर सैनी चेक को एक खराब योजना की तरह लगता है, भले ही आपको लगता है कि आप पूरी तरह से पर्यावरण के नियंत्रण में हैं।


उपरोक्त आदेश को चलाना और वास्तव में आपके द्वारा बैंड से हासिल की गई उंगलियों के निशान के खिलाफ मेजबान कुंजी की जांच नहीं करना ठीक उसी तरह से असुरक्षित है जैसे किStrictHostKeyChecking no
code_monk

3
@code_monk: नहीं, यह नहीं है। मैं विफलता के लिए एक-बंद अवसर खोलता हूं (ज्ञात होस्ट में जोड़े जाने के लिए एक गलत होस्ट से कुंजी स्वीकार करता है)। StrictHostKeyChecking नहीं अन्य मशीनों के लिए दोहराए गए स्वीकार स्वीकार करने की अनुमति देगा।
tink

0

सर्वर की सूची को स्वचालित रूप से जोड़ने के लिए हम नीचे कर सकते हैं:

फ़ाइल सर्वर-सूची में सर्वर आईपी जोड़ें

आईपी ​​को नीचे प्रारूप में जोड़ा जाना चाहिए।

का आउटपुट cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

अपनी जगह से आईपी के ऊपर बदलें।

नीचे आदेश सूची से सभी सर्वरों को जोड़ देगा।

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.