最近,我正在尝试在我的 CentOS 6.4 服务器上对抗 DDOS。我已经安装了 CSF,并且设置得相当严格。然而,有一个 URL 有大约 1000 个请求,每个 IP 最多 2 个请求(我猜是智能 DDoS 攻击)。
您如何对抗并阻止人们发送垃圾邮件请求,apache 将此请求报告给所有 1000 多个请求......
POST /wp-login.php HTTP/1.0
如果有人有想法或建议如何在不禁用/删除受攻击的网站的情况下对抗这种事情。
提前感谢所有有用的信息。
答案1
如果您有可以在 HTTP 流量到达 WordPress 之前对其进行过滤的上游设备/设备,请查找每个请求中的一些常见内容,例如 User-Agent。在我之前遇到的 DDoS 攻击中,我发现它们完全相同,这使我们能够将它们过滤掉。您还可以查找以下内容丢失的在每个请求中并根据此进行过滤。例如,所有现代浏览器都会发送Accept-Encoding
(并且很少发送Accept-Language
)标头。如果缺少标头,则很可能是机器人,可以将其过滤掉以阻止 DDoS 攻击。如果请求缺少Host
标头,则几乎可以肯定是机器人。
如果你不是有一个上游过滤系统,你仍然可以用 Apache 完成一些逻辑,但是你的工具库将比类似的东西受到更多的限制mod_security
。
答案2
这也许仍然这个僵尸网络。如果你使用 wordpress,你可能想要使用这个插件(免责声明:我不能推荐它,因为我不使用 wordpress,我只看到针对 wp-login 或 wp-admin 的扫描)。
如果可能的话:使用 basic-auth(htaccess+htpasswd)保护 /wp-login.php
如果您不使用 wordpress:没关系。
如果您想保护自己免受此探测以及针对各种 Web 应用程序和漏洞的许多其他探测的侵害,您将需要某种 WAF/IDS 和一套良好的实际和更新的签名。操作系统安全评估中心可能由于其良好的基本签名而成为一个很好的解决方案,但我不知道有关新攻击和漏洞的更新。mod_security 是一个很好的解决方案,但却是一个真正的性能杀手(无论是在服务器性能还是在创建新签名方面),nginx + naxsi 是一个适用于简单 WAF 的良好轻量级解决方案,并且具有一套针对脚本扫描的最新签名。
当操作面向互联网的网络服务器时,您必须习惯这些扫描;您会看到更多内容。
你会发现一个“常用扫描仪” - 统计这里;这是来自某个 WAF 的关于一些已知漏洞扫描程序的 30 天结果,针对各种漏洞。
答案3
您可以使用模式安全定义您想要的任何规则,使用基于时间的阻止来阻止密集请求,通过计算请求、黑名单、运行外部应用程序(即使用防火墙阻止)、转发到代理、丢弃数据包、拒绝连接、重置连接、重定向、显示 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 "/wp-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>
另外,您可以使用失败2ban分析日志并据此阻止客户端。