Fail2ban и nginx: блокируем нежелательный трафик к определенному URL

в 10:06, , рубрики: fail2ban, nginx, системное администрирование

Доброго времени суток!

Несколько дней назад на одном из своих сайтов заметил подозрительную активность, вызванную перебором паролей. Произошло это как раз тогда, когда в сеть попали файлы с несколькими миллионами почтовых ящиков и паролей к ним. После бана в iptables нескольких адресов злоумышленники начали подбирать пароли с бОльшего количества адресов и вручную банить их уже стало неудобно. Как была решена эта проблема расскажу под катом.

Возможно для кого-то ниже будут описаны «прописные истины», но для меня подобный функционал fail2ban был в новинку и очень помог. Ниже перечисленное «how-to» справедливо для redhat-based-linux, но легко может быть адаптировано под любой дистрибутив.

Если у вас не подключен rpmforge, то подключаем его:

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -i rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

Предварительно настраиваем в nginx limit_req модуль:

Добавляем в секцию http{}

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

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

В секцию server{} добавляем location, который захватывает url, на который поступает вредоносный трафик (в моем случае — это /auth/):

location /auth/ {
    limit_req zone=one burst=10 nodelay;
    try_files $uri /index.php?q=$uri&$args;
}

Или, к примеру, для wordpress:

location = /wp-login.php {
    limit_req zone=one burst=10 nodelay;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
}

Проверяем что нигде не ошиблись и перезапускаем nginx:

nginx -t && service nginx restart

Если все правильно настроено и вредоносный трафик все еще поступает на сервер, то в error-лог nignx'а будут писаться записи вида:

2014/09/11 02:15:11 [error] 17515#0: *1977466 limiting requests, excess: 10.540 by zone "one", client: 93.170.112.10, server: ХХХ, request: "GET /auth/ХХХХ HTTP/1.1", host: "ХХХ"

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

yum install fail2ban -y

Создаем Вашим любимым редактором файл /etc/fail2ban/filter.d/nginx-req-limit.conf с содержимым:

[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
ignoreregex =

Берем дефолтный jail.conf

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

И добавляем в конец:

[nginx-req-limit]

enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 600
bantime = 7200
maxretry = 10

Параметры подберите под себя, подробнее о них тут
Редактируем /etc/fail2ban/action.d/sendmail.conf, добавляя в dest и sender нужные адреса (отсылать почту будет, если у вас на сервере есть настроенный sendmail)
Запускаем fail2ban:

service fail2ban start

Смотрим в лог:
tail -f /var/log/fail2ban.log
Если есть записи вида:

2014-09-10 21:32:20,575 fail2ban.actions: WARNING [nginx-req-limit] Ban 178.92.194.221
2014-09-10 21:37:33,136 fail2ban.actions: WARNING [nginx-req-limit] Ban 37.144.59.125

значит все идет как надо и злоумышленники успешно попадают в бан.

PROFIT!

P.S. А как fail2ban используете Вы?:)

Автор: vstaf

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js