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

Ответы:


240

Используйте параметр 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

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

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

ПРИМЕЧАНИЕ. Замените <ip-address> и <hostname> на 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 после сделает скрипт способным обнаруживать измененные хосты и предупреждать пользователей только о них, поскольку тот же хост с разными ключами может вызвать проблемы
Леннарт Ролланд

2
Возможно, вы захотите добавить заметку, которая -Hхэширует имена хостов и адреса.
Дэвид Каллен

25

Я немного опоздал с этим ответом, но разумным способом было бы выполнить ssh-keyscan на новой машине, прежде чем вы начнете сбор данных о доступности.

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

Отключение проверки работоспособности для удобства звучит как плохой план, даже если вы думаете, что полностью контролируете окружающую среду.


Выполнение вышеуказанной команды и отсутствие проверки ключей хоста на наличие отпечатков пальцев, полученных вами вне полосы, уязвимы точно так же, как иStrictHostKeyChecking no
code_monk

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

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.