🔐 Как добавить открытый ключ в файл known_hosts |

🔐 Как добавить открытый ключ в файл known_hosts

Мануал

Обзор

Когда мы подключаемся к новому SSH-серверу, SSH-клиент обычно выдает нам запрос, спрашивая, все ли в порядке с этим действием.

Мы можем предотвратить это или убедиться, что соединение действительно нормальное.

Существует несколько методов, которые мы можем использовать для подключения к новому/неизвестному SSH-серверу, не получая интерактивного вопроса.

В этом руководстве мы рассмотрим метод добавления открытого ключа хоста в файл known_hosts, чтобы обойти вопрос.

Обход проверки сервера SSH

Проверка SSH-сервера выполняется на стороне клиента, где SSH-клиент запрашивает интерактивный вопрос всякий раз, когда мы пытаемся подключиться к новому/неизвестному SSH-серверу.

Давайте попробуем подключиться к SSH-серверу.

Мы можем использовать тестовый SSH-сервер Rebex на порту 22 с идентификатором пользователя demo и паролем password:

ssh demo@test.rebex.net
The authenticity of host 'test.rebex.net (195.144.107.198)' can't be established.
ECDSA key fingerprint is SHA256:OzvpQxRUzSfV9F/ECMXbQ7B7zbK0aTngrhFCBUno65c.
Are you sure you want to continue connecting (yes/no)?

Если мы наберем “yes”, SSH-клиент запишет открытый ключ хоста в файл known_hosts и больше не будет запрашивать нас при последующих SSH-соединениях с этим хостом.

Если мы не введем “yes”, соединение будет скинуто.

Цель верификации сервера SSH

Проверка сервера SSH использует криптографию с открытым ключом в процессе рукопожатия SSH для проверки личности сервера.

Это гарантирует, что мы подключаемся к правильному/намеренному хосту, и, как следствие, предотвращает атаку “человек посередине“.

Цель обхода проверки сервера SSH

Есть несколько распространенных причин, по которым мы можем захотеть пропустить/обходить интерактивный вопрос, который задает SSH-клиент каждый раз, когда мы подключаемся к новому/неизвестному SSH-серверу:

  • автоматизация – у нас есть скрипты, которые выполняют SSH, но мы не хотим обрабатывать интерактивный вопрос
  • безопасность – мы хотим убедиться, что мы подключаемся только к правильным/намеренным хостам, чьи открытые ключи мы проверили

Обход проверки сервера SSH в командной строке

Мы можем обойти интерактивный вопрос клиента SSH с помощью ключа командной строки

ssh -o StrictHostKeyChecking=no test.rebex.net
Warning: Permanently added 'test.rebex.net,195.144.107.198' (ECDSA) to the list of known hosts.
Password:
Welcome to Rebex Virtual Shell!
For a list of supported commands, type 'help'.
demo@ETNA:/$

По умолчанию флаг StrictHostKeyChecking имеет значение ask.

Если мы установим значение no, SSH-клиент будет автоматически добавлять ключи хостов в файл known_hosts и разрешать соединения с хостами.

Обход верификации сервера SSH с помощью конфигурации

Мы можем добавить ключи в /etc/ssh/ssh_config, чтобы отключить проверку SSH для всех хостов:

cat /etc/ssh/ssh_config
...
Host *
StrictHostKeyChecking no
...
ssh demo@test.rebex.net
Warning: Permanently added 'test.rebex.net,195.144.107.198' (ECDSA) to the list of known hosts.
Password:
Welcome to Rebex Virtual Shell!
For a list of supported commands, type 'help'.
demo@ETNA:/$

Однако обход проверок может быть очень небезопасным.

Давайте рассмотрим, как использовать механизм проверки хоста, чтобы помочь нам.

Добавление открытого ключа хоста в файл known_hosts

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

Добавление открытого ключа хоста в файл known_hosts

Чтобы добавить открытый ключ в файл known_hosts, нам нужно найти его на сервере. Мы можем просканировать открытый ключ хоста с помощью ssh-keyscan:

ssh-keyscan test.rebex.net
test.rebex.net:22 SSH-2.0-RebexSSH_5.0.8062.0
test.rebex.net ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAkRM6RxDdi3uAGogR3nsQMpmt43X4WnwgMzs8VkwUCqikewxqk4U7EyUSOUeT3CoUNOtywrkNbH83e6/yQgzc3M8i/eDzYtXaNGcKyLfy3Ci6XOwiLLOx1z2AGvvTXln1RXtve+Tn1RTr1BhXVh2cUYbiuVtTWqbEgErT20n4GWD4wv7FhkDbLXNi8DX07F9v7+jH67i0kyGm+E3rE+SaCMRo3zXE6VO+ijcm9HdVxfltQwOYLfuPXM2t5aUSfa96KJcA0I4RCMzA/8Dl9hXGfbWdbD2hK1ZQ1pLvvpNPPyKKjPZcMpOznprbg+jIlsZMWIHt7mq2OJXSdruhRrGzZw==
test.rebex.net:22 SSH-2.0-RebexSSH_5.0.8062.0
test.rebex.net ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLZcZopPvkxYERubWeSrWOSHpxJdR14WFVES/Q3hFguTn6L+0EANqYcbRXhGBUV6SjR7SaxZACXSxOzgCtG4kwc=
test.rebex.net:22 SSH-2.0-RebexSSH_5.0.8062.0
test.rebex.net ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOdXzF+Jx/wvEBun5fxi8FQK30miLZFND0rxkYwNcYlE

Используем открытый ключ с типом ключа ssh-rsa.

Мы можем добавить эту строку в файл known_hosts:

test.rebex.net ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAkRM6RxDdi3uAGogR3nsQMpmt43X4WnwgMzs8VkwUCqikewxqk4U7EyUSOUeT3CoUNOtywrkNbH83e6/yQgzc3M8i/eDzYtXaNGcKyLfy3Ci6XOwiLLOx1z2AGvvTXln1RXtve+Tn1RTr1BhXVh2cUYbiuVtTWqbEgErT20n4GWD4wv7FhkDbLXNi8DX07F9v7+jH67i0kyGm+E3rE+SaCMRo3zXE6VO+ijcm9HdVxfltQwOYLfuPXM2t5aUSfa96KJcA0I4RCMzA/8Dl9hXGfbWdbD2hK1ZQ1pLvvpNPPyKKjPZcMpOznprbg+jIlsZMWIHt7mq2OJXSdruhRrGzZw==

Отметим, что если SSH-клиент по-прежнему выдает запрос, возможно, нам нужно проверить параметр конфигурации HashKnownHosts.

Хеширование имен хостов

Если значение параметра конфигурации HashKnownHosts в /etc/ssh/ssh_config равно yes, нам необходимо хэшировать все имена хостов в файле known_hosts, что мы можем легко сделать с помощью ssh-keygen:

До:

cat .ssh/known_hosts
...
|1|x/FU+XU7O/fk/ifF4cFTKYHO62U=|vopK8lRpcCYqdUY4a+ZFfNc5B4U= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPsQNaXMM12Zk2CeKzO2rhc2wCY+NbAzWHE8I8P37Si4Biiu4Ye0kNIc88WEw707PjIpVEXzks0WtrQLb1LMDP0=
202.157.184.104 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDvwlIAnK9+WSW7dEC4axK5VoAOC9Yt5FqRYLq8hTd33k08AkbzuNCrJoYfdksqqlp9qjiMlcDkhO/IccnFU1fe7tEzTMR/1AAuR+AvZoa6tVEUxDC3spZEWmH3AVGi4fQGY2jReCOxt6Ie07QSoyMpwDYfYidjryAn6pfFoUX8B5EyHzYrQU6kyGOeQTqXx+L1lg8/uH6RmiS5DlH3JPq4cJqKxGTW7zGBf8dDnZfZd/eiXReLoNK8HnPotIhNxxn4rPCRKzEyyFb9tOsc5hXqo6Ff3d+ajmMImZi+izpf8y84WSbeNkDjVlo0ONzyY3azi0Owlq6ac5toLnP6YJf1
ssh-keygen -Hf ~/.ssh/known_hosts
/home/baeldung/.ssh/known_hosts updated.
Original contents retained as /home/baeldung/.ssh/known_hosts.old
WARNING: /home/baeldung/.ssh/known_hosts.old contains unhashed entries
Delete this file to ensure privacy of hostnames

После:

cat .ssh/known_hosts
...
|1|x/FU+XU7O/fk/ifF4cFTKYHO62U=|vopK8lRpcCYqdUY4a+ZFfNc5B4U= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPsQNaXMM12Zk2CeKzO2rhc2wCY+NbAzWHE8I8P37Si4Biiu4Ye0kNIc88WEw707PjIpVEXzks0WtrQLb1LMDP0=
|1|tF6s1ZUMS0dGxbag7b91a4MWisY=|tZw73FGyIJyNL80IP95b1CJYgiI= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOWSOyEv30pi0M/jB6m/2HLG+gIqaT1WN6GXJPbIaYyz/EFBRP57C+xM08R0/GJKvszINJUylFm1LYT+TOoPlvU=

Давайте рассмотрим параметры, которые необходимо использовать для ssh-keygen:

  • H – хэш файла known_hosts, который, соответственно, заменит все имена хостов и адреса на хэшированные представления
  • f – имя файла ключа

 Выбор типа открытого ключа хоста

Клиент OpenSSH имеет приоритетный порядок выбора типов открытых ключей, определяемый параметром конфигурации HostKeyAlgorithms в файле /etc/ssh/ssh_config:

  • ssh-ed25519-cert-v01@openssh.com
  • ecdsa-sha2-nistp256-cert-v01@openssh.com
  • ecdsa-sha2-nistp384-cert-v01@openssh.com
  • ecdsa-sha2-nistp521-cert-v01@openssh.com
  • sk-ssh-ed25519-cert-v01@openssh.com
  • sk-ecdsa-sha2-nistp256-cert-v01@openssh.com
  • rsa-sha2-512-cert-v01@openssh.com
  • rsa-sha2-256-cert-v01@openssh.com
  • ssh-ed25519
  • ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
  • sk-ecdsa-sha2-nistp256@openssh.com
  • sk-ssh-ed25519@openssh.com
  • rsa-sha2-512,rsa-sha2-256

Если мы добавили тип ключа ssh-rsa в файл known_hosts, но по-прежнему получаем интерактивный вопрос, мы можем попробовать добавить открытый ключ хоста с типом ключа ecdsa-sha2-nistp*:

test.rebex.net ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLZcZopPvkxYERubWeSrWOSHpxJdR14WFVES/Q3hFguTn6L+0EANqYcbRXhGBUV6SjR7SaxZACXSxOzgCtG4kwc+

Мы должны помнить, что если параметр конфигурации HashKnownHosts в /etc/ssh/ssh_config имеет значение yes, нам необходимо хэшировать имена хостов с помощью ssh-keygen:

[sitmerm]$ ssh-keygen -Hf ~/.ssh/known_hosts
/home/baeldung/.ssh/known_hosts updated.
Original contents retained as /home/baeldung/.ssh/known_hosts.old
WARNING: /home/baeldung/.ssh/known_hosts.old contains unhashed entries
Delete this file to ensure privacy of hostnames[/simterm]

На этом этапе мы должны иметь возможность подключиться к SSH-серверу без запроса.

В противном случае нам может понадобиться проверить SSH-сервер, чтобы убедиться, что он настроен правильно.

Добавление всех открытых ключей хостов в файл known_hosts

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

ssh-keyscan test.rebex.net >> ~/.ssh/known_hosts

Аналогично, если для параметра HashKnownHosts установлено значение yes, мы можем передать параметр -H для автоматического хэширования имен хостов:

ssh-keyscan -H test.rebex.net >> ~/.ssh/known_hosts

Эта команда добавляет все открытые ключи test.rebex.net с хэшированными именами хостов в файл known_hosts.

Заключение

В этой статье мы рассмотрели процесс добавления открытого ключа хоста в файл known_hosts.

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

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

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий