Fail2ban і nginx: блокуємо небажаний трафік до певного URL

Доброго часу доби!

Кілька днів тому на одному з своїх сайтів помітив підозрілу активність, викликану перебором паролів. Сталося це саме тоді, коли в мережу потрапили файли з кількома мільйонами поштових скриньок і паролів до них. Після бана в 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 використовуєте Ви?:)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.