Mettre en œuvre fail2ban correctement

1

J'ai une application Web Django où les gens écrivent des commentaires et qui votent par-dessus / par-dessous. Le serveur Web est gunicorn + nginx (proxy inverse). La base de données est postgresql. La base de données et l'application Web résident sur deux machines différentes basées sur Ubuntu.

Certains utilisateurs malveillants ont commencé à abuser de la fonctionnalité de vote, se donnant des milliers de votes en quelques minutes (ou réduisant le nombre de votes obtenus par d'autres). Mes serveurs sont effectivement désossés lors de l'exécution d'un tel script. Certaines de ces personnes se font aussi passer pour des utilisateurs en volant leurs cookies!

Je veux détecter ce comportement tôt, au niveau nginx. Je pensais installer fail2banet rédiger une politique. Une politique peut alors être si plus de 10 votes proviennent d'une adresse IP dans les 15 secondes, envoyez cette adresse IP en prison (c.-à-d. Redirection vers une URL de prison) pendant 30 minutes.

Maintenant , dans mon access.log, un vote (haut ou bas) crée les éléments suivants: 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$.

Comme je suis novice dans ce domaine, j’ai besoin d’aide pour mettre en œuvre ma politique. Ce sera-t-il failregex = ^ \vote\dans le .conffichier [Definition]et les suivants dans 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/

Est-ce que c'est ça?

Remarque: je m'intéresse également à l'impact que cela peut avoir sur les performances de l'application Web. La mise en œuvre est-elle fail2banrelativement légère dans votre expérience ou un coût substantiel est-il engagé? Supposons que ceci soit la seule politique que je mette en œuvre. La discussion ici semble suggérer que cela pourrait être coûteux pour la RAM?

Hassan Baig
la source
1
parce que c’est une question de configuration, je migre vers SuperUser
schroeder
On dirait que vous avez des problèmes plus graves que le simple DoS si des utilisateurs malveillants peuvent faire tout cela.
multithr3at3d
@ korockinout13 nous enquêtons sur le problème XSS séparément (n'hésitez pas à suggérer quelque chose de prime abord), mais en ce qui concerne la fraude électorale, je pense fail2banpouvoir saisir cela au niveau du serveur Web et rendre effectivement le comportement trop pénible. Voilà fail2bandonc un élément essentiel de la stratégie. Si vous avez vu ma question, n'hésitez pas à suggérer une réponse.
Hassan Baig

Réponses:

0

Vous devriez regarder ces deux modules de nginx:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://nginx.org/fr/docs/http/ngx_http_limit_req_module.html

Cela vous aide à limiter les demandes et / ou les connexions, ce qui empêche le martèlement de votre backend. Ensuite, j'ajouterais un chèque si l'utilisateur avait déjà voté pour un message spécifique et refuserait un deuxième vote si tel était le cas.
Vous pouvez ensuite toujours consulter le journal 503 (Service Temporarily Unavailable)et utiliser fail2ban pour empêcher ceux qui déclenchent des limites nginx (trop souvent).

anonyme
la source
Je n'ai pas compris le sujet 503 (Service Temporarily Unavailable). Pouvez-vous clarifier avec un exemple?
Hassan Baig
Vous définissez une limite avec l'un de ces modules. La limite est déclenchée. Le demandeur reçoit un 503. Ceci est également connecté au fichier access.log. Vous pouvez l'utiliser pour que fail2ban bloque l'adresse IP du demandeur lorsque nginx détecte le martèlement. De cette façon, votre backend est protégé par nginx et nginx par fail2ban, qui utilise iptables (pare-feu, suppression de paquets).
UnNamed