Вопрос 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

без везения.

Есть ли способ параметризации ssh автоматически принимать любой новый ключ?


171
2018-04-18 09:11


происхождения


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


Вы можете использовать следующую команду для добавления отпечатка пальца для сервера к вашим известным_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-адреса должны быть добавлены в формате ниже.

Вывод 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

0
2018-02-16 07:46