Настройка и использование Fail2ban на Linux

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: Fail2ban, CentOS, Ubuntu

Описывая Fail2ban в двух словах, можно сказать, что он позволяет на основе анализа логов блокировать тех, кто злоупотребляет доступностью сервера по сети. Например, защитить почтовые ящики от взлома путем перебора паролей или многократного запроса какого-либо ресурса.

Читая некоторые статьи в интернете, может сложиться неправильное мнение, что Fail2ban нужен только для защиты от брут-форс атак (перебор паролей). На самом деле, данный программный продукт — система реагирования на подозрительные действия.

Установка и запуск

Для систем на базе пакетов Debian или Red Hat команды будут немного отличаться.

CentOS / Red Hat:

yum install epel-release

yum install fail2ban

Ubuntu / Debian:

apt-get install fail2ban

CentOS 6:

Добавляем репозиторий:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем пакет:

yum install fail2ban

Для запуска службы вводим следующие команды:

systemctl enable fail2ban

systemctl start fail2ban

* Для старых систем без systemd это будут команды chkconfig fail2ban on / update-rc.d fail2ban defaults и service fail2ban start.

Базовая настройка

Процесс настройки fail2ban не зависит от дистрибутива Linux. Основной конфигурационный файл находится по пути /etc/fail2ban/jail.conf. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.

Для начала создаем первый файл, в котором будут храниться настройки по умолчанию:

vi /etc/fail2ban/jail.d/default.conf

Приведем его к виду. Настройка будет немного отличаться в зависимости от операционной системы.

а) для CentOS / Red Hat:

[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
ignoreip = 127.0.0.1/8

б) для Ubuntu / Debian:

[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = iptables
ignoreip = 127.0.0.1/8

* где:

  • maxretry — количество действий, которые разрешено совершить до бана.
  • findtime — время в секундах, в течение которого учитывается maxretry;
  • bantime — время, на которое будет блокироваться IP-адрес;
  • action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска;
  • ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.

* В данном примере, если в течение 8 минут (480) будет найдено 5 строк (maxretry = 4), содержащих критерий фильтра, Fail2ban заблокирует IP-адрес, с которого идет подключение на 12 минут (720);
* В секции [DEFAULT] хранятся общие настройки для всех правил. Каждую из настроек можно переопределить при конфигурировании самого правила.

Настройка правил

Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d, например:

vi /etc/fail2ban/jail.d/service.conf

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 10
findtime = 600

* где:

  • ssh — название для правила;
  • enabled позволяет быстро включать (true) или отключать (false) правило;
  • port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
  • filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
  • action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
  • logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.

* обратите внимание, что мы переопределили параметры по умолчанию maxretryfindtime и action.

В некоторых системах после установки fail2ban автоматически создается правило для SSH, поэтому нет необходимости его создавать. Получить список всех правил можно командами, описанными ниже.

Чтобы изменения вступили в силу, перезапускаем сервис:

systemctl restart fail2ban

* в старых версиях service fail2ban restart.

Исключения

Для гарантии, что fail2ban не заблокирут компьютер администратора или другой важный узел, предусмотрена настройка исключений с помощью опции ignoreip. Опция может быть применена как на глобальном уровне (default), так и для конкретного правила.

Для того, чтобы задать общую настроку, откроем наш файл default:

vi /etc/fail2ban/jail.d/default.conf

... и добавим:

[DEFAULT]
...
ignoreip = 192.168.0.0/24 95.95.95.95

* в данном примере под фильтры не будут попадать адреса с 192.168.0.1 по 192.168.0.255 и адрес 95.95.95.95.

Для конкретного правила настройки будут, примерно, следующие:

vi /etc/fail2ban/jail.d/ssh.conf

[ssh]
...
ignoreip = 192.168.1.22

* в данном примере мы добавили в белый список один адрес 192.168.1.22, который не будет блокироваться.

Обязательно перезагружаемся, чтобы настройки применились:

systemctl restart fail2ban

* добавление адреса в белый список не удаляет его из блокировки. Поэтому, если 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

[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure

CentOS 8/9 (firewalld + systemd)

В более новых версиях Linux лог хранится не в файлах а базе systemd. Настройка будет такой:

[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
backend = systemd

Ubuntu (iptables)

vi /etc/fail2ban/jail.d/ssh.conf

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd]
logpath = /var/log/auth.log

Asterisk

а) для iptables:

vi /etc/fail2ban/jail.d/asterisk.conf

[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/messages

б) для firewalld:

vi /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

vi /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:

vi /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) при превышении лимита подключения мы должны увидеть запись на подобие:

2020/11/16 19:11:08 [error] 1330844#1330844: *16640836 limiting requests, excess: 10.520 by zone "one", client: xxx.xxx.xxx.xxx, server: dmosk.ru, request: "GET / HTTP/1.1", host: "dmosk.ru", referrer: "https://dmosk.ru/page1"

* обратите внимание, что в вашем случае путь до лога может быть другой. Он определяется в конфигурационном файле NGINX.

Теперь можно приступать к настройке fail2ban. Создаем фильтр:

vi /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:

vi /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-адресов мы увидим, примерно, следующее:

`- action
   |- Currently banned: 2
   |  `- IP list:       31.207.47.55 10.212.245.29

2. Вышеописанный вариант не покажет полный список адресов, если их много. Для этого есть команда:

fail2ban-client banned

Она покажет все заблокированные адреса во всех правилах.

3. С помощью утилит управления брандмауэром.

а) iptables:

iptables -L -n --line

б) firewall-cmd:

firewall-cmd --direct --get-all-rules

Удаление

Средствами fail2ban:

Для удаление адреса из списка вводим:

fail2ban-client set <имя правила> unbanip <IP-адрес>

например:

fail2ban-client set ssh unbanip 31.207.47.55

С помощью iptables:

iptables -D <цепочка правил> -s IP-адрес

например:

iptables -D fail2ban-ssh -s 10.212.245.29

С помощью firewall-cmd:

firewall-cmd --direct --permanent --remove-rule <правило>

например:

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.

Для этого открываем файл:

vi /etc/fail2ban/jail.d/defaults-debian.conf

В нем должна быть запись для [sshd]. Добавляем строку:

backend = systemd

Запускаем fail2ban:

systemctl start fail2ban

Аналоги

Если быть честным, достойных аналогов нет. Вот что-то похожее:

  1. tallow — сырая и еще не готовая для продуктивного использования. Также мало документации.
  2. RDPDefender — удобный аналог для Windows, но только для защиты RDP.
  3. IPBan — для Windows. Настройка из командной строки.
  4. ts_block — для Windows.
# Linux # Безопасность
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет