Implementando o fail2ban da maneira correta

1

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?

    
por Hassan Baig 18.02.2016 / 23:39

1 resposta

0

Você deve olhar para esses dois módulos do nginx: link
link

Isso ajuda você a limitar as solicitações e / ou as conexões que impedem o martelamento de seu back-end. Em seguida, adicionaria um cheque se o usuário já votasse em uma postagem específica e negasse uma segunda votação em caso afirmativo.
Você ainda pode verificar o log de 503 (Service Temporarily Unavailable) e usar o fail2ban para manter aqueles que acionam os limites do nginx (com muita frequência).

    
por 03.03.2017 / 18:04