Fail2ban

Материал из llmdocs — справочник разработчика
Fail2ban
Первый выпуск2004
ЯзыкPython
ЛицензияGPLv2
Принциплоги → фильтр (regex) → действие (бан в файрволе)
Источники логовфайлы, systemd journal
Действияiptables, nftables, firewalld, ufw, Cloudflare, почта
Конфигурация/etc/fail2ban/jail.local
АльтернативаCrowdSec

Fail2ban — программа для Linux-серверов, которая следит за журналами сервисов и, обнаружив много неудачных попыток входа с одного IP-адреса, временно блокирует этот адрес в файрволе. Любой сервер с публичным IP уже через несколько минут после запуска начинают атаковать боты, перебирающие пароли к SSH, почте и веб-панелям. Fail2ban не делает слабый пароль надёжным, но резко снижает шум в логах, нагрузку и шансы перебора.

Как работает

Fail2ban построен из трёх понятий:[1]

Понятие Что это Пример
Фильтр (filter) регулярные выражения для строк лога о неудаче Failed password for .* from <HOST>
Действие (action) что сделать с адресом добавить в набор nftables, отправить письмо
Джейл (jail) связка: какой лог, какой фильтр, какие пороги и действие [sshd]

Демон читает логи (файлы или systemd journal), находит совпадения, и если с одного адреса за время findtime набралось maxretry неудач, выполняет действие бана на срок bantime. По истечении срока адрес разблокируется автоматически. Фильтры для десятков популярных сервисов — sshd, nginx, Postfix, Dovecot, vsftpd, WordPress — поставляются в комплекте.

Установка и настройка

sudo apt install fail2ban          # Debian/Ubuntu
sudo dnf install fail2ban          # Fedora/RHEL (EPEL)

Файлы jail.conf и filter.d/*.conf перезаписываются при обновлении пакета, поэтому собственные настройки кладут в /etc/fail2ban/jail.local или /etc/fail2ban/jail.d/*.local:[2]

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
backend  = systemd
banaction = nftables-multiport

# повторно попавшимся — дольше
bantime.increment = true
bantime.maxtime   = 1w

[sshd]
enabled = true
port    = ssh

[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log

В ignoreip обязательно добавляют собственный статический адрес, чтобы случайно не заблокировать себя. После правки — sudo systemctl restart fail2ban (служба управляется systemd).

Управление

sudo fail2ban-client status              # список джейлов
sudo fail2ban-client status sshd         # счётчики и забаненные адреса
sudo fail2ban-client set sshd unbanip 198.51.100.7
sudo fail2ban-client banned              # все баны
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf  # проверить фильтр

fail2ban-regex незаменим при написании собственного фильтра: он показывает, сколько строк лога совпало и какие адреса были бы заблокированы.

Свой фильтр

Например, для приложения, пишущего в лог LOGIN FAILED ip=1.2.3.4 user=admin:

# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*LOGIN FAILED ip=<HOST> .*$
ignoreregex =
# /etc/fail2ban/jail.d/myapp.local
[myapp]
enabled  = true
logpath  = /var/log/myapp/auth.log
maxretry = 10
findtime = 5m

Важно, чтобы приложение логировало реальный IP клиента: за обратным прокси или CDN в логах окажется адрес прокси, и бан заблокирует всех сразу. В таком случае нужно настроить передачу X-Forwarded-For или банить на уровне CDN через соответствующее действие.

Ограничения

  • Распределённые атаки. Ботнет с тысячами адресов, каждый из которых делает пару попыток, пороги не превысит.
  • IPv6. Злоумышленник легко меняет адрес внутри своей подсети /64; блокировка отдельных адресов малоэффективна.
  • Реакция по логам. Fail2ban реагирует уже после неудачных попыток и не защищает от уязвимостей в самом сервисе.
  • Риск самоблокировки при неверно настроенном ignoreip или общем адресе офиса.

Fail2ban — не главная защита SSH

Перебор пароля SSH надёжнее всего предотвращается отказом от паролей:[5]

# /etc/ssh/sshd_config
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Вход только по ключам делает перебор бессмысленным; Fail2ban в этом случае лишь уменьшает шум в логах. Дополнительно помогают ограничение доступа к порту SSH по списку адресов в файрволе, вход через VPN-сеть или бастион и принцип наименьших привилегий для учётных записей.

Альтернативы

CrowdSec — современная альтернатива с похожей идеей: агент анализирует логи по сценариям, а решения о блокировке применяют отдельные «вышибалы» (bouncers) на файрволе, nginx или CDN. Главная особенность — общая база репутации: адреса, атакующие других участников, блокируются заранее.[4] Для веб-приложений также используют ограничение частоты запросов в nginx (limit_req), WAF и капчу.

См. также

Источники

  1. Fail2ban — репозиторий и wiki
  2. Fail2ban — jail.conf (man page)
  3. ArchWiki — fail2ban
  4. CrowdSec Documentation
  5. OpenSSH — sshd_config(5)