У меня есть несколько облачных ящиков, которые часто меняют свой IP.

Я использую ssh, используя имя хоста, но мне приходится редактировать файл 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…

Помимо любых рисков безопасности, связанных с тем, что я хочу сделать, есть ли способ либо игнорировать эту ошибку, либо автоматически перезаписать файл known_hosts, чтобы мне не всегда приходилось редактировать его самому?

answer

Отредактируйте файл ssh_config и добавьте эту строку:

CheckHostIP no

CheckHostIP по умолчанию «да». Это делает именно такую ​​проверку, которую вы терпите неудачей. Выключение этого параметра означает, что он просто доверяет тому, что IP-адрес является переменным, и будет выполнять проверку ключей по имени хоста.

Дополнение: вы можете попробовать отключить проверку CheckHostIP только для этого имени:

Host *
  [ global settings .. ]

Host very.dynamic.host
  CheckHostIP no

Многие ответы здесь будут работать, но технически это обходные пути. OpenSSH уже имеет встроенную функцию с этим в виду: HostKeyAlias.


В вашем файле .ssh / config добавьте HostKeyAlias <alias>в конфигурацию хоста:

host myserver.example.com
HostKeyAlias myserver.example.com

При этом подключение к серверу myserver.example.comне будет использовать имя хоста или IP-адрес для локальной ссылки - он всегда будет использовать только заданный HostKeyAlias ​​при подключении к этому серверу. Для меня имеет смысл использовать имя хоста, но вы, конечно, можете использовать любой псевдоним, который вам нравится.


Типичные для меня конфиги для динамических хостов такие:

host myserver
hostname myserver.dyn.example.com
HostKeyAlias myserver.private.example.com

Это также можно использовать в некоторых малоизвестных сценариях, когда вы знаете, что несколько ваших серверов имеют одинаковые ключи хоста (обычно это не должно быть так). Тогда это предотвратит дублирование записей. В будущем, если ключи изменятся законно, вам не придется заменять / удалять несколько записей. Только один. Серверы Gitlab Geo - хороший тому пример.


Что касается очистки файла known_hosts, я бы посоветовал посмотреть другие вопросы / ответы, конкретно связанные с поддержанием / удалением устаревших записей known_hosts. Например, см. Https://serverfault.com/questions/29262/how-to-manage-my-ssh-known-hosts-file ; Меня особенно впечатлил ответ user1953828, хотя я вижу, что у него не так много голосов (пока). :)

Я использую эти хитрые варианты, чтобы обойти эту проблему. (Открытый ключ моего хоста регенерируется довольно часто. Таким образом, это удаляет проверку IP и ключа)

ssh remoteServerName -l username -o "UserKnownHostsFile=/dev/null"

Вы также можете просто использовать это, если ключ останется прежним, но IP изменится:

ssh remoteServerName -l username -o "CheckHostIP=no"

Вы можете поместить CheckHostIP noв свой ~/.ssh/configфайл, но это оставляет вас уязвимым для атак спуфинга. Если вас это не беспокоит, тогда этот параметр должен отключить known_hostsпроверку.

Я избегаю добавления отпечатков пальцев в свой known_hostsфайл при подключении к временным машинам AWS. Я использую такую ​​команду, как

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i secret.pem [email protected]

чтобы подключиться к ним. Он не спросит вас, хотите ли вы добавить машину «в список известных хостов». Замените 10.0.0.5IP-адресом вашего компьютера и secret.pemполным путем вашего ключа Ssh. Вы по-прежнему будете получать предупреждения о том, что объект 10.0.0.5был добавлен, но он действительно исчез /dev/null. Я делаю это достаточно часто, чтобы установить псевдоним в своем~/.profile

alias awsssh='ssh -i secret.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Я оставляю ssh [email protected]за собой команды типа для машин, на которых я брался за проверку отпечатка пальца.

Вы можете установить StrictHostKeyChecking = no в конфигурации вашего ssh- клиента (т.е. в файле ~ / ssh / config на машине, с которой вы подключаетесь), чтобы игнорировать предупреждение.

Сделайте known_hosts доступным только для чтения.