Ответ
Проверка подлинности сервера в SSH основана на криптографии с открытым ключом. При первом подключении к хосту сервер представляет клиенту свой открытый ключ. Клиент сохраняет этот ключ (обычно в ~/.ssh/known_hosts) и связывает его с адресом сервера.
Процесс:
- Клиент инициирует соединение с сервером.
- Сервер отправляет свой публичный ключ хоста (host key).
- Клиент проверяет, есть ли у него уже сохранённый ключ для этого адреса.
- Если ключа нет: пользователю показывается отпечаток ключа (fingerprint) с запросом на подтверждение доверия. После согласия ключ сохраняется.
- Если ключ есть и совпадает: соединение продолжается.
- Если ключ есть, но не совпадает: возникает предупреждение о возможной атаке "человек посередине" (MITM). Соединение прерывается, пока пользователь не разрешит конфликт вручную.
Пример записи в ~/.ssh/known_hosts:
server.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8...
Практические шаги для DevOps:
- Для автоматизации и безопасности инфраструктуры можно предварительно собрать ключи всех серверов с помощью
ssh-keyscanи распространить единый файлknown_hostsчерез системы управления конфигурациями (Ansible, Puppet). - Вместо ручной проверки отпечатков можно использовать инфраструктуру открытых ключей (PKI) и подписывать ключи хостов центральным удостоверяющим центром (CA). Тогда клиенты будут доверять любому ключу, подписанному этим CA (настройка
TrustedUserCAKeysвssh_config).