Вопрос или проблема
У меня есть хост с динамическим 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
- Есть ли способ вернуться к старому, менее безопасному методу?
- Как я могу легко создавать записи в этом закодированном формате? (Я хочу написать скрипт, чтобы сообщить 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. Это можно сделать двумя способами:
-
На командной строке:
ssh -o HashKnownHosts=no <host>
-
В файле конфигурации пользователя (~/.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!