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

Самые полезные команды:
Получить список правил
fail2ban-client status
Показать полный список заблокированных адресов
fail2ban-client banned
Получить статистику заблокированных адресов для конкретного правила
fail2ban-client status sshd
Удаление адреса из списка
fail2ban-client set sshd unbanip 1.2.3.4
Установка
apt install fail2ban - Debian/Ubuntu или yum install fail2ban - CentOS
Настройка
Процесс настройки fail2ban не зависит от дистрибутива Linux. Основной конфигурационный файл находится по пути /etc/fail2ban/jail.conf. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.
Отредактируем его:
nano /etc/fail2ban/jail.d/defaults.conf
[DEFAULT] banaction = nftables banaction_allports = nftables[type=allports] ignoreip = 10.192.0.0/16 91.238.10.0/23 192.168.0.0/16 # это исключения (эти адреса не будут блокироваться) [sshd] enabled = true backend = systemd journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd port = ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] logpath = /var/log/auth.log maxretry = 10 findtime = 600 ignoreip = 10.192.0.0/16 91.238.10.0/23 192.168.0.0/16 # это исключения (эти адреса не будут блокироваться)
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
- action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска;
- maxretry — количество действий, которые разрешено совершить до бана.
- findtime — время в секундах, в течение которого учитывается maxretry;
- bantime — время, на которое будет блокироваться IP-адрес;
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
- ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.
Чтобы изменения вступили в силу, перезапускаем сервис:
systemctl restart fail2ban
Действия и фильтры
Действия
Файлы с настройкой действий находятся в каталоге /etc/fail2ban/action.d. Чтобы блокировать адрес, Fail2ban создает правило в брандмауэре netfilter. Для этого, чаще всего, используются утилиты iptables или firewall-cmd. Последняя применяется в последних версиях CentOS / Red Hat / Fedora. iptables более универсальная и может использоваться, почти, во всех системах Linux.
Остановимся на описании самых используемых действий:
- iptables — создание простого правила в netfilter с помощью одноименной утилиты;
- iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
- iptables-ipset — использование ipset для придания более лаконичного вида правилам;
- iptables-allports — блокирует для адреса все порты;
- firewallcmd-new — создание простого правила в netfilter с помощью firewall-cmd;
- firewallcmd-ipset — добавляет правила с помощью утилиты firewall-cmd, используя ipset;
- firewallcmd-rich-rules — создает rich-rules при помощи firewall-cmd.
Подробнее, как создаются правила в netfilter при помощи iptables и firewalld.
Фильтры
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d.
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шпаргалки.
Примеры правил
В данных примерах блокировка IP-адреса будет происходить на 12 минут после 4-х попыток ввода пароля в течение 8 минут. Эти параметры берутся из настроек [DEFAULT]. Если их нужно переопределить, просто добавляем их при описании правила.
Обратите внимание, что данные правила подразумавают типичное использование итилит для работы с брандмауэром, а именно, для CentOS это firewalld, для Ubuntu — iptables. Однако, в вашей системе могут использоваться другие инструменты. Тогда необходимо это учитывать и правильно указывать значение для опции action.
SSH
CentOS 7 (firewalld)
nano /etc/fail2ban/jail.d/ssh.conf
[ssh] enabled = true port = ssh filter = sshd action = firewallcmd-new[name=sshd] logpath = /var/log/secure
CentOS 8/9 (firewalld + systemd)
В более новых версиях Linux лог хранится не в файлах а базе systemd. Настройка будет такой:
nano /etc/fail2ban/jail.d/ssh.conf
[ssh] enabled = true port = ssh filter = sshd action = firewallcmd-new[name=sshd] backend = systemd
Ubuntu (iptables)
nano /etc/fail2ban/jail.d/ssh.conf
[ssh] enabled = true port = ssh filter = sshd action = iptables[name=sshd] logpath = /var/log/auth.log
После настройки необходимо перезагрузить fail2ban.
systemctl restart fail2ban
Asterisk
а) для iptables:
nano /etc/fail2ban/jail.d/asterisk.conf
[asterisk] enabled = true filter = asterisk action = iptables-allports[name=asterisk, protocol=all] logpath = /var/log/asterisk/messages
б) для firewalld:
nano /etc/fail2ban/jail.d/asterisk.conf
[asterisk] enabled = true filter = asterisk action = firewallcmd-new[name=asterisk, protocol=all] logpath = /var/log/asterisk/messages
* обратите внимание, что меняется только значение для action.
NGINX
nano /etc/fail2ban/jail.d/nginx.conf
[nginx] enabled = true port = http,https filter = nginx-http-auth action = iptables-multiport[name=nginx, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log
NGINX DDoS (req limit)
Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
Для начала, необходимо настроить NGINX:
nano /etc/nginx/nginx.conf
В раздел http добавим:
http {
...
limit_req_zone $binary_remote_addr zone=one:10m rate=25r/s;
...
* данная настройка создает зону с интенсивностью 25 запросов в секунду.
После настраиваем лимит для конкретного виртуального домена в разделе server - location:
server {
...
location / {
...
limit_req zone=one burst=50 nodelay;
...
* данная настройка вместе с предыдущей зоной, созданной в секции http, позволит задать лимит — 25 запросов в секунду при всплеске 50 запросов.
Проверяем конфигурационный файл nginx и перезапускаем сервис:
nginx -t systemctl reload nginx
В лог-файле (по умолчанию /var/log/nginx/error.log) при превышении лимита подключения мы должны увидеть запись на подобие:
* обратите внимание, что в вашем случае путь до лога может быть другой. Он определяется в конфигурационном файле NGINX.
Теперь можно приступать к настройке fail2ban. Создаем фильтр:
nano /etc/fail2ban/filter.d/nginx-limit-req.conf
[Definition] ngx_limit_req_zones = [^"]+ failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST> ignoreregex =
* данный файл может быть уже создан и настроен при установке fail2ban. Если это так, то ничего не меняем и идем дальше.
Создаем правило в fail2ban:
nano /etc/fail2ban/jail.d/nginx-ddos.conf
[nginx-ddos] enabled = true port = http,https filter = nginx-limit-req action = iptables-multiport[name=nginxddos, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log
* еще раз обращаю внимание на путь logpath — в вашем случае он может быть другим.
После настройки не забываем перезапустить fail2ban:
systemctl restart fail2ban
Работа со списком заблокированных адресов
Просмотр
1. Получить список правил можно командой:
fail2ban-client status
Получить статистику заблокированных адресов для конкретного правила можно следующей командой:
fail2ban-client status <имя правила>
При наличие заблокированных IP-адресов мы увидим, примерно, следующее:
|- Currently banned: 2
| `- IP list: 31.207.47.55 10.212.245.29
2. Вышеописанный вариант не покажет полный список адресов, если их много. Для этого есть команда:
fail2ban-client banned
Она покажет все заблокированные адреса во всех правилах.
3. С помощью утилит управления брандмауэром.
а) iptables:
б) firewall-cmd:
Удаление
Средствами fail2ban:
Для удаление адреса из списка вводим:
например:
fail2ban-client set ssh unbanip 31.207.47.55
С помощью iptables:
например:
iptables -D fail2ban-ssh -s 10.212.245.29
С помощью firewall-cmd:
например:
firewall-cmd --direct --permanent --remove-rule ipv4 filter f2b-sshd 0 -s 188.134.7.221
После необходимо перечитать правила:
firewall-cmd --reload
Возможные ошибки
Failed during configuration have not found any log file for sshd jail
Начиная с Ubuntu версии 22.04 после установки fail2ban, служба не запускается, а в логе мы можем увидеть ошибку:
Failed during configuration have not found any log file for sshd jail
Причина: fail2ban не может найти файл с логами для ssh. Это связано с тем, что в новой версии эти логи попадают не в классический файл /var/log/auth.log, а в журнал systemd, для просмотра которого используется утилита journalctl.
Решение: для настройки ssh нам нужно поменять значение опции backend.
Для этого открываем файл:
nano /etc/fail2ban/jail.d/defaults-debian.conf
В нем должна быть запись для [sshd]. Добавляем строку:
backend = systemd
Запускаем fail2ban:
systemctl start fail2ban