Thank you for reading this post, don't forget to subscribe!
Fail2ban программа для блокировки IP-адресов при превышении количества попыток совершения какого-либо действия, например, неудачного ввода SSH-пароля или многократного запроса веб-страницы у сервера NGINX.
Описывая Fail2ban в двух словах, можно сказать, что он позволяет на основе анализа логов блокировать тех, кто злоупотребляет доступностью сервера по сети. Например, защитить почтовые ящики от взлома путем перебора паролей или многократного запроса какого-либо ресурса.
Читая некоторые статьи в интернете, может сложиться неправильное мнение, что Fail2ban нужен только для защиты от брут-форс атак (перебор паролей). На самом деле, данный программный продукт — система реагирования на подозрительные действия.
Установка и запуск
CentOS 7 / Red Hat:
yum 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
Приведем его к виду:
[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
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, например:
vim /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 — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
* обратите внимание, что мы переопределили параметры по умолчанию maxretry, findtime и action.
Чтобы изменения вступили в силу, перезапускаем сервис:
systemctl restart fail2ban
* в старых версиях service fail2ban restart.
Действия и фильтры
Действия
Файлы с настройкой действий находятся в каталоге /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]. Если их нужно переопределить, просто добавляем их при описании правила.
SSH
CentOS
vim /etc/fail2ban/jail.d/ssh.conf
[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure
Asterisk
vi /etc/fail2ban/jail.d/asterisk.conf
[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/messages
NGINX
vim /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-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
Создаем фильтр:
vim /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:
vim /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
После настройки не забываем перезапустить fail2ban:
systemctl restart fail2ban
Работа со списком заблокированных адресов
Просмотр
Получить статистику заблокированных адресов можно следующей командой:
fail2ban-client status <имя правила>
Получить список правил можно командой:
fail2ban-client status
При наличие заблокированных IP-адресов мы увидим, примерно, следующее:
`- action
|- Currently banned: 2
| `- IP list: 31.207.47.55 10.212.245.29
С помощью 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