Перейти к содержимому

Too many authentication failures: SSH исчерпал попытки

Received disconnect from 10.0.0.5 port 22:2: Too many authentication failures и следом Permission denied (publickey) — это не «сервер сломан» и не обязательно неверный пароль. Клиент потратил лимит попыток, пока перебирал ключи из агента, и до нужного метода так и не дошёл.

Лимит задаёт MaxAuthTries на сервере (по умолчанию 6). Каждый предложенный публичный ключ — отдельная попытка. Пять ключей в ssh-agent плюс ещё один «не тот» — и соединение рвётся до пароля и до правильного ключа.

Почему так выходит

SSH сначала спрашивает сервер, какие методы он принимает, затем клиент идёт по своему порядку. По умолчанию в начале стоит publickey. Пока агент совал ключи, сервер уже посчитал неудачи.

Что хотелиЧто произошло
Войти по ключуНужного ключа нет в authorized_keys, он не в агенте, или он пятый в очереди — лимит кончился раньше
Войти по паролюСервер объявил publickey, клиент начал перебор, приглашения пароля так и не было
Пароль из PAM / внешней службыКлиент шлёт password, сервер ждёт keyboard-interactive

Ключ «лежит в ~/.ssh» недостаточно: OpenSSH предлагает идентичности агента, а не «файл, который вы имели в виду». Список того, что реально уйдёт на сервер:

ssh-add -l

Пустой агент или «ключ не тот» — смотреть -vvv, а не гадать.

Сначала лог клиента

Третий уровень отладки показывает порядок методов и каждый предложенный ключ:

ssh -vvv deploy@10.0.0.5

Искать:

  • Authentications that can continue — что разрешил сервер;
  • Offering public key / get_agent_identities — какие ключи уходят;
  • Too many authentication failures — лимит попыток, не «пароль неверный».

Типичная картина: агент отдаёт id_rsa, id_ed25519, ключ от GitLab, ключ от bastion — четыре отказа, пятый ещё не тот, шестой уже не принимают.

Не предлагать все ключи

IdentitiesOnly yes запрещает клиенту подмешивать все идентичности агента. Дальше работает только то, что задано через IdentityFile или -i.

На один хост, не в глобальный /etc/ssh/ssh_config:

Host prod
    HostName 10.0.0.5
    User deploy
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519_prod

Разово:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_prod deploy@10.0.0.5

После этого в -vvv должен остаться один Offering public key. Если вместо too many пришло Permission denied (publickey) — перебор закончился, ключ просто не приняли: его нет в authorized_keys или не тот файл.

Примечание

IdentitiesOnly без IdentityFile оставляет дефолтные id_ed25519 / id_rsa в домашнем каталоге и не тащит весь агент. Для стенда с отдельным ключом всегда указывайте файл явно.

Пароль, когда ключей много

Клиент не спросит пароль, пока не исчерпает publickey. Отключить ключи и поставить пароль первым:

ssh -o PubkeyAuthentication=no \
    -o PreferredAuthentications=password \
    -o PasswordAuthentication=yes \
    deploy@10.0.0.5

В ~/.ssh/config:

Host prod-password
    HostName 10.0.0.5
    User deploy
    PubkeyAuthentication no
    PasswordAuthentication yes
    PreferredAuthentications password

На Ubuntu и везде, где пароль идёт через PAM, сервер часто объявляет keyboard-interactive, а не password. Тогда предыдущая команда молча не сработает. Заменить метод:

ssh -o PubkeyAuthentication=no \
    -o PreferredAuthentications=keyboard-interactive \
    deploy@10.0.0.5
Host prod-password
    HostName 10.0.0.5
    User deploy
    PubkeyAuthentication no
    PreferredAuthentications keyboard-interactive

Какой метод сервер реально предлагает — снова строка Authentications that can continue в -vvv.

Что смотреть на сервере

Нужен другой канал: консоль гипервизора, VNC, serial. Иначе вы в той же ошибке, что чините.

Логи. На Ubuntu 24.04 юнит называется ssh (алиас sshd). Для разбора неудачных ключей поднять подробность:

# /etc/ssh/sshd_config или drop-in в /etc/ssh/sshd_config.d/
LogLevel VERBOSE
sudo systemctl restart ssh
sudo journalctl -u ssh -e
# если стоит rsyslog:
sudo tail -f /var/log/auth.log

В логе будет, какой ключ отвергли и дошли ли до MaxAuthTries.

Права. При StrictModes yes (дефолт) sshd молча игнорирует слишком открытые файлы:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# домашний каталог не должен быть writable для group/other

Публичный ключ — одна строка в authorized_keys, парный приватный — тот, что в IdentityFile.

Лимит попыток. Если агент толстый, а ключей на хост много, можно поднять порог (это ослабляет защиту от перебора):

MaxAuthTries 10

Надёжнее не поднимать лимит, а сузить клиент: IdentitiesOnly + один IdentityFile на Host.

Короткий чеклист

  1. ssh -vvv — сколько ключей ушло и какой метод остался.
  2. ssh-add -l — что лежит в агенте; лишнее не предлагать.
  3. В ~/.ssh/config для хоста: IdentitiesOnly yes и явный IdentityFile.
  4. Нужен пароль — PubkeyAuthentication no и тот метод, который сервер написал в debug (password или keyboard-interactive).
  5. С консоли сервера: journalctl -u ssh, права ~/.ssh и authorized_keys, при необходимости LogLevel VERBOSE.

Ошибка про «too many» почти всегда на клиенте: слишком много ключей на одну попытку входа. Сервер лишь считает до шести и закрывает сессию.