我定期检查我的 apache domlog,以检查 GET 和 POST 请求中是否存在异常。今天早些时候,我注意到同一个 IP 地址每秒对登录 php 发出两次甚至三次相同的 POST 请求,持续 2-3 小时。我猜想这是有人试图入侵帐户。
预防这种情况的最佳方法是什么?我可以将 IP 列入黑名单,但他们当然可以使用代理或切换 IP 地址。有没有更好的方法来实现服务器端的功能?
该服务器运行的是 CentOS 6.4
答案1
你可以使用类似失败2ban在登录失败次数达到一定次数后自动将主机列入黑名单。这意味着即使攻击者切换其 IP 地址,他们也会在尝试几次后再次被阻止。
fail2ban
在可配置的时间后解除对地址的阻止,因此这不会导致地址被无限期地阻止。
如果您拥有 PHP 代码,您显然可以在您的 Web 应用程序中完成类似的事情(基本上,限制来自同一客户端 IP 地址的登录失败速率)。
答案2
您可以使用模式安全定义您想要的任何规则,使用基于时间的阻止来阻止密集请求,通过计算请求、黑名单、运行外部应用程序(即使用防火墙阻止)、转发到代理、丢弃数据包、拒绝连接、重置连接、重定向、显示 404 错误(也许您喜欢错误 666)、使用变量等。它可以做很多事情:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
例子:http://halfelf.org/2013/wp-login-protection-modsec/
SecAction phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},initcol:user=%{REMOTE_ADDR},id:5000134
<Locationmatch "/login.php">
# deny status and log, 401 to client
SecRule user:bf_block "@gt 0" "deny,status:401,log,id:5000135,msg:'ip address blocked for 5 minutes, more than 10 login attempts in 3 minutes.'"
# Tracking: On a successful login, a 302 redirect is performed, a 200 indicates login failed.
SecRule RESPONSE_STATUS "^302" "phase:5,t:none,nolog,pass,setvar:ip.bf_counter=0,id:5000136"
# count last 3 minutes
SecRule RESPONSE_STATUS "^200" "phase:5,chain,t:none,nolog,pass,setvar:ip.bf_counter=+1,deprecatevar:ip.bf_counter=1/180,id:5000137"
# if matched 10 times, block for 5 minutes
SecRule ip:bf_counter "@gt 10" "t:none,setvar:user.bf_block=1,expirevar:user.bf_block=300,setvar:ip.bf_counter=0"
</locationmatch>