
Я регулярно подключаюсь по ssh к компьютеру, который является компьютером с двойной загрузкой OS X / Linux. Два экземпляра ОС не используют один и тот же ключ хоста, поэтому их можно рассматривать как два хоста, использующих один и тот же IP и DNS. Допустим, IP — 192.168.0.9
, а имена — hostname
иhostname.domainname
Насколько я понял, решение для подключения к двум хостам — добавить их оба в ~/.ssh/know_hosts
файл. Однако это легче сказать, чем сделать, поскольку файл хэширован и, вероятно, имеет несколько записей на хост ( 192.168.0.9
, hostname
, hostname.domainname
). В результате у меня есть следующее предупреждение
Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'
Есть ли простой способ редактировать known_hosts
файл, сохраняя хэши. Например, как найти строки, соответствующие заданному hostname? Как сгенерировать хэши для некоторых известных хостов?
Идеальное решение позволило бы мне беспрепятственно подключаться к этому компьютеру с помощью ssh, независимо от того, называю ли я его 192.168.0.9
, hostname
или hostname.domainname
, и использует ли он свой ключ хоста Linux или свой ключ хоста OSX. Однако я все равно хочу получать предупреждение, если происходит настоящая атака типа «человек посередине»,то естьесли используется другой ключ, нежели эти два.
решение1
Самое простое решение здесь — просто использовать те же самые ключи хоста для Linux и OS X. То есть, выбрать один набор /etc/ssh/ssh_host_*_key*
файлов и скопировать их в другую ОС. Затем тот же самый ключ хоста будет представлен клиенту SSH независимо от того, в какую ОС вы загрузились, и клиент SSH не будет знать об этом.
решение2
Как предположил @Izzy в комментарии выше, ssh сообщает вам о проблемной строке, и если удалить эту строку (сохранив ее в другом месте), принять новый ключ, а затем скопировать удаленную строку обратно, то вы получите два ключа для одного и того же хоста, и ssh примет любой из них.
(Вы также можете использовать его ssh-keygen -H -F <hostname>
для поиска строк в файле known_hosts, которые соответствуют этому имени хоста. Запуск этого после копирования удаленной строки должен вывести две записи.)
Если кто-нибудь знает, как заставить PuTTY делать то же самое, мне было бы очень интересно услышать об этом.
решение3
Я нашел то, что может помочь вам в достижении желаемого.
Создайте файл конфигурации в каталоге .ssh следующим образом:
Host server1 Hostname x1.example.com HostKeyAlias server1 CheckHostIP no Port 22001 User karl Host server2 Hostname x2.example.com HostKeyAlias server2 CheckHostIP no Port 22002 User karl
Объяснение ниже (из man ssh_config)
ПроверитьHostIP
Если этот флаг установлен на "yes", ssh(1) дополнительно проверит IP-адрес хоста в файле known_hosts. Это позволяет ssh обнаружить, изменился ли ключ хоста из-за DNS-спуфинга. Если параметр установлен на "no", проверка не будет выполняться. Значение по умолчанию - "yes".
HostKeyAlias
Указывает псевдоним, который следует использовать вместо реального имени хоста при поиске или сохранении ключа хоста в файлах базы данных ключей хоста. Эта опция полезна для туннелирования SSH-подключений или для нескольких серверов, работающих на одном хосте.
Строка «Имя пользователя» и «Порт» избавляет вас от необходимости указывать эти параметры в командной строке, поэтому вы можете просто использовать:
% ssh server1 % ssh server2
решение4
Я не сталкиваюсь с такой проблемой при подключении к разным VPS-серверам, использующим один и тот же IP-адрес, поскольку у каждого из них свой порт SSH (20022, 30022 и т. д.), поэтому они зарегистрированы как известные хосты с разными ключами.
Может ли это стать для вас обходным решением?