Настройка Fail2Ban для нестандартных сервисов (не только SSH)

Проблема

Большинство администраторов знакомят с Fail2Ban через SSH: он эффективно блокирует IP-адреса, с которых идёт перебор паролей. Однако современная инфраструктура состоит из десятков сервисов, каждый из которых потенциально уязвим для брутфорса. Почтовые серверы (Postfix, Dovecot) страдают от атак на SASL-аутентификацию, веб-серверы (Nginx, Apache) от сканирования уязвимостей и перебора паролей к админ-панелям, FTP-серверы (vsftpd) от подбора учётных данных к файловым хранилищам. Ограничиваясь защитой только SSH, администратор оставляет эти сервисы беззащитными.

Решение

Fail2Ban — это фреймворк для предотвращения вторжений, который анализирует логи сервисов, находит подозрительные повторяющиеся события (например, неудачные попытки аутентификации) и временно блокирует IP-адрес нарушителя на уровне межсетевого экрана. Он работает с iptables, nftables, firewalld и другими бэкендами.

В этой статье мы:

  1. Установим и настроим Fail2Ban на сервере с Ubuntu 22.04.
  2. Настроим готовые джейлы для Postfix, Dovecot, Nginx и vsftpd, которые уже входят в состав Fail2Ban.
  3. Научимся создавать собственные фильтры с помощью регулярных выражений для любых сервисов, которые пишут в лог.
  4. Рассмотрим расширенные возможности: белые списки, увеличение времени бана при повторных нарушениях и отправку уведомлений.

Пошаговая инструкция

1. Установка Fail2Ban

Debian / Ubuntu:

sudo apt update
sudo apt install fail2ban -y

RHEL / CentOS / Rocky Linux:

sudo dnf install fail2ban fail2ban-firewalld -y

После установки служба будет автоматически запущена. Проверим её статус:

sudo systemctl status fail2ban

2. Базовая конфигурация

Fail2Ban использует два типа конфигурационных файлов:

  • /etc/fail2ban/jail.conf — основной файл, который не рекомендуется редактировать напрямую, так как он перезаписывается при обновлении пакета.
  • /etc/fail2ban/jail.local — переопределяет параметры по умолчанию. Именно его мы будем редактировать для настройки джейлов (правил защиты).

Создадим jail.local на основе стандартного:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Теперь отредактируем jail.local. Все настройки в секции [DEFAULT] будут применяться ко всем джейлам, если не переопределены в самом джейле.

sudo nano /etc/fail2ban/jail.local

Основные параметры [DEFAULT]:

[DEFAULT]

# Время блокировки в секундах (600 секунд = 10 минут)
bantime = 600

# Период времени (в секундах), в течение которого считаются ошибки
findtime = 600

# Количество ошибок за период findtime, после которого IP блокируется
maxretry = 5

# Действие по умолчанию — блокировка через iptables
banaction = iptables-multiport

# Игнорируем локальные адреса
ignoreip = 127.0.0.1/8 ::1

Официальная документация: все параметры конфигурации подробно описаны на GitHub-странице Fail2Ban и в man jail.conf.

3. Защита Nginx (веб-сервер)

Fail2Ban может защищать веб-сервер от брутфорса и сканирования. Рассмотрим два сценария.

3.1. Блокировка неудачных попыток HTTP-аутентификации

Если на сайте используется базовая HTTP-аутентификация (через модуль ngx_http_auth_basic_module), неудачные попытки логируются в error.log. Fail2Ban уже имеет встроенный фильтр nginx-http-auth для этого.

Добавим джейл в jail.local:

[nginx-http-auth]
enabled = true
port    = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 600

После этого Fail2Ban будет отслеживать строки вроде:

client 192.168.1.100: user "admin": authentication failure

3.2. Блокировка подозрительных запросов (кастомный фильтр)

Иногда требуется блокировать не только неудачные логины, но и запросы, содержащие определённые паттерны например, сканирование phpMyAdmin или попытки выполнить eval().

Создадим собственный фильтр /etc/fail2ban/filter.d/nginx-badbots.conf:

[Definition]
failregex = ^<HOST> .* "GET /(?:phpmyadmin|pma|admin|wp-login\.php).*" .*$
ignoreregex =

Этот фильтр будет находить в логах Nginx (/var/log/nginx/access.log) IP-адреса, с которых приходят запросы к подозрительным URL.

Добавим джейл в jail.local:

[nginx-badbots]
enabled = true
port    = http,https
filter  = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 3600
findtime = 600

Теперь любой IP, который трижды обратится к запрещённым URL в течение 10 минут, будет заблокирован на час.

4. Защита почтового сервера (Postfix + Dovecot)

Почтовый сервер одна из главных целей брутфорс-атак. Злоумышленники перебирают пароли к учётным записям, пытаясь использовать их для рассылки спама.

4.1. Postfix: блокировка неудачных SASL-аутентификаций

Fail2Ban имеет встроенный фильтр postfix и postfix-sasl. Второй специализируется на отслеживании ошибок SASL-аутентификации.

Добавим в jail.local:

[postfix-sasl]
enabled = true
port    = smtp,ssmtp
filter  = postfix-sasl
logpath = /var/log/mail.log
maxretry = 3
bantime = 1800
findtime = 300

Фильтр будет искать в логах строки вида:

warning: unknown[192.168.1.100]: SASL LOGIN authentication failed: authentication failure

Официальная информация: детали о встроенных фильтрах Postfix можно найти в документации Fail2Ban.

4.2. Dovecot: блокировка неудачных IMAP/POP3 логинов

Dovecot также имеет встроенный фильтр dovecot.

Добавим джейл в jail.local:

[dovecot]
enabled = true
port    = pop3,pop3s,imap,imaps
filter  = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 1800
findtime = 300

Фильтр находит в логах строки вроде:

dovecot: auth: passwd-file(admin,192.168.1.100): unknown user

5. Защита FTP-сервера vsftpd

FTP-серверы классическая цель для брутфорса. В vsftpd все неудачные попытки логируются в /var/log/vsftpd.log.

В Fail2Ban есть встроенный фильтр vsftpd.

Добавим джейл в jail.local:

[vsftpd]
enabled = true
port    = ftp,ftp-data,ftps,ftps-data
filter  = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 3600
findtime = 600

Фильтр отслеживает строки:

Mon Apr  7 12:00:00 2025 [pid 12345] [ftpuser] FAIL LOGIN: Client "192.168.1.100"

Официальная информация: подробности о фильтре vsftpd можно найти в исходном коде Fail2Ban.

6. Создание собственного фильтра для любого сервиса

Предположим, у вас есть собственное приложение, которое пишет в лог строки:

2025-04-07 12:00:00 [ERROR] Failed login attempt from 192.168.1.100 for user admin

Создадим фильтр /etc/fail2ban/filter.d/myapp.conf:

[Definition]
failregex = ^.*Failed login attempt from <HOST> for user .*$
ignoreregex =

Здесь <HOST>  специальный тег Fail2Ban, который захватывает IP-адрес. Он работает с IPv4 и IPv6 и поддерживает маски портов (например, 192.168.1.100:12345).

Добавим джейл в jail.local:

[myapp]
enabled = true
port    = 8080
filter  = myapp
logpath = /var/log/myapp/error.log
maxretry = 3
bantime = 600

Перед применением всегда тестируйте фильтр с помощью встроенной утилиты fail2ban-regex.

fail2ban-regex /var/log/myapp/error.log /etc/fail2ban/filter.d/myapp.conf

Утилита покажет, сколько строк успешно совпало с регулярным выражением, и выведет извлечённые IP-адреса.

7. Расширенные настройки

7.1. Увеличение времени бана при повторных нарушениях (recidive)

Если IP продолжает атаковать после того, как бан закончился, можно настроить «рецидивный» джейл, который будет увеличивать время блокировки.

В jail.local добавьте:

[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter = fail2ban
maxretry = 3
bantime = 86400  # 24 часа
findtime = 86400

Этот джейл отслеживает сам лог Fail2Ban и при повторных блокировках назначает более длительный бан.

7.2. Белый список (игнорирование IP)

Если нужно исключить определённые IP-адреса из блокировки (например, доверенные серверы мониторинга или сети офисов), добавьте их в ignoreip в секции [DEFAULT]:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.10.10.0/24 192.168.1.10

7.3. Настройка уведомлений по электронной почте

Fail2Ban может отправлять письма при блокировке IP. Для этого в jail.local укажите:

[DEFAULT]
destemail = admin@example.com
sendername = Fail2Ban
action = %(action_mwl)s

Параметр action_mwl отправляет письмо с whois-информацией о заблокированном IP и строками лога.

8. Управление Fail2Ban

Просмотр статуса всех джейлов:

sudo fail2ban-client status

Просмотр статуса конкретного джейла:

sudo fail2ban-client status nginx-http-auth

Ручная разблокировка IP:

sudo fail2ban-client unban 192.168.1.100

Перезагрузка конфигурации после изменений:

sudo systemctl restart fail2ban

Устранение распространённых проблем

ПроблемаВероятная причинаРешение
Джейл не блокирует IPФильтр не находит строки в логеПротестируйте фильтр с fail2ban-regex. Убедитесь, что logpath указывает на правильный файл и он существует.
Блокировка не срабатывает на IPv6Фильтр не обрабатывает IPv6Убедитесь, что в регулярном выражении используется тег <HOST>, а не жёсткий паттерн для IPv4.
Fail2ban не видит логи после ротацииНекорректная обработка ротацииВ параметре logpath можно указать несколько файлов через пробел или использовать wildcard: logpath = /var/log/nginx/*error.log.
Ошибка Permission denied при чтении логаСлужба fail2ban не имеет прав на чтение файлаПроверьте права на файл лога. Пользователь fail2ban должен иметь доступ на чтение.
При обновлении пакета сбрасываются настройкиИзменения внесены в jail.conf, а не в jail.localВсе пользовательские настройки должны храниться в jail.local. Он не перезаписывается при обновлении.
Fail2ban блокирует легитимные запросыСлишком низкие значения maxretry или findtimeУвеличьте maxretry или уменьшите findtime. Проверьте, что в лог не попадают легитимные ошибки.

Мы разобрали настройку Fail2Ban для защиты не только SSH, но и таких сервисов, как Nginx, Postfix, Dovecot и vsftpd. Научились создавать собственные фильтры для любых приложений, используя регулярные выражения, а также познакомились с расширенными возможностями: белыми списками, рецидивными блокировками и уведомлениями по почте.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu