MaxAuthTries (лимит попыток входа в SSH)
MaxAuthTries это директива SSH сервера OpenSSH (sshd_config), которая задаёт максимальное число попыток аутентификации на одном соединении, после чего sshd отключает клиента. По умолчанию в руководстве указано 6, а неудачи записываются в журнал подробнее, когда достигают половины значения. Она ограничивает подбор на соединение, а не по адресу или времени, поэтому дополняет fail2ban, а не заменяет его.
Что считает MaxAuthTries и значение по умолчанию
Руководство sshd_config определяет MaxAuthTries как максимальное число попыток аутентификации на одно соединение, по умолчанию 6. Там же сказано, что когда число неудач достигает половины этого значения, дополнительные неудачи записываются в журнал. В исходном коде OpenSSH неудачи считаются на соединение: начальная проба "none" не учитывается, а частичный успех (один шаг цепочки AuthenticationMethods) не считается неудачей.
Когда счётчик достигает предела, sshd пишет в журнал "maximum authentication attempts exceeded for" с пользователем, адресом и портом и отключает клиента с сообщением "Too many authentication failures". Обычные неудачи записываются в виде "Failed password for invalid user NAME from ADDRESS port N ssh2", причём "invalid user" появляется, только если такой учётной записи нет.
Счётчик принадлежит соединению. Он не блокирует учётную запись, а клиент может просто открыть новое соединение и начать заново.
Разумное значение и как его проверить
Значение 3 это распространённый выбор для усиления защиты, оно есть и в нашем руководстве по усилению защиты SSH. Значение по умолчанию 6 не опасно на сервере только с ключами, поэтому считайте это дополнительным ужесточением, а не исправлением. Добавьте строку, проверьте файл и прочитайте действующее значение:
# /etc/ssh/sshd_config
MaxAuthTries 3
sudo sshd -t
sudo sshd -T | grep -i '^maxauthtries '
sudo systemctl reload ssh # на некоторых дистрибутивах sshd
Если вы используете блоки Match, MaxAuthTries в них разрешена, поэтому добавьте к sshd -T параметр -C user=deploy,addr=192.0.2.10,host=server, чтобы увидеть значение для конкретного соединения, как описано в руководстве sshd(8). На тестовом хосте с ещё включёнными паролями можно ввести неверные пароли для выдуманного пользователя и найти в журнале строку "maximum authentication attempts exceeded" (в системах с journald: sudo journalctl -u ssh; на некоторых дистрибутивах юнит называется sshd). Не проводите этот тест на рабочем входе.
Взаимодействие с другими настройками и типичные ошибки
Классический сюрприз: законный пользователь видит "Too many authentication failures" ещё до запроса пароля. Клиент с агентом, в котором много ключей, может израсходовать попытки, предлагая не те. Исправлять нужно на клиенте: указать ключ и перестать предлагать остальные через IdentitiesOnly yes и IdentityFile в ssh_config, что руководство ssh_config описывает для агентов, предлагающих много ключей.
- Опечатки в пароле и в коде подтверждения учитываются, поэтому слишком низкое значение наказывает реальных пользователей при двухфакторной настройке.
- Лимит действует на соединение. Злоумышленник, переподключившись, получает новый счёт, так что это не замена ограничению частоты.
- Как и для других ключевых слов, используется первое полученное значение, поэтому проверьте подключённые файлы и более ранние строки.
LoginGraceTime(по руководству 120 секунд по умолчанию) это отдельный лимит на время, в течение которого соединение может оставаться без аутентификации.
Место в усилении защиты SSH
MaxAuthTries сужает окно для подбора на каждом соединении, что важнее всего, пока включена PasswordAuthentication. Когда пароли отключены и принимаются только ключи, настройка остаётся небольшим дополнительным слоем: бот не подберёт закрытый ключ ни за три попытки, ни за шесть.
Настоящая защита от повторных подключений находится вне sshd: fail2ban читает строки "Failed" в журнале и блокирует адрес источника, а межсетевой экран может сузить круг тех, кто вообще достигает порта, как описано в руководстве по настройке fail2ban и руководстве по межсетевому экрану Linux. Хорошие журналы делают эти строки доступными для поиска, см. мониторинг сервера и анализ логов. Полный список директив смотрите в статье про sshd_config. Первоисточники: руководство sshd_config и исходный код OpenSSH auth2.c.
Связанные термины: sshd_config, Атака подбором, Fail2ban, Ограничение частоты запросов, PasswordAuthentication.
Часто задаваемые вопросы
Какое значение MaxAuthTries по умолчанию?
По руководству OpenSSH это 6. Когда число неудач достигает половины значения, дальнейшие неудачи записываются в журнал. Действующее значение смотрите командой sudo sshd -T | grep -i maxauthtries.
Что происходит при превышении MaxAuthTries?
sshd записывает в журнал превышение максимального числа попыток и отключает клиента с сообщением "Too many authentication failures". Учётная запись не блокируется, клиент может подключиться снова.
Какое значение MaxAuthTries считается хорошим?
Во многих руководствах по защите, включая наше, используют 3. Более низкое значение рискует отключать законных пользователей, которые ошиблись в пароле или держат несколько ключей в агенте, а при отключённых паролях настройка важна меньше.
Почему при верном ключе появляется "Too many authentication failures"?
Скорее всего, SSH агент предложил сначала несколько ключей и израсходовал попытки. Используйте IdentitiesOnly yes с явным IdentityFile в ssh_config либо укажите -i вместе с -o IdentitiesOnly=yes.
Защищает ли MaxAuthTries от подбора сама по себе?
Нет. Она ограничивает попытки только на соединение, а злоумышленник может открыть много соединений. Сочетайте её со входом только по ключам и с fail2ban или ограничением частоты на межсетевом экране.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab