Безопасность серверов

SSH не подключается: Permission denied, host key changed и другие ошибки

Как определить этап отказа SSH, безопасно проверить ключ хоста, publickey, политики доступа и журналы sshd.

17 минут
абстрактная иллюстрация диагностики защищённого SSH-подключения
Сначала определите этап, на котором остановилось соединение: проверка ключа хоста SSH происходит до входа пользователя, а Permission denied обычно означает отказ на этапе аутентификации или проверки политики доступа. Не удаляйте запись файла known_hosts и не отключайте проверку ключа хоста, пока не сверите новый отпечаток ключа SSH по независимому доверенному каналу. Для диагностики сопоставляйте вывод клиента с эффективной конфигурацией и журналами сервера.

Не обходите проверку подлинности хоста

Не исправляйте REMOTE HOST IDENTIFICATION HAS CHANGED флагами отключения проверки ключа хоста или безусловным удалением known_hosts. Такое предупреждение может означать переустановку системы, пересоздание VM или смену адреса, но также подмену узла между клиентом и сервером. Если смена не была запланирована или вызывает сомнения, действуйте как при потенциальном инциденте: сохраните сведения и используйте процедуру реагирования на взлом сервера.

Сначала определите этап, на котором остановился SSH

OpenSSH устанавливает TCP-соединение, согласует криптографические параметры, проверяет ключ удалённого хоста и только затем аутентифицирует пользователя. Поэтому одна и та же внешняя картина — «не могу войти» — имеет разные причины и требует разных действий.

Диагностическое дерево по сообщению клиента

СимптомЭтапЧто это обычно означаетПервое безопасное действие
REMOTE HOST IDENTIFICATION HAS CHANGED!, Host key verification failedПроверка хоста до аутентификацииПредъявленный ключ хоста не совпал с сохранённым для имени или адресаПодтвердить новый отпечаток по консоли, BMC, инвентаризации или подтверждённому каналу с владельцем
Permission denied (publickey)Аутентификация пользователяСервер не завершил аутентификацию предложенным ключом или доступ запрещён политикойПроверить выбранный ключ, authorized_keys, права, эффективную конфигурацию sshd и журналы
Too many authentication failuresАутентификация пользователяДо нужного ключа клиент или агент предложил слишком много других ключейОграничить набор ключей на стороне конкретного клиента
no matching host key type, no matching signature algorithmСогласование алгоритмовУ клиента и сервера нет совместимого разрешённого алгоритмаСопоставить версии, криптополитику и конфигурации с обеих сторон
sshd: no hostkeys availableЗапуск или работа сервераsshd не нашёл пригодного закрытого ключа хоста либо не может его прочитатьПроверить HostKey, наличие, владельца, права и журналы через консоль
Connection closed by remote host, разрыв после Connection establishedПосле TCP или во время SSH-обменаСоединение закрыл сервер, промежуточное устройство или удалённая сторона путиЗафиксировать время, запустить подробный вывод и сопоставить его с серверными журналами

Как читать ssh -v и почему одного вывода клиента недостаточно

Диагностические ключи, формат строк и доступные параметры зависят от версии OpenSSH. Ориентируйтесь на man-страницы ssh(1) и ssh_config(5) той системы, где запускается клиент. Обычно -v достаточно для первичной проверки, а -vvv показывает выбор конфигурации, файлов ключей и ход аутентификации подробнее.

Запускает подключение с максимально подробным типичным выводом. Не публикуйте такой вывод без проверки: в нём могут быть имена пользователей, пути, адреса и сведения о конфигурации.
ssh -vvv user@example.example
  • Строки о Connecting to и Connection established подтверждают попытку TCP-подключения, но не доказывают, что дальше отвечает именно ожидаемый sshd.
  • Строки вида Server host key: или Host key verification failed относятся к проверке сервера и предшествуют аутентификации пользователя.
  • Offering public key означает, что клиент предлагает ключ; Server accepts key означает, что сервер согласился на этот ключ и запросил подпись. Если после этого вход не завершился, ищите дальнейшие сообщения и серверные журналы.
  • Authentications that can continue: publickey,password — перечень методов, допустимых сервером на этом этапе. Он не доказывает, что конкретный уже предложенный ключ был отвергнут именно из-за отсутствия в authorized_keys.
  • Connection closed by ... на стороне клиента фиксирует факт закрытия сокета. Без журналов сервера, прокси или сетевого устройства нельзя надёжно приписать разрыв сети, sshd либо промежуточному устройству.

