1

У меня есть веб-приложение Django, где люди пишут комментарии и комментарии других пользователей. Веб-сервер Gunicorn + nginx (обратный прокси). БД является postgresql. БД и веб-приложение находятся на двух разных компьютерах на основе Ubuntu.

Некоторые злонамеренные пользователи начали злоупотреблять функцией голосования, отдавая себе тысячи голосов в течение нескольких минут (или понижая голосование других). Мои серверы эффективно получают DDOS при запуске такого скрипта. Некоторые из этих людей также выдают себя за других пользователей, крадя их куки!

Я хочу обнаружить это поведение рано, на уровне nginx. Я думал, что я установлю fail2ban и напишу политику. Политика может быть такой: если более 10 голосов исходят от IP-адреса в течение 15 секунд, отправьте этот IP-адрес в тюрьму (т. Е. Перенаправьте на URL-адрес тюрьмы) на 30 минут.

Теперь в моем access.log при голосовании (вверх или вниз) создается следующее: 31.13.113.83 - - [14/Feb/2016:06:51:10 +0000] "POST /vote/ HTTP/1.1" 302 5 "http://example.com/?sorg_service_id_internal=373234912870626%3BAfq3$ .

Поскольку я новичок в этом, мне нужна помощь в реализации моей политики.Это будет failregex = ^ \vote\ в .conf файла [Definition] и следующее в jail.local:

[nginx-votefraud]

enabled  = true
port     = http,https
filter   = nginx-votefraud
logpath  = /var/log/nginx/access.log
maxretry = 10
findtime = 15
bantime  = 3600
banurl   = /banned/

Это оно?

Примечание. Меня также интересует, как это может повлиять на производительность веб-приложения. Является ли реализация fail2ban относительно легкой в вашем опыте, или вы несете значительные расходы? Предположим, это единственная политика, которую я реализую. Обсуждение здесь, кажется, предполагает, что это может быть дорого в оперативной памяти?

1 ответ1

0

Вы должны взглянуть на эти два модуля nginx:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

Это помогает вам ограничивать запросы и / или соединения, что предотвращает перегрузку вашего бэкенда. Затем я добавил бы проверку, если пользователь уже проголосовал за определенный пост, и отказал бы во втором голосовании, если так.
Затем вы все равно можете проверить журнал на 503 (Service Temporarily Unavailable) и использовать fail2ban, чтобы не пускать тех, кто запускает ограничения nginx (слишком часто).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .