- Обзор
- Обход проверки сервера SSH
- Цель верификации сервера SSH
- Цель обхода проверки сервера SSH
- Обход проверки сервера SSH в командной строке
- Обход верификации сервера SSH с помощью конфигурации
- Добавление открытого ключа хоста в файл known_hosts
- Добавление открытого ключа хоста в файл known_hosts
- Хеширование имен хостов
- Выбор типа открытого ключа хоста
- Добавление всех открытых ключей хостов в файл known_hosts
- Заключение
Обзор
Когда мы подключаемся к новому SSH-серверу, SSH-клиент обычно выдает нам запрос, спрашивая, все ли в порядке с этим действием.
Мы можем предотвратить это или убедиться, что соединение действительно нормальное.
Существует несколько методов, которые мы можем использовать для подключения к новому/неизвестному SSH-серверу, не получая интерактивного вопроса.
В этом руководстве мы рассмотрим метод добавления открытого ключа хоста в файл known_hosts, чтобы обойти вопрос.
Обход проверки сервера SSH
Проверка SSH-сервера выполняется на стороне клиента, где SSH-клиент запрашивает интерактивный вопрос всякий раз, когда мы пытаемся подключиться к новому/неизвестному SSH-серверу.
Давайте попробуем подключиться к SSH-серверу.
Мы можем использовать тестовый SSH-сервер Rebex на порту 22 с идентификатором пользователя demo и паролем password:
Если мы наберем “yes”, SSH-клиент запишет открытый ключ хоста в файл known_hosts и больше не будет запрашивать нас при последующих SSH-соединениях с этим хостом.
Если мы не введем “yes”, соединение будет скинуто.
Цель верификации сервера SSH
Проверка сервера SSH использует криптографию с открытым ключом в процессе рукопожатия SSH для проверки личности сервера.
Это гарантирует, что мы подключаемся к правильному/намеренному хосту, и, как следствие, предотвращает атаку “человек посередине“.
Цель обхода проверки сервера SSH
Есть несколько распространенных причин, по которым мы можем захотеть пропустить/обходить интерактивный вопрос, который задает SSH-клиент каждый раз, когда мы подключаемся к новому/неизвестному SSH-серверу:
- автоматизация – у нас есть скрипты, которые выполняют SSH, но мы не хотим обрабатывать интерактивный вопрос
- безопасность – мы хотим убедиться, что мы подключаемся только к правильным/намеренным хостам, чьи открытые ключи мы проверили
Обход проверки сервера SSH в командной строке
Мы можем обойти интерактивный вопрос клиента SSH с помощью ключа командной строки
По умолчанию флаг StrictHostKeyChecking имеет значение ask.
Если мы установим значение no, SSH-клиент будет автоматически добавлять ключи хостов в файл known_hosts и разрешать соединения с хостами.
Обход верификации сервера SSH с помощью конфигурации
Мы можем добавить ключи в /etc/ssh/ssh_config, чтобы отключить проверку SSH для всех хостов:
Однако обход проверок может быть очень небезопасным.
Давайте рассмотрим, как использовать механизм проверки хоста, чтобы помочь нам.
Добавление открытого ключа хоста в файл known_hosts
Поскольку файл known_hosts – это механизм, который использует SSH-клиент для определения правильной идентификации удаленного сервера, нам необходимо отредактировать этот файл.
Добавление открытого ключа хоста в файл known_hosts
Чтобы добавить открытый ключ в файл known_hosts, нам нужно найти его на сервере. Мы можем просканировать открытый ключ хоста с помощью ssh-keyscan:
Используем открытый ключ с типом ключа 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:
До:
После:
Давайте рассмотрим параметры, которые необходимо использовать для 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:
Аналогично, если для параметра HashKnownHosts установлено значение yes, мы можем передать параметр -H для автоматического хэширования имен хостов:
Эта команда добавляет все открытые ключи test.rebex.net с хэшированными именами хостов в файл known_hosts.
Заключение
В этой статье мы рассмотрели процесс добавления открытого ключа хоста в файл known_hosts.
Помимо добавления открытого ключа, мы также проверили, нужно ли хэшировать имена хостов и выбирать тип открытого ключа хоста.
Более того, наличие ключей в файлах known_host позволяет обойти вопрос проверки хоста и убедиться, что мы подключаемся к правильному хосту.
см. также:
- 🔐 Как получить открытый ключ из закрытого ключа OpenSSH
- 🔐Как определить время истечения срока действия ключа в агенте аутентификации OpenSSH
- 🔐 Как установить сервер OpenSSH на Windows с помощью PowerShell
- 🔐 Как установить сервер OpenSSH на Alpine Linux (включая Docker)
- 🔐 Как проверить версию OpenSSH
- 🕵️♂️ Как отобразить баннер/сообщение перед аутентификацией OpenSSH
- 🛡️ Как обезопасить и защитить сервер OpenSSH
- 🐧 Как проверить конфигурацию клиента OpenSSH
- 🐧 Как отозвать определенный ключ, используемый для входа в систему с OpenSSH