Eu tenho um aplicativo web do Django onde as pessoas escrevem comentários e fazem um upvote / downvote de comentários de outras pessoas. O servidor web é gunicorn + nginx (proxy reverso). O banco de dados é postgresql. O banco de dados e o aplicativo da web residem em duas máquinas diferentes baseadas no Ubuntu.
Alguns usuários mal-intencionados começaram a abusar do recurso de votação, obtendo milhares de votos em alguns minutos (ou votando em outros). Meus servidores efetivamente são DDOSed quando esse script é executado. Algumas dessas pessoas também se fazem passar por outros usuários roubando seus cookies!
Eu quero detectar esse comportamento cedo, no nível nginx. Eu estava pensando em instalar o fail2ban
e escrever uma política. Uma política pode então ser se mais de 10 votos forem originados de um IP dentro de 15 segundos, enviar esse IP para a cadeia (isto é, redirecionar para um URL de prisão) por 30 minutos.
Agora, no meu access.log
, uma votação (para cima ou para baixo) cria o seguinte: 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$
.
Sendo novo nisso, preciso de ajuda para implementar minha política. Ela será failregex = ^ \vote\
no .conf
do arquivo [Definition]
e o seguinte em 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/
É isso?
Nota: também é interessante para mim como isso pode afetar o desempenho do aplicativo da web. Está implementando fail2ban
relativamente leve em sua experiência ou um custo substancial é incorrido? Suponha que esta seja a única política que eu implemente. A discussão aqui parece sugerir que poderia ser caro na RAM?