Почему в файле известных хостов SSH вместо имен хостов или IP-адресов используются хэши?

Вопрос или проблема

У меня есть хост с динамическим IP, поэтому я использовал скрипт, который добавлял его адрес в файл .ssh/known_hosts. Однако недавно что-то изменилось. Мой файл выглядит так, будто его атаковал монстр хеширования:

|1|Du0QWjqCUrdRK/pnE0PTww2O2Zk=|O31W+SPPLr9+sj1m1K7MfEb+xUQ= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|K3vgE86MLJTHx8W2sPv1cgP4DI0=|Jattsr5sEW443bnyMKT6W0Noc+k= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|UlAukzqGavXZvRtMzjvXmHoVeAQ=|0JVjq7YSFulCHmkF46VFwMV/ZBY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
  1. Есть ли способ вернуться к старому, менее безопасному методу?
  2. Как я могу легко создавать записи в этом закодированном формате? (Я хочу написать скрипт, чтобы сообщить ssh, что любой ip в диапазоне 10.0.0.0/24 должен соответствовать указанному отпечатку.)

Вы можете отключить хеширование имен хостов, установив опцию клиента SSH HashKnownHosts в “no”: либо каждый раз в командной строке (ssh -o HashKnownHosts=no ...), либо в вашем пользовательском конфигурационном файле ~/.ssh/config следующим образом:

Host *
  HashKnownHosts no

Не уверен, как вы можете сами хешировать имя хоста, но вы можете иметь смешанные записи в файле known_hosts, как хешированные, так и не хешированные, так что вашему скрипту будет нормально создавать не хешированные записи.

Кроме того, вы можете использовать ssh-keygen -H, чтобы конвертировать все записи в файле known_hosts в их хешированную форму.

Как я могу легко создавать записи в этом закодированном формате?

Вы не указали, как именно вы в настоящее время добавляете ключ в файл известных хостов, но я предполагаю, что вы используете ssh-keyscan, поскольку именно этот инструмент специально предназначен для этой задачи:

ssh-keyscan — это утилита для сбора публичных SSH-ключей хостов нескольких систем. Она была разработана для помощи в создании и проверке файлов ssh_known_hosts, формат которых задокументирован в sshd(8). ssh-keyscan предоставляет минимальный интерфейс, подходящий для использования в скриптах на shell и perl.

Так что, я предположу, что ваш скрипт в настоящее время содержит строку типа:

# Удалить запись для старого IP
ssh-keygen -R $OLD_IP

# Добавить запись для нового IP
ssh-keyscan $NEW_IP >> ~/.ssh/known_hosts

Все, что вам нужно сделать, это добавить -H флаг, чтобы сгенерировать вывод в хешированном формате:

ssh-keyscan -H $NEW_IP >> ~/.ssh/known_hosts

(Я хочу написать скрипт, чтобы сообщить ssh, что любой ip в диапазоне 10.0.0.0/24 должен соответствовать указанному отпечатку.)

Я думаю, что это можно сделать гораздо проще.

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

Итак, вы можете добавить что-то вроде этого в ваш конфигурационный файл SSH:

Host 10.0.0.*
  KnownHostsCommand /usr/bin/env printf "%H ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA"

[Я использую трюк с /usr/bin/env здесь, потому что SSH требует, чтобы путь к KnownHostsCommand был абсолютным, а путь к printf не стандартизирован. Вы можете использовать абсолютный путь к printf на вашей системе вместо этого, если хотите.]

Таким образом, что это значит: если хост, к которому вы пытаетесь подключиться, соответствует шаблону 10.0.0.*, то добавьте результат вызова следующей команды в список ключей хостов. Эта команда, в свою очередь, использует токен %H (что означает “имя хоста, которое мы пытаемся найти”) и строку из вашего вопроса для формирования корректной строки ключа известных хостов для любого IP-адреса, к которому вы в данный момент пытаетесь подключиться.

Нет необходимости загромождать файл известных хостов 254 идентичными записями.

Поскольку я не могу прокомментировать, я добавляю то, что сработало для меня или что я использовал в своем скрипте,

ssh-keyscan -H -t ecdsa <targethostname>

Ответ или решение

SSH (Secure Shell) хранит в файле known_hosts информацию о доверенных хостах, с которыми вы соединялись. Обычно эта информация представлена в виде имен хостов или IP-адресов. Однако в вашем случае вы заметили, что известные хосты представлены в хэшированном формате. Давайте разберем, почему это происходит и как вы можете с этим работать.

Почему используются хеши вместо имен хостов или IP-адресов?

С версии OpenSSH 7.1 по умолчанию используется хэширование имен хостов в файле known_hosts для повышения безопасности. Это делается для защиты информации о ваших соединениях от возможных атак, таких как анализ тенденций или предсказуемые соединения. Хэширование предотвращает утечку информации о ваших серверах, так как даже если кто-то получит доступ к вашему файлу known_hosts, он не сможет увидеть реальные адреса ваших серверов.

Как вернуть старый, менее безопасный метод?

Вы можете отключить хэширование имен хостов, изменив опцию HashKnownHosts в конфигурационном файле SSH. Это можно сделать двумя способами:

  1. На командной строке:

    ssh -o HashKnownHosts=no <host>
  2. В файле конфигурации пользователя (~/.ssh/config):

    Host *
     HashKnownHosts no

После этого новые записи в файле known_hosts будут создаваться в привычном формате с именами хостов или IP-адресами.

Как легко создавать записи в хэшированном формате?

Если вы хотите, чтобы ваш скрипт добавлял хэшированные записи в файл known_hosts, вы можете использовать команду ssh-keyscan с флагом -H. Например:

# Удаляем старую запись для старого IP
ssh-keygen -R $OLD_IP

# Добавляем запись для нового IP в хэшированном формате
ssh-keyscan -H $NEW_IP >> ~/.ssh/known_hosts

Этот подход позволит вам создавать записи сразу в нужном хэшированном формате.

Как добавить записи для диапазона IP?

Для автоматизации добавления записей для диапазона IP (например, 10.0.0.0/24) вы можете использовать конфигурационный параметр KnownHostsCommand. Этот параметр позволяет указывать команду, выводящую строки ключей хостов в том же формате, что и файл known_hosts. Ваш конфигурационный файл SSH может выглядеть так:

Host 10.0.0.*
  KnownHostsCommand /usr/bin/env printf "%H ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA"

Здесь %H будет заменяться на имя хоста, к которому вы пытаетесь подключиться, и автоматически добавлять строку ключа для каждого IP в заданном диапазоне.

Заключение

Хэширование имен хостов в known_hosts — это мера безопасности, которая может предотвратить утечку информации. Вы можете легко контролировать этот механизм, изменяя настройки, а также использовать инструменты, такие как ssh-keyscan с флагом -H, чтобы создавать записи в хэшированном формате. Успехов в настройках SSH!

Оцените материал
Добавить комментарий

Капча загружается...