Каждый пользователь создает и уничтожает более 15 виртуальных машин в день. Виртуальные машины создаются во внутреннем облаке OpenStack компании.
Каждый раз, когда новой виртуальной машине назначается ранее выданный IP-адрес, пользователь получает ужасную ошибку проверки ключа хоста. Это связано с тем, что ключ ssh не соответствует IP-адресу в пользователях known_hosts
файл.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xxxxxxxxxxx
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:4
RSA host key for domain.com has changed and you have requested strict checking.
Host key verification failed.
Я вижу два решения:
ssh-keygen -R
ipAddress
- (пользователи устали от этого решения, с тех пор сталкиваются с ним по несколько раз в день)Есть ли способ предотвратить появление этого сообщения об ошибке, оставаясь в безопасности? возможно отключить проверку безопасности только для определенной подсети?
Отличная особенность HostKeyAlias
решает вашу проблему:
ssh -o HostKeyAlias=hostkeyalias__vm_2013-05-11_07 user@host
создает запись hostkeyalias__vm_2013-05-11_07
(без IP) в known_hosts
. Конечно, вы можете написать сценарий или функцию оболочки, которая устанавливает это значение перед каждым вызовом ssh. Или вы используете переменную оболочки:
HOSTKEYALIAS=hostkeyalias__vm_2013-05-11_07
ssh -o HostKeyAlias=$HOSTKEYALIAS user@host
и изменить $HOSTKEYALIAS
всякий раз, когда изменяется виртуальная машина. Время от времени старые записи следует удалять из known_hosts
.
Создайте ~/.ssh/config
с содержанием:
Host *
StrictHostKeyChecking no
Кроме того, вы можете создать псевдоним для ssh, чтобы:
ssh -o StrictHostKeyChecking=no
Проблема в том, что ssh
предполагает соответствие 1: 1 между IP-адресами и хостами. Нам нужно сломать это отображение только для IP-адресов ваших облачных серверов.
Добавьте следующую строфу в свой ~/.ssh/config
файл.
# Disable HostKey checking for servers which frequently change keys
Host 172.16.24.32 172.16.24.33 172.16.24.34
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
Просто измените IP-адреса, и все готово.
Если вы хотите применить это к сетевому блоку, например 192.168 / 16, вы можете использовать такие подстановочные знаки:
# Do not keep HostKeys for internal networks.
Host 10.*.*.* 192.168.*.*
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
В исходном вопросе упоминались IP-адреса, но вы, конечно, можете использовать вместо них имена хостов. Например, это будет соответствовать ssh instance32.vm.yoyodyne.com
:
Host *.vm.yoyodyne.com
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
Если вы хотите использовать и имена хостов, и IP-адреса, вам необходимо явно указать оба, поскольку SSH не совпадает с решено Айпи адрес. Например, если у вас есть ssh ourvm.local
как ярлык для ssh 192.168.1.53
:
Host 192.168.1.53 ourvm.local
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
Будьте осторожны при обходе ssh
модель безопасности России. В частности, дважды проверьте, что ваши подстановочные знаки не соответствуют подлинным серверам, чьи HostKeys не будут меняться.
¹ Почему / dev / null? Я бросаю данные KnownHosts в битовое ведро, потому что только установка StrictHostChecking no
удаляет предупреждение, но по-прежнему отказывается подключаться. Это глупо, поэтому я предполагаю, что OpenSSH в конечном итоге изменит поведение или добавит новый параметр. Если и когда появится лучшее решение, я обновлю этот ответ.
Вы можете получить новый ключ хоста из консоли виртуальной машины и обновить файл известных хостов после загрузки экземпляра.