Если TCP-соединение не устанавливается

Тайм-аут, No route to host, Connection refused, ошибки DNS, маршрутизации и IP-адресации находятся за рамками этой статьи и требуют отдельной сетевой диагностики. Если есть признаки фильтрации пакетов, начните с политики firewall сервера, а для UFW и firewalld используйте отдельную инструкцию.

SSH host key changed: как безопасно подтвердить смену ключа

Предупреждение REMOTE HOST IDENTIFICATION HAS CHANGED означает, что клиент получил для указанного имени или адреса ключ, отличный от сохранённого ранее. Легитимные причины: VM пересоздали, ОС переустановили, ключи хоста заменили в плановом порядке, DNS-имя или IP теперь указывает на другой узел, либо за балансировщиком оказался иной сервер. Но те же симптомы возможны при атаке «человек посередине» или компрометации инфраструктуры.

Безопасная обработка предупреждения о смене host key

Выполняйте действия через независимый от проблемного SSH канал: локальную консоль, консоль провайдера, BMC или заранее подтверждённый контакт владельца узла.

  1. 1
    Зафиксируйте имя, адрес и старый отпечаток
    Сохраните полный текст предупреждения: клиент обычно указывает тип ключа, новый отпечаток и строку прежней записи. Проверьте, к какому имени, IP и порту подключались. Это помогает обнаружить изменение DNS, адреса или порта.
  2. 2
    Получите отпечаток с самого сервера
    Через доверенную консоль найдите ключ хоста того типа, который указан клиентом, и вычислите его отпечаток. Например, для Ed25519 обычно проверяют публичный файл /etc/ssh/ssh_host_ed25519_key.pub. Ожидаемый результат — отпечаток совпадает с тем, который показал клиент. Несовпадение означает, что запись удалять нельзя: проверьте адресацию, DNS и признаки инцидента.
  3. 3
    Проверьте, что изменение ожидаемо
    Сопоставьте отпечаток с инвентаризацией, заявкой на замену, данными автоматизации или подтверждением ответственного владельца. Одного факта, что сервер отвечает по нужному IP, недостаточно для подтверждения его подлинности.
  4. 4
    Удалите только подтверждённую устаревшую запись
    После подтверждения удалите запись для конкретного имени или адреса через ssh-keygen -R, затем подключитесь снова и внимательно сравните предъявленный отпечаток с подтверждённым. Команда удаляет локальную запись, но не подтверждает легитимность нового ключа.
Выполняется на сервере через доверенную консоль и выводит отпечаток публичного ключа хоста. Подставьте файл ключа того алгоритма, который указан в предупреждении клиента.
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Ищет локальные записи `known_hosts` для имени. Для нестандартного порта имя обычно записано в форме `[example.example]:порт`.
ssh-keygen -F example.example
Удаляет записи указанного имени из пользовательского `known_hosts`. Допустимо только после подтверждения нового отпечатка. Для нестандартного порта используйте форму `ssh-keygen -R '[example.example]:2222'`.
ssh-keygen -R example.example

Подробнее о проверке отпечатка ключа SSH, создании ключей и устройстве known_hosts — в статье «Безопасная настройка SSH: ключи, root и ограничение доступа».

Permission denied (publickey): что проверить, если ключ есть в authorized_keys

Permission denied (publickey) означает, что аутентификация по открытому ключу не завершилась. Наличие строки в файле authorized_keys — необходимое, но не достаточное условие: клиент может выбрать другой закрытый ключ, сервер может не прочитать файл, а правила доступа могут запретить вход уже после распознавания ключа.

