正确实施 fail2ban

正确实施 fail2ban

我有一个 Django Web 应用程序,人们可以在其中发表评论并赞成/反对他人的评论。Web 服务器是 gunicorn + nginx(反向代理)。数据库是 postgresql。数据库和 Web 应用程序位于两台不同的基于 ubuntu 的机器上。

一些恶意用户开始滥用投票功能,在几分钟内给自己投了数千票(或投了其他人的反对票)。当运行这样的脚本时,我的服务器实际上会受到 DDOS 攻击。其中一些人还通过窃取其他用户的 cookie 来冒充他们!

我想在 nginx 级别尽早检测到此行为。我当时想安装fail2ban并编写一个策略。然后,如果 15 秒内来自某个 IP 的投票超过 10 次,则将该 IP 送入监狱(即重定向到监狱网址)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/

是吗?

注意:我还感兴趣的是这会如何影响 Web 应用程序的性能。fail2ban根据你的经验,实施起来是否相对较轻松,还是会产生大量成本?假设这是我实施的唯一策略。讨论这里这似乎表明 RAM 成本较高?

答案1

您应该看看 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 限制(过于频繁)的人。

相关内容