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
Відповідь Лекенштейна відмінна і правильна, але я просто хотів зазначити, що оскільки ssh очікує "так" і yesвиводить "y", то, можливо, вам пощастило б for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(зверніть увагу на додатковий так, який говорить так, що сказати замість "y ").
chazomaticus

Відповіді:


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бажано, якщо він доступний у вашій системі.
Стефан Ласєвський

2
@StefanLasiewski Це дозволяє людині в атаці посередині, якщо ви знаходитесь в ненадійних мережах. Для прийняття нових ключів до фіксованих хостів, ssh-keyscanпідхід більш розумний. Для локальних віртуальних машин та інших хостів у надійних мережах з динамічними / повторно використаними IP-адресами описаний підхід є досить хорошим.
Лекенштейн

8
Просто для уточнення різниці між двома рішеннями: ssh-keyscanРішення схильне лише до атаки, що перебуває в середині людини, коли ssh-keyscanвиконується один раз . -oStrictHostKeyChecking=noРозчин схильний до атаки людина-в-середині кожного разу , коли sshце виконуються.
Ерік Шьолунд

121

Ви можете скористатися наступною командою, щоб додати відбиток пальця для сервера до ваших відомих_хостів

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

ПРИМІТКА: Замініть <ip-адресу> та <ім'я хоста> на ім'я IP та dns сервера, який ви хочете додати.

Єдине питання з цим полягає в тому, що ви двічі опинитесь на деяких серверах у ваших відомих_хостях. Це насправді не велика справа, лише згадка. Щоб не було дублікатів, ви можете спочатку видалити всі сервери, запустивши наступне:

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 after, зробив би сценарій здатним виявляти змінені хости і попереджати користувачів лише про них, оскільки той самий хост з різними ключами може означати неприємності
Lennart Rolland

2
Ви можете додати примітку, яка містить -Hімена хостів та адреси хостів.
Девід Каллен

25

Я трохи запізнююся з цією відповіддю, але розумним способом було б зробити ssh-keycan на новій машині, перш ніж запускати збір часу.

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

Вимкнення перевірки здоровості заради зручності звучить як поганий план, навіть якщо ви думаєте, що ви повністю контролюєте навколишнє середовище.


виконання вищевказаної команди і фактично не перевіряючи ключі хоста на відбитки пальців, які ви придбали поза діапазону, є вразливим точно так само, якStrictHostKeyChecking no
code_monk

3
@code_monk: ні, це не так. Я відкриває разову можливість для відмови (приймаючи ключ від неправильного хоста, який потрібно додати до відомих хостів). StrictHostKeyChecking ні дозволить повторити прийняття для інших машин.
тинк

0

Щоб автоматично додати список серверів, ми можемо зробити нижче:

Додайте IP-сервери до списку файлових серверів

IP-адреси слід додати у форматі нижче.

Вихід cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Змініть вище IP-адреси, замінивши свій.

Нижче команда додасть усі сервери зі списку.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.