Описывая Fail2ban в двух словах, можно сказать, что он позволяет на основе анализа логов блокировать тех, кто злоупотребляет доступностью сервера по сети. Например, защитить почтовые ящики от взлома путем перебора паролей или многократного запроса какого-либо ресурса.
Установка и запуск
Рассмотрим установку из репозиториев и с использованием файла deb, скачанного с GitHUB.
Установка из репозитория
Для систем на базе пакетов DEB (Ubuntu / Debian / Astra Linux) или RPM (Rocky / CentOS / РЕД ОС) команды будут немного отличаться.
RPM:
yum install epel-release
yum install fail2ban
DEB:
apt update
apt install fail2ban
Для запуска службы вводим следующие команды:
systemctl enable fail2ban
systemctl start fail2ban
Файл deb
Разработчик fail2ban на свой GitHUB рядом с исходниками выкладывает готовый файл deb. Это может быть актуальным, если в репозитории нашего дистрибутива на базе Debian нет пакета с fail2ban или мы хотим поставить самую последнюю версию приложения.
Для начала, установим curl, с помощью которого загрузим файл deb:
apt update
apt install curl
Используя ссылку, загружаем установочный файл на Linux:
<code>curl -sLO https://github.com/fail2ban/fail2ban/releases/download/1.1.0/fail2ban_1.1.0-1.upstream1_all.deb
И выполняем установку:
Для запуска сервиса используем команды:
systemctl enable fail2ban
systemctl start fail2ban
Базовая настройка
Процесс настройки fail2ban не зависит от дистрибутива Linux. Основной конфигурационный файл находится по пути /etc/fail2ban/jail.conf. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.
Для начала создаем первый файл, в котором будут храниться настройки по умолчанию:
Приведем его к виду. Настройка будет немного отличаться в зависимости от операционной системы.
а) для CentOS / Red Hat:
б) для Ubuntu / Debian:
* где:
- maxretry — количество действий, которые разрешено совершить до бана.
- findtime — время в секундах, в течение которого учитывается maxretry;
- bantime — время, на которое будет блокироваться IP-адрес;
- action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска;
- ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.
* В данном примере, если в течение 8 минут (480) будет найдено 5 строк (maxretry = 4), содержащих критерий фильтра, Fail2ban заблокирует IP-адрес, с которого идет подключение на 12 минут (720);
* В секции [DEFAULT] хранятся общие настройки для всех правил. Каждую из настроек можно переопределить при конфигурировании самого правила.
Настройка правил
Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d, например:
* где:
- ssh — название для правила;
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
- action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
* обратите внимание, что мы переопределили параметры по умолчанию maxretry, findtime и action.
В некоторых системах после установки fail2ban автоматически создается правило для SSH, поэтому нет необходимости его создавать. Получить список всех правил можно командами, описанными ниже.
Чтобы изменения вступили в силу, перезапускаем сервис:
* в старых версиях service fail2ban restart.
Исключения
Для гарантии, что fail2ban не заблокирут компьютер администратора или другой важный узел, предусмотрена настройка исключений с помощью опции ignoreip. Опция может быть применена как на глобальном уровне (default), так и для конкретного правила.
Для того, чтобы задать общую настроку, откроем наш файл default:
… и добавим:
* в данном примере под фильтры не будут попадать адреса с 192.168.0.1 по 192.168.0.255 и адрес 95.95.95.95.
Для конкретного правила настройки будут, примерно, следующие:
* в данном примере мы добавили в белый список один адрес 192.168.1.22, который не будет блокироваться.
Обязательно перезагружаемся, чтобы настройки применились:
* добавление адреса в белый список не удаляет его из блокировки. Поэтому, если IP попал в блок, нужно будет его удалить вручную.
Действия и фильтры
Действия
Файлы с настройкой действий находятся в каталоге /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)
vi /etc/fail2ban/jail.d/ssh.conf
CentOS 8/9 (firewalld + systemd)
В более новых версиях Linux лог хранится не в файлах а базе systemd. Настройка будет такой:
Ubuntu (iptables)
Asterisk
а) для iptables:
б) для firewalld:
* обратите внимание, что меняется только значение для action.
NGINX
vi /etc/fail2ban/jail.d/nginx.conf
NGINX DDoS (req limit)
Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
Для начала, необходимо настроить NGINX:
В раздел http добавим:
* данная настройка создает зону с интенсивностью 25 запросов в секунду.
После настраиваем лимит для конкретного виртуального домена в разделе server – location:
* данная настройка вместе с предыдущей зоной, созданной в секции http, позволит задать лимит — 25 запросов в секунду при всплеске 50 запросов.
Проверяем конфигурационный файл nginx и перезапускаем сервис:
В лог-файле (по умолчанию /var/log/nginx/error.log) при превышении лимита подключения мы должны увидеть запись на подобие:
* обратите внимание, что в вашем случае путь до лога может быть другой. Он определяется в конфигурационном файле NGINX.
Теперь можно приступать к настройке fail2ban. Создаем фильтр:
vi /etc/fail2ban/filter.d/nginx-limit-req.conf
* данный файл может быть уже создан и настроен при установке fail2ban. Если это так, то ничего не меняем и идем дальше.
Создаем правило в fail2ban:
vi /etc/fail2ban/jail.d/nginx-ddos.conf
* еще раз обращаю внимание на путь logpath — в вашем случае он может быть другим.
После настройки не забываем перезапустить fail2ban:
Работа со списком заблокированных адресов
Просмотр
1. Получить список правил можно командой:
Получить статистику заблокированных адресов для конкретного правила можно следующей командой:
При наличие заблокированных IP-адресов мы увидим, примерно, следующее:
2. Вышеописанный вариант не покажет полный список адресов, если их много. Для этого есть команда:
Она покажет все заблокированные адреса во всех правилах.
3. С помощью утилит управления брандмауэром.
а) iptables:
б) firewall-cmd:
Удаление
Средствами fail2ban:
Для удаление адреса из списка вводим:
например:
С помощью iptables:
например:
С помощью firewall-cmd:
например:
После необходимо перечитать правила:
Возможные ошибки
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.
Для этого открываем файл:
В нем должна быть запись для [sshd]. Добавляем строку:
Запускаем fail2ban:
Аналоги
Если быть честным, достойных аналогов нет. Вот что-то похожее:
- tallow — сырая и еще не готовая для продуктивного использования. Также мало документации.
- RDPDefender — удобный аналог для Windows, но только для защиты RDP.
- IPBan — для Windows. Настройка из командной строки.
- ts_block — для Windows.