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 fail2ban
et 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 .conf
fichier [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 fail2ban
relativement 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?
la source
fail2ban
pouvoir saisir cela au niveau du serveur Web et rendre effectivement le comportement trop pénible. Voilàfail2ban
donc un élément essentiel de la stratégie. Si vous avez vu ma question, n'hésitez pas à suggérer une réponse.Réponses:
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).la source
503 (Service Temporarily Unavailable)
. Pouvez-vous clarifier avec un exemple?