Тематические термины: Fail2ban , CentOS , Ubuntu
Описывая Fail2ban в двух словах, можно сказать, что он позволяет на основе анализа логов блокировать тех, кто злоупотребляет доступностью сервера по сети. Например, защитить почтовые ящики от взлома путем перебора паролей или многократного запроса какого-либо ресурса.
Читая некоторые статьи в интернете, может сложиться неправильное мнение, что Fail2ban нужен только для защиты от брут-форс атак (перебор паролей). На самом деле, данный программный продукт — система реагирования на подозрительные действия.
Установка
Принцип настройки
Настройка правил
Белые списки
Действия и фильтры
Примеры
SSH
Asterisk
NGINX
NGINX DDoS
Списки заблокированных
Просмотр
Удаление
Решение возможных проблем
Аналоги
Рассмотрим установку из репозиториев и с использованием файла 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
Разработчик fail2ban на свой GitHUB рядом с исходниками выкладывает готовый файл deb. Это может быть актуальным, если в репозитории нашего дистрибутива на базе Debian нет пакета с fail2ban или мы хотим поставить самую последнюю версию приложения.
Для начала, установим curl, с помощью которого загрузим файл deb:
apt update
apt install curl
Переходим на страницу с релизами и компируем ссылку на последнюю или нужную версию fail2ban для Debian:
Используя ссылку, загружаем установочный файл на Linux:
curl -sLO https://github.com/fail2ban/fail2ban/releases/download/1.1.0/fail2ban_1.1.0-1.upstream1_all.deb
И выполняем установку:
apt install ./fail2ban_*_all.deb
Для запуска сервиса используем команды:
systemctl enable fail2ban
systemctl start fail2ban
Процесс настройки 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
* где:
* В данном примере, если в течение 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
* где:
* обратите внимание, что мы переопределили параметры по умолчанию maxretry , findtime и 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.
Остановимся на описании самых используемых действий:
Подробнее, как создаются правила в netfilter при помощи iptables и firewalld .
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d .
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шпаргалки.
В данных примерах блокировка IP-адреса будет происходить на 12 минут после 4-х попыток ввода пароля в течение 8 минут. Эти параметры берутся из настроек [DEFAULT]. Если их нужно переопределить, просто добавляем их при описании правила.
Обратите внимание, что данные правила подразумавают типичное использование итилит для работы с брандмауэром, а именно, для CentOS это firewalld, для Ubuntu — iptables. Однако, в вашей системе могут использоваться другие инструменты. Тогда необходимо это учитывать и правильно указывать значение для опции action.
vi /etc/fail2ban/jail.d/ssh.conf
[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure
В более новых версиях Linux лог хранится не в файлах а базе systemd. Настройка будет такой:
[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
backend = systemd
vi /etc/fail2ban/jail.d/ssh.conf
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd]
logpath = /var/log/auth.log
а) для 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 .
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-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
Для начала, необходимо настроить 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: remontka.com, request: «GET / HTTP/1.1», host: «remontka.com», referrer: «https://remontka.com/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
Начиная с 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
Если быть честным, достойных аналогов нет. Вот что-то похожее:
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…