Как при подключении по SSH происходит проверка подлинности сервера?

«Как при подключении по SSH происходит проверка подлинности сервера?» — вопрос из категории Безопасность, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Проверка подлинности сервера в SSH основана на криптографии с открытым ключом. При первом подключении к хосту сервер представляет клиенту свой открытый ключ. Клиент сохраняет этот ключ (обычно в ~/.ssh/known_hosts) и связывает его с адресом сервера.

Процесс:

  1. Клиент инициирует соединение с сервером.
  2. Сервер отправляет свой публичный ключ хоста (host key).
  3. Клиент проверяет, есть ли у него уже сохранённый ключ для этого адреса.
    • Если ключа нет: пользователю показывается отпечаток ключа (fingerprint) с запросом на подтверждение доверия. После согласия ключ сохраняется.
    • Если ключ есть и совпадает: соединение продолжается.
    • Если ключ есть, но не совпадает: возникает предупреждение о возможной атаке "человек посередине" (MITM). Соединение прерывается, пока пользователь не разрешит конфликт вручную.

Пример записи в ~/.ssh/known_hosts:

server.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8...

Практические шаги для DevOps:

  • Для автоматизации и безопасности инфраструктуры можно предварительно собрать ключи всех серверов с помощью ssh-keyscan и распространить единый файл known_hosts через системы управления конфигурациями (Ansible, Puppet).
  • Вместо ручной проверки отпечатков можно использовать инфраструктуру открытых ключей (PKI) и подписывать ключи хостов центральным удостоверяющим центром (CA). Тогда клиенты будут доверять любому ключу, подписанному этим CA (настройка TrustedUserCAKeys в ssh_config).