Диагностика ssh permission denied publickey

  1. 1
    Явно укажите нужный закрытый ключ
    Подключитесь с -i и IdentitiesOnly=yes. В подробном выводе должна появиться попытка использовать именно заданный файл. Если вход стал успешным, вероятная причина — прежний выбор идентичностей клиента или лишние ключи агента. Учтите, что другие IdentityFile, явно заданные в конфигурации, могут сохраняться; итоговые параметры назначения можно посмотреть через ssh -G.
  2. 2
    Сравните открытый ключ с серверной записью
    Получите открытый ключ из используемого закрытого ключа или сравните отпечатки. Проверьте, что он относится к нужной учётной записи, целая строка присутствует в authorized_keys, не содержит случайных переносов и её параметры не ограничивают данный сценарий.
  3. 3
    Проверьте владельца и доступ к пути
    На сервере проверьте домашний каталог пользователя, ~/.ssh и authorized_keys. При включённом StrictModes sshd может отклонить файл, если он или путь к нему небезопасно доступны для записи другим пользователям.
  4. 4
    Получите эффективную конфигурацию sshd
    Проверьте синтаксис и выведите эффективные значения. Учитывайте Match: для конкретного пользователя, адреса и имени удалённого клиента конфигурация может отличаться от глобальных строк в файле.
  5. 5
    Сопоставьте попытку с журналом сервера
    Повторите одну контролируемую попытку входа и сразу найдите событие по времени, имени пользователя и исходному адресу. Журнал обычно показывает более точную причину: небезопасные права, неверный владелец, запрет пользователя, ошибку PAM или отказ ключа.
Явно добавляет указанный ключ и не позволяет клиенту использовать неописанные ключи агента. Другие `IdentityFile`, заданные в системной или пользовательской конфигурации, могут также участвовать. Ожидаемый признак — в выводе упоминается `~/.ssh/id_ed25519`; при успехе сервер принимает ключ и открывает сессию.
ssh -vvv -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@example.example

IdentityFile задаёт дополнительный файл идентичности клиента; несколько таких параметров могут накапливаться. IdentitiesOnly yes ограничивает использование идентичностями, явно заданными в конфигурации или командной строке, даже если SSH-агент хранит другие ключи. IdentityAgent задаёт сокет агента либо отключает его для конкретного назначения. PreferredAuthentications меняет порядок и набор предпочитаемых методов, но сам по себе не выбирает конкретный файл ключа. Точное поведение и доступность параметров смотрите в ssh_config(5) используемой версии.

SSH key: неправильные права на закрытый ключ клиента

На Unix-подобных системах OpenSSH обычно отказывается использовать локальный закрытый ключ, если файл доступен другим пользователям. В выводе встречается сообщение наподобие UNPROTECTED PRIVATE KEY FILE! и This private key will be ignored. Это защита секрета, а не ошибка сервера. Точные проверки режимов и ACL зависят от ОС, файловой системы и реализации клиента.

Типичная настройка для личного закрытого ключа: читать и изменять файл может только владелец, каталог также закрыт от других пользователей. Затем повторите `ssh -vvv -i ~/.ssh/id_ed25519 ...`; сообщение о небезопасном ключе должно исчезнуть.
chmod 600 ~/.ssh/id_ed25519 && chmod 700 ~/.ssh

Не расширяйте права для устранения ошибки

Не применяйте chmod 777 к закрытому ключу, .ssh или authorized_keys. Общая запись позволяет подменить ключи и, в зависимости от объекта, получить доступ к учётной записи. Если права выставлены верно, но клиент всё ещё отказывается от ключа, проверьте ACL, владельца, тип файловой системы и сообщения клиента.

Права и владельцы authorized_keys на сервере

Директива StrictModes в sshd_config заставляет sshd проверять владельца и режимы файлов пользователя и домашнего каталога до принятия входа. В типичной локальной конфигурации домашний каталог принадлежит пользователю, ~/.ssh имеет режим 700, а ~/.ssh/authorized_keys — 600; они не должны быть доступны на запись группе или всем. Стандартный либо настроенный путь к ключам определяет AuthorizedKeysFile, поэтому не предполагайте, что sshd читает только ~/.ssh/authorized_keys.

