Summary

  • RFC 4251 описывает локальную запись пары «имя сервера — открытый ключ»: при последующих подключениях клиент сравнивает предъявленный ключ с этой записью.
  • OpenSSH хранит такие записи в known_hosts. Он может спрашивать о новом ключе и отказывать при изменении ключа знакомого сервера; уже проверенный сервер способен заранее сообщить дополнительные ключи.

В ходе обмена ключами SSH сервер предъявляет ключ хоста. Клиенту надо связать его с машиной, к которой пользователь собирался подключиться. RFC 4251, опубликованный в январе 2006 года, предлагает две модели: локальную базу соответствий имён и ключей либо доверенный центр сертификации. Первая обходится без центральной картотеки. Но первая запись в собственной картотеке становится важным решением.

В стандарте приведён практический порядок: принять ключ при первом контакте, сохранить его и сверять при следующих. Появляется машинная память. Если кто-то перехватит самое первое знакомство, он может подсунуть свой ключ и попасть в эту память. Поэтому RFC допускает проверку отпечатка по отдельному каналу связи. Когда подлинный ключ уже записан, другому ключу сложнее незаметно сыграть роль того же сервера.

У OpenSSH картотека лежит в ~/.ssh/known_hosts. Руководство OpenBSD по ssh(1) объясняет хранение ключей известных хостов и заметное предупреждение при их изменении. Такое предупреждение не устанавливает виновника. Сервер могли переустановить, его ключ могли сменить по плану; возможна и подмена. Но различие между вчерашней записью и сегодняшним предъявлением уже нельзя выдать за обычный вход.

В руководстве ssh_config(5) описаны разные правила знакомства. StrictHostKeyChecking=ask просит подтвердить новый ключ и отказывается подключаться при изменении ключа известного хоста. accept-new автоматически заносит новичков, но тоже отвергает изменённые ключи. yes требует предварительно добавить новые ключи вручную. Скорость первого знакомства меняется; право старой записи на возражение остаётся.

Нормальную замену ключа можно провести без неожиданного стука в дверь. UpdateHostKeys позволяет серверу, уже прошедшему проверку, объявить дополнительные ключи. Клиент узнаёт будущий ключ, пока старый ещё подтверждает собеседника. Новый знакомый приходит с человеком, которого картотека узнаёт.

Утилита ssh-keyscan собирает открытые ключи в формате для known_hosts. Её собственное руководство предупреждает: сбор не подтверждает, кому они принадлежат; сетевой посредник может предоставить свои. Быстро заполненная картотека не исправит ложную первую запись. Сила механизма — в способности удержать правильную историю и заметить её переписывание.