سؤال ssh: قبول المفاتيح تلقائيا


لقد كتبت هذا البرنامج النصي فائدة صغيرة:

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

بدون حظ

هل هناك طريقة ل parametrize ssh لقبول أي مفتاح جديد تلقائيًا؟


171
2018-04-18 09:11


الأصل


إجابة Lekensteyn ممتازة وصحيحة ، لكني أردت فقط ملاحظة أنه بما أن ssh تتوقع "نعم" و yes الناتج "y" ، ربما كان لديك حظًا أفضل for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done (لاحظ نعم إضافية ، والتي تحكي نعم ما يقول بدلا من "ذ"). - chazomaticus


الأجوبة:


استخدم خيار 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.

185
2018-04-18 09:29



هذا ليس هو الحل الأفضل لأنه يتجاوز أدوات الأمان المضمنة. ssh-keyscan هو الأفضل ، إذا كان متاحًا على نظامك. - Stefan Lasiewski
StefanLasiewski يسمح للرجل في الهجمات المتوسطة إذا كنت على شبكات غير موثوق بها. لقبول مفاتيح جديدة للمضيفين الثابتة ، فإن ssh-keyscan النهج أكثر عاقل. بالنسبة إلى الأجهزة الظاهرية المحلية والمضيفات الأخرى في الشبكات الموثوقة التي تحتوي على عناوين IP ديناميكية / معادة استخدامها ، يكون النهج الموصَّل جيدًا بما فيه الكفاية. - Lekensteyn
فقط لتوضيح الفرق بين الحلين: ssh-keyscan الحل هو فقط عرضة لهجوم رجل في الوسط في وقت واحد ssh-keyscan يتم تشغيلها. ال -oStrictHostKeyChecking=no الحل عرضة لهجوم الرجل في الوسط في كل مرة sshيتم تشغيلها. - Erik Sjölund


يمكنك استخدام الأمر التالي لإضافة بصمة لأحد الخوادم إلى known_hosts

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

ملحوظة: استبدل <ip-address> و <hostname> باسم IP و dns الخاص بالخادم الذي تريد إضافته.

المشكلة الوحيدة في ذلك هي أنك ستنتهي ببعض الخوادم في known_hosts مرتين. انها ليست حقا صفقة كبيرة ، مجرد ذكر. لضمان عدم وجود تكرارات ، يمكنك إزالة جميع الخوادم أولاً عن طريق تشغيل ما يلي أولاً:

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

هناك شيء واحد يجب أخذه في الاعتبار عند الإزالة لمجرد إعادة إضافته ، فأنت تقوم في الأساس بإزالة أمان التحقق من بصمة الإصبع. لذلك بالتأكيد لن ترغب في تشغيل هذا البرنامج النصي قبل كل تنفيذ لبرنامجك النصي.


96
2017-10-17 00:24



تشغيله من خلال نوع uniq ثم يبحث عن مضيف مكرر باستخدام awk بعد أن يجعل البرنامج النصي قادراً على اكتشاف المضيفين المتغيرين ويحذر المستخدمين فقط حول تلك ، لأن نفس المضيف مع مفاتيح مختلفة قد يعني مشكلة - Lennart Rolland
قد ترغب في إضافة ملاحظة إلى ذلك -H تجميد أسماء وأسماء المضيفين. - David Cullen


لقد تأخرت قليلاً في هذه الاستجابة ، لكن الطريقة المعقولة ستكون القيام بـ ssh-keyscan على الجهاز الجديد قبل تشغيل تجميع وقت التشغيل.

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

يبدو أن تعطيل التحقق من سلامة العقل هو بمثابة خطة سيئة ، حتى إذا كنت تعتقد أنك تتحكم كليًا في البيئة.


23
2017-11-24 19:47



هذا هو في الواقع ما كنت أبحث عنه. شكر. - user156516
تشغيل الأمر أعلاه وعدم التحقق فعليًا من مفاتيح المضيف ضد بصمات الإصبع التي اكتسبتها خارج النطاق تكون عرضة للخطر بنفس الطريقة بالضبط StrictHostKeyChecking no - code_monk
code_monk: لا ، ليس كذلك. أنا أفتح لمرة واحدة فرصة للفشل (قبول مفتاح من مضيف خاطئ يمكن إضافته إلى المضيفين المعروفين). StrictHostKeyChecking no سوف تسمح تكرار يقبل للآلات الأخرى. - tink


لإضافة قائمة بالخوادم تلقائيًا ، يمكننا إجراء ما يلي:

إضافة خوادم IP في قائمة ملقمات الملفات

يجب إضافة عناوين IP بالشكل أدناه.

مخرج ل cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

التغيير فوق IPs عن طريق استبدال الخاص بك.

سيضيف الأمر أدناه جميع الخوادم من القائمة.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts

0
2018-02-16 07:46