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

fail2ban: jail для sshd

Защита SSH от брутфорса — один из первых шагов при укреплении сервера. fail2ban сканирует логи, находит повторные неудачные попытки входа и блокирует источник через iptables или nftables. В заметке разберём jail для sshd: от установки до тонкой настройки времени бана.

Установка и базовая конфигурация

Устанавливаем из стандартного репозитория:

# Debian/Ubuntu
apt install fail2ban

# RHEL/CentOS
yum install fail2ban

Включаем и запускаем сервис:

systemctl enable --now fail2ban
systemctl status fail2ban
Предупреждение

Не редактируйте напрямую /etc/fail2ban/jail.conf — при обновлении пакета изменения будут потеряны. Все локальные правки идут в jail.local.

Создаём файл локальных переопределений:

cp /etc/fail2ban/jail.conf /etc/fail2ban/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.

Проверить, что фильтр корректно парсит логи, можно командой:

fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Если в выводе видите высокий процент совпадений — фильтр работает. Если нет, проверьте путь к логу в секции [Definition] фильтра и параметр logpath в jail.

Подсказка

Для усиленной защиты от брутфорса через ddos-сценарии есть отдельный фильтр sshd-ddos. Он ловит быстрые повторные подключения с одного IP. Подключается добавлением mode = ddos в параметры jail.

Параметры bantime и findtime

Три ключа определяют логику блокировки:

ПараметрОписаниеПо умолчанию
bantimeДлительность бана в секундах (отрицательное = навсегда)600
findtimeОкно наблюдения для подсчёта неудачных попыток600
maxretryКоличество неудачных попыток до бана5

Типичная конфигурация для продакшена:

[sshd]
bantime  = 3600
findtime = 600
maxretry = 3

Это значит: три неудачных входа за десять минут → часовой бан. Для критичных серверов можно поставить bantime = -1 (перманентный бан) и разблокировать вручную через fail2ban-client set sshd unbanip <IP>.

Примечание

bantime и findtime принимают суффиксы: d (дни), h (часы), m (минуты), s (секунды). Например, bantime = 1d.

Активация jail

По умолчанию в jail.local секция [sshd] закомментирована. Активируем:

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime  = 3600
findtime = 600

На RHEL/CentOS logpath обычно /var/log/secure. Проверьте путь к логу на вашем дистрибутиве.

Перезапускаем fail2ban и проверяем статус:

systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd

Вывод fail2ban-client status sshd покажет текущее количество баненных IP и список активных фильтров.

Ручная блокировка и разблокировка адреса:

fail2ban-client set sshd banip 203.0.113.50
fail2ban-client set sshd unbanip 203.0.113.50
Предупреждение

fail2ban — это не WAF и не замена ключевой аутентификации. Используйте ключи вместо паролей, ограничьте доступ по AllowUsers и, при возможности, смените порт. fail2ban дополняет эти меры, а не заменяет их.

Проверяйте логи fail2ban (/var/log/fail2ban.log) при первом запуске — там видно, подхватил ли jail лог-файл и срабатывают ли фильтры.