Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров55K
Доброго времени суток!

Несколько дней назад на одном из своих сайтов заметил подозрительную активность, вызванную перебором паролей. Произошло это как раз тогда, когда в сеть попали файлы с несколькими миллионами почтовых ящиков и паролей к ним. После бана в 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 = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ 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 используете Вы?:)
Теги:
Хабы:
Всего голосов 23: ↑21 и ↓2+19
Комментарии17

Публикации

Истории

Работа

Ближайшие события