Показывает владельцев и режимы самого файла и компонентов пути. Ищите неожиданного владельца, запись для группы или остальных пользователей, а также отличный от ожидаемого домашний каталог.
namei -l /home/user/.ssh/authorized_keys && ls -ld /home/user /home/user/.ssh && ls -l /home/user/.ssh/authorized_keys
Типичный вариант исправления для локальной учётной записи `user`, если именно этот каталог назначен домом пользователя и sshd использует данный `AuthorizedKeysFile`. Перед рекурсивной сменой владельца убедитесь, что в каталоге нет файлов, которые должны принадлежать другому владельцу.
chown -R user:user /home/user/.ssh && chmod 700 /home/user/.ssh && chmod 600 /home/user/.ssh/authorized_keys

На системах с SELinux или AppArmor обычные Unix-права могут быть корректны, но доступ sshd всё равно будет запрещён политикой. Не отключайте механизм мандатного контроля для проверки: разберите отказ и контекст по инструкции «SELinux на сервере» либо «AppArmor на сервере».

Too many authentication failures: как ограничить лишние ключи агента

Ошибка Too many authentication failures обычно означает, что sshd исчерпал лимит попыток аутентификации до того, как клиент дошёл до правильного ключа. Ограничение на сервере задаёт MaxAuthTries в sshd_config(5); конкретное значение может быть изменено администратором. Увеличение лимита или отключение его защиты ради одного клиента обычно хуже, чем передать нужный ключ явно.

Безопасный разовый способ явно предложить нужный ключ и исключить лишние ключи агента, не меняя `MaxAuthTries` на сервере. Параметр не отменяет другие `IdentityFile`, заданные в конфигурации. Если ошибка сохраняется, проверьте итоговые параметры командой `ssh -G example.example` и удалите лишние `IdentityFile` из настроек этого назначения.
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@example.example
~/.ssh/config
Host app-prod
    HostName example.example
    User user
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Если необходимо использовать отдельный агент, задайте для этого хоста IdentityAgent в соответствии с ssh_config(5) или временно отключите агент для подключения. PreferredAuthentications publickey может поставить метод ключа первым, но не решает проблему множества ключей без IdentitiesOnly или корректного IdentityAgent. Посмотреть ключи текущего агента обычно можно командой ssh-add -l; не удаляйте ключи из общего агента, если ими пользуются другие сессии или процессы.

Корректный ключ, но вход запрещён: sshd, Match, PAM и учётная запись

Даже принятый ключ не отменяет правила доступа. Вход могут запретить AllowUsers, AllowGroups, DenyUsers, DenyGroups, условия Match, запрет интерактивной оболочки, срок действия или блокировка учётной записи, а также PAM. Внешние источники идентификационных данных — например LDAP или доменные службы — добавляют собственные условия.

Проверяет синтаксис конфигурации sshd до перезагрузки или применения изменений. Пустой вывод и код завершения 0 обычно означают, что синтаксических ошибок не найдено. Укажите `-f путь`, если служба использует нестандартный файл конфигурации.
sudo sshd -t
Выводит эффективную конфигурацию с учётом условий `Match` для моделируемого подключения. Здесь `user` — пользователь SSH, `addr` — исходный адрес клиента, а `host` — имя удалённого клиентского узла для проверки `Match Host`, не имя сервера назначения. Подставьте параметры реального подключения. Ищите как минимум `authorizedkeysfile`, `strictmodes`, `pubkeyauthentication`, `usepam`, `allowusers`, `allowgroups`, `denyusers`, `denygroups` и `maxauthtries`. Поддержка `-T`, `-C` и отдельных полей зависит от версии OpenSSH.
sudo sshd -T -C user=user,host=client.example.example,addr=192.0.2.10

Проверяйте Match именно с параметрами реального подключения: правило может зависеть от пользователя, исходного адреса, имени, локального адреса или порта. Строка в основном файле конфигурации не гарантирует итоговое значение, если используются включаемые фрагменты или более специфичные правила.

