fail2ban: jail для sshd
Защита SSH от брутфорса — один из первых шагов при укреплении сервера. fail2ban сканирует логи, находит повторные неудачные попытки входа и блокирует источник через iptables или nftables. В заметке разберём jail для sshd: от установки до тонкой настройки времени бана.
Установка и базовая конфигурация
Устанавливаем из стандартного репозитория:
Включаем и запускаем сервис:
Не редактируйте напрямую /etc/fail2ban/jail.conf — при обновлении пакета изменения будут потеряны. Все локальные правки идут в jail.local.
Создаём файл локальных переопределений:
Или, что предпочтительнее, создаём минимальный jail.local с только нужными параметрами — fail2ban объединяет jail.local поверх jail.conf, так что достаточно переопределить конкретные ключи.
Фильтр для sshd
Готовый фильтр уже поставляется в комплекте: /etc/fail2ban/filter.d/sshd.conf. Он ищет в /var/log/auth.log (или /var/log/secure на RHEL) паттерны вроде Failed password for invalid user и Connection closed by authenticating user.
Проверить, что фильтр корректно парсит логи, можно командой:
Если в выводе видите высокий процент совпадений — фильтр работает. Если нет, проверьте путь к логу в секции [Definition] фильтра и параметр logpath в jail.
Для усиленной защиты от брутфорса через ddos-сценарии есть отдельный фильтр sshd-ddos. Он ловит быстрые повторные подключения с одного IP. Подключается добавлением mode = ddos в параметры jail.
Параметры bantime и findtime
Три ключа определяют логику блокировки:
| Параметр | Описание | По умолчанию |
|---|---|---|
bantime | Длительность бана в секундах (отрицательное = навсегда) | 600 |
findtime | Окно наблюдения для подсчёта неудачных попыток | 600 |
maxretry | Количество неудачных попыток до бана | 5 |
Типичная конфигурация для продакшена:
Это значит: три неудачных входа за десять минут → часовой бан. Для критичных серверов можно поставить bantime = -1 (перманентный бан) и разблокировать вручную через fail2ban-client set sshd unbanip <IP>.
bantime и findtime принимают суффиксы: d (дни), h (часы), m (минуты), s (секунды). Например, bantime = 1d.
Активация jail
По умолчанию в jail.local секция [sshd] закомментирована. Активируем:
На RHEL/CentOS logpath обычно /var/log/secure. Проверьте путь к логу на вашем дистрибутиве.
Перезапускаем fail2ban и проверяем статус:
Вывод fail2ban-client status sshd покажет текущее количество баненных IP и список активных фильтров.
Ручная блокировка и разблокировка адреса:
fail2ban — это не WAF и не замена ключевой аутентификации. Используйте ключи вместо паролей, ограничьте доступ по AllowUsers и, при возможности, смените порт. fail2ban дополняет эти меры, а не заменяет их.
Проверяйте логи fail2ban (/var/log/fail2ban.log) при первом запуске — там видно, подхватил ли jail лог-файл и срабатывают ли фильтры.