Перейти к содержанию

Обслуживание known_hosts

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

Добавьте в файл ~/.ssh/config строку:

UserKnownHostsFile ~/.ssh/known_hosts ~/.ssh/known_hosts_trusted

Установка параметру UserKnownHostsFile значения ~/.ssh/known_hosts ~/.ssh/known_hosts_trusted дает нам следующие возможности. Во-первых, ssh будет использовать оба указанных файла для поиска известных ему открытых ключей серверов при подключении. Во-вторых, при первом подключении к новому серверу ssh спросит, хотим ли мы добавить открытый ключ этого сервера в список известных хостов. Если мы ответим утвердительно, ssh добавит ключ в ~/.ssh/known_hosts. Изменения не коснутся второго файла, а файл ~/.ssh/known_hosts_trusted мы будем обслуживать вручную.

В файл ~/.ssh/known_hosts_trusted мы будем добавлять только открытые ключи серверов, которые являются доверенными. Напомню, что если открытый ключ доверенного сервера находится в этом файле, то при подключении ssh обнаружит его и не будет добавлять в ~/.ssh/known_hosts. Это значит, что файл ~/.ssh/known_hosts будет содержать только ключи "недоверенных" (или временных) серверов и может быть легко удален после любого подключения.

Чтобы добавить ключ в уже сущестсвующий файл ~/.ssh/known_hosts_trusted, будем использовать команду ssh-keyscan. Нужно отметить, что ssh на сервере может прослушивать нестандартный порт. В таком случае простой запуск ssh-keyscan hostname ничего не даст, но можно использовать ssh-keyscan -p PORT hostname и тогда мы получим список открытых ключей. Их может быть несколько и для каждого из них будет указан алгоритм шифрования. В настоящее время одним из наиболее надежных открытых алгоритмов является ed25519.

Например, вывод команды ssh-keyscan github.com содержит:

# github.com:22 SSH-2.0-5554dfa
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
# github.com:22 SSH-2.0-5554dfa
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
# github.com:22 SSH-2.0-5554dfa
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
# github.com:22 SSH-2.0-5554dfa
# github.com:22 SSH-2.0-5554dfa

Первый открытый ключ в списке создан на базе алгоритма ed25519, поэтому скопируем его и запишем в ~/.ssh/known_hosts_trusted:

echo 'github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl` >> ~/.ssh/known_hosts_trusted

Рассмотрим еще один гипотетический пример, когда ssh сервера прослушивает нестандартный порт:

ssh-keyscan -p 12345 hostname.ru

Вывод будет немного отличаться содержанием номера порта:

# hostname.ru:12345 SSH-2.0-5554dfa
[hostname.ru]:12345 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPZQy4QCeJe1fCkNpe3Xssu4BgBJZz8awk2bz4ad0weV

Аналогично предыдущему примеру, мы можем скопировать строку в ~/.ssh/known_hosts_fixed.

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

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