Проверка блокировки учётной записи и политик входа

  1. 1
    Определите источник учётной записи
    Установите, является ли пользователь локальным, каталоговым или управляемым другой системой идентификации. Способ просмотра срока действия, состояния блокировки и снятия блокировки зависит от дистрибутива, PAM-конфигурации и источника данных.
  2. 2
    Проверьте запись пользователя и его оболочку
    Для локальной записи проверьте, существует ли пользователь, какой у него домашний каталог и разрешена ли оболочка для интерактивного входа. Оболочка вроде nologin или false может позволить техническую аутентификацию, но не интерактивную SSH-сессию.
  3. 3
    Проверьте срок действия и блокировку средствами ОС
    Используйте штатные инструменты и документацию своего дистрибутива или каталога. Не применяйте универсальную команду разблокировки из другого семейства ОС: она может не затронуть PAM, доменную учётную запись или создать несогласованное состояние.
  4. 4
    Сопоставьте состояние с журналом sshd и PAM
    Повторите одну попытку, затем найдите запись по времени. Сообщения вроде account locked, account expired, access denied или PAM error позволяют отделить политику аккаунта от проблем ключа.
Показывает разрешённую системой запись пользователя и помогает увидеть домашний каталог и оболочку. Отсутствие результата означает, что имя не разрешается текущей настройкой NSS; это отдельная причина отказа, которую нужно проверять в используемом источнике идентификации.
getent passwd user

Для локальных Linux-учётных записей срок действия и статус часто проверяют штатными утилитами семейства ОС, но их вывод и полномочия различаются. Настройка PAM-политики, сроков действия и процедуры разблокировки разобрана отдельно в «Учётные записи, sudo и парольная политика в Linux».

Где искать журналы sshd

Единого пути к журналу SSH для всех Linux-дистрибутивов нет. В системах с systemd события обычно доступны через journal; в одних семействах дистрибутивов аутентификация дополнительно попадает в /var/log/auth.log, в других — в /var/log/secure. Название systemd-службы также может быть ssh или sshd.

Типичный поиск сообщений службы sshd за последние 15 минут. Если юнит называется `ssh`, замените имя. При отсутствии событий проверьте настройки journald и конфигурацию системного журнала.
sudo journalctl -u sshd --since '15 minutes ago'
Проверяет распространённые файловые журналы, не предполагая, что оба существуют. Для постоянного аудита входов и источников событий используйте [аудит безопасности Linux](/baza-znaniy/praktika/audit-bezopasnosti-linux).
sudo grep -Ei 'sshd|Accepted|Failed|authentication|authorized_keys|PAM' /var/log/auth.log /var/log/secure 2>/dev/null

Неподдерживаемый алгоритм, отозванный ключ и no hostkeys available

Проблема

SSH deprecated key algorithm или нет общего алгоритма

Возможные причины

  • клиент и сервер используют разные версии OpenSSH с разными значениями по умолчанию
  • криптографическая политика ОС отключила алгоритм
  • сервер не предлагает современный ключ хоста или не принимает подпись пользовательского ключа
  • параметры `HostKeyAlgorithms` или `PubkeyAcceptedAlgorithms` на клиенте либо сервере ограничили совместимость

Решение

Сначала сохраните точный текст ошибки, версии клиента и сервера, реально доступные ключи хоста и эффективную конфигурацию обеих сторон. В ssh_config параметр HostKeyAlgorithms определяет допустимые и предпочитаемые алгоритмы ключей хоста для клиента, а PubkeyAcceptedAlgorithms — алгоритмы подписей, которые клиент может использовать при аутентификации открытым ключом. В sshd_config одноимённые параметры ограничивают соответственно предлагаемые сервером алгоритмы ключей хоста и принимаемые сервером алгоритмы подписей пользовательских ключей. Наличие директив и точное поведение зависят от версии OpenSSH и криптополитики ОС, поэтому сверяйтесь с ssh_config(5), sshd_config(5) и документацией поставщика ОС. Предпочтительное исправление — обеспечить поддержку современного общего алгоритма и планово заменить устаревшие ключи. Временное разрешение старого алгоритма допустимо только после оценки риска, для конкретного назначения и с планом отмены; не включайте его глобально.

Проблема

sshd: no hostkeys available

Возможные причины

  • файлы, указанные директивами `HostKey`, отсутствуют
  • sshd не может прочитать закрытые файлы ключей из-за пути, владельца, прав или политики доступа
  • все найденные ключи отключены настройкой алгоритмов или криптополитикой

Решение

Через консоль проверьте эффективные HostKey, существование и читаемость соответствующих закрытых файлов, а также сообщения запуска sshd. Если ключи были известны и должны сохраниться, восстановите их только из доверенной резервной копии: замена ключа меняет идентичность сервера для всех клиентов. Если ключей действительно нет и восстановить нечего, генерация штатным механизмом OpenSSH, например ssh-keygen -A на системах, где он поддерживается, создаёт стандартные ключи хоста. До генерации зафиксируйте причину и подготовьте способ распространить новые подтверждённые отпечатки; затем проверьте конфигурацию sshd -t и перезапускайте службу только при наличии аварийного канала доступа.

Проблема

ssh key revoked или REVOKED HOST KEY DETECTED

Возможные причины

  • ключ хоста помечен маркером `@revoked` в клиентском `known_hosts` либо присутствует в списке или KRL, заданном клиентской директивой `RevokedHostKeys`
  • пользовательский ключ или сертификат включён в список либо KRL, заданный серверной директивой `RevokedKeys`
  • на клиенте или сервере используется KRL — Key Revocation List, содержащий соответствующий отозванный ключ или сертификат

Решение

Не смешивайте эти случаи. Отзыв ключа хоста защищает клиента от подключения к узлу с известным скомпрометированным или запрещённым серверным ключом; это не то же самое, что предупреждение о смене ключа хоста. Отозванный пользовательский ключ сервер отклонит независимо от его наличия в authorized_keys. На клиенте проверьте записи @revoked и значение RevokedHostKeys; на сервере — значение RevokedKeys. Установите, кто и почему отозвал ключ, затем используйте разрешённый новый ключ либо исправьте ошибочную запись по принятой процедуре управления ключами. Не удаляйте сведения об отзыве только ради восстановления доступа.

Не ослабляйте SSH глобально ради совместимости

Не отключайте StrictModes, не разрешайте устаревшие алгоритмы для всех хостов и не перезапускайте sshd без sshd -t и проверенного аварийного доступа. Изменения конфигурации SSH, выпуск современных ключей и контролируемое применение настроек описаны в «Безопасной настройке SSH».

Термины в статье

OpenSSH — свободный набор клиентских и серверных средств SSH для защищённого удалённого доступа, передачи файлов и туннелирования TCP-соединений.
PAM — модульная подсистема Unix-подобных ОС, через которую совместимые службы применяют правила аутентификации, проверки учётной записи, смены паролей и управления сеансами.
SSH-агент — фоновый процесс, хранящий закрытые SSH-ключи в памяти и выполняющий операции подписи по запросу клиента без повторного ввода ключевой фразы.
sshd_config — конфигурационный файл или набор настроек SSH-сервера OpenSSH, определяющий параметры прослушивания, аутентификации, доступа и криптографических алгоритмов.
Аутентификация по открытому ключу — способ входа в SSH, при котором сервер проверяет подпись клиента по заранее разрешённому открытому ключу, а не по паролю.
Блокировка учётной записи — временное или административное запрещение входа для аккаунта, обычно после заданного числа неудачных попыток аутентификации.
Закрытый ключ — секретная часть асимметричной ключевой пары для создания подписей, расшифрования данных или подтверждения владения ключом при аутентификации.
Ключ SSH — криптографический ключевой материал для протокола SSH, применяемый для подтверждения личности или проверки подлинности удалённого узла.
Ключ хоста SSH — криптографическая ключевая пара сервера, которой SSH-служба подтверждает клиенту подлинность узла при установлении соединения.
Открытый ключ — несекретный ключ асимметричной пары, используемый в зависимости от алгоритма для проверки подписей, шифрования, аутентификации или согласования общего секрета.
Отпечаток ключа SSH — краткое представление хеша открытого SSH-ключа, используемое человеком или системой для проверки его соответствия ожидаемому ключу.
Файл authorized_keys — файл SSH на сервере со списком открытых ключей, которым разрешена аутентификация для конкретной учётной записи пользователя.
Файл known_hosts — клиентское хранилище ключей SSH-серверов, используемое для проверки подлинности узла при последующих подключениях к его имени или адресу.

Вопросы по теме

Все вопросы и ответы

Как убедиться, что клиент предлагает нужный ключ SSH?

Используйте подключение с -i и IdentitiesOnly=yes, затем проверьте вывод ssh -vvv. В нём должно упоминаться указанное имя файла и появиться попытка предложить соответствующий открытый ключ. Строка Offering public key означает, что клиент предлагает ключ, а Server accepts key — что сервер его принял и запросил подпись.

Если явное указание ключа устраняет ошибку, проверьте итоговые параметры назначения через ssh -G example.example. Другие параметры IdentityFile, заданные в пользовательской или системной конфигурации, могут также участвовать в подключении. IdentitiesOnly yes исключает неописанные ключи агента, но не обязательно отменяет явно настроенные IdentityFile.

Нужно ли ставить chmod 777, если SSH не принимает закрытый ключ?

OpenSSH обычно отказывается использовать закрытый ключ, доступный другим пользователям. В таком случае в выводе могут быть сообщения UNPROTECTED PRIVATE KEY FILE! и This private key will be ignored. Это локальная защита секрета, а не отказ сервера.

Типичная корректировка для личного ключа: chmod 600 ~/.ssh/id_ed25519 && chmod 700 ~/.ssh. После этого повторите подключение с подробным выводом, например ssh -vvv -i ~/.ssh/id_ed25519 .... Если клиент всё равно игнорирует файл при корректных режимах, причина может быть в ACL, неверном владельце, особенностях файловой системы или другой проверке реализации SSH. Не расширяйте права на закрытый ключ ради устранения ошибки.

Можно ли удалить known_hosts при SSH host key changed?

Нет, безусловно удалять запись из known_hosts нельзя. Предупреждение о смене ключа может быть следствием переустановки ОС, пересоздания VM, плановой ротации ключей, изменения DNS или балансировки, но также указывать на подмену узла.

Сохраните полный текст предупреждения: имя, адрес, порт, тип ключа, старый и новый отпечатки. Через доверенную консоль на сервере вычислите отпечаток публичного host key нужного типа, например ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub, и сравните его с тем, что показал клиент. При совпадении и подтверждённом ожидаемом изменении удалите только нужную запись командой ssh-keygen -R example.example. Для нестандартного порта используйте форму ssh-keygen -R '[example.example]:2222'.

Почему возникает Too many authentication failures в SSH?

Ошибка означает, что сервер завершил аутентификацию до того, как клиент дошёл до правильной идентичности. Частая причина — общий SSH-агент, содержащий много ключей, либо несколько IdentityFile в конфигурации клиента.

Для разового подключения используйте ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@example.example. Это ограничивает использование неописанных ключей агента, но другие IdentityFile, явно заданные в конфигурации, могут сохраняться. Проверьте итоговые параметры через ssh -G example.example и удалите лишние IdentityFile из настроек этого назначения. Список ключей текущего агента обычно показывает ssh-add -l; не удаляйте ключи из общего агента, если они нужны другим сессиям или процессам.

Как проверить конфигурацию sshd с учётом Match?

Глобальные строки в sshd_config не всегда отражают реальные параметры соединения: на результат влияют включаемые файлы и более специфичные блоки Match. Сначала выполните sudo sshd -t; пустой вывод и код завершения 0 обычно означают отсутствие синтаксических ошибок. Если служба использует нестандартный файл конфигурации, укажите его через -f.

Для конкретной попытки входа используйте sudo sshd -T -C user=user,host=client.example.example,addr=192.0.2.10. Параметр host здесь означает имя удалённого клиентского узла для Match Host, а не имя сервера назначения. Проверяйте как минимум authorizedkeysfile, strictmodes, pubkeyauthentication, usepam, allowusers, allowgroups, denyusers, denygroups и maxauthtries. Доступность -T, -C и отдельных полей зависит от версии OpenSSH.

Можно ли понять причину Connection closed by remote host только по клиенту?

Нет. Сообщение фиксирует только закрытие сокета: разрыв мог инициировать sshd, промежуточное сетевое устройство или другая удалённая сторона пути. Зафиксируйте время, повторите одну попытку с ssh -vvv и сопоставьте результат с журналами сервера, прокси или сетевого устройства.