等同于拒绝主机,但对于HTTP请求?

我的Web服务器(apache2)不断受到恶意机器人的攻击,要求这样的URL:

/blog/tag/pnphpbb2//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301 //index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200 /wiki/index.php/Main:Some_Wiki_Pagename//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200 /wiki/index.php//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200 /blog/2009/01/title-of-post-here//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301 

我想要一个夜间的cron进程来find任何主机请求一个“恶意”的URL,并将它们添加到一个相当于hosts.deny的HTTP。

我会想象会有一组定义恶意URL的正则expression式,以及可能的一些Apache插件来轻松地拒绝主机(而不必每天晚上执行httpd重启)。

有这样的事情吗?

fail2ban扫描日志文件(如/ var / log / apache / error_log)并禁止基于正则expression式(称为filter)进行这些自动扫描的IP。 默认情况下,它更新防火墙(iptables)来阻止违规的IP。 编写新的动作非常简单,实现更新.htaccess应该很简单,在fail2ban发行版中有几个例子。

我会第二次失败 。 它可以工作,可以暂时禁用,并且可以将IP地址添加到您的防火墙,以便Apache不必浪费时间。

与iptables netfilter模块结合使用时,效率更高(处理大量地址的速度更快),并且可以立即禁止它们,因此只能在发生阻塞之前发出一个或两个请求。

如果你确实讨厌这些人,并且正在运行Linux,那么你也可以尝试实现iptables的tarpitting(一个快速search没有发现任何2.6兼容的补丁)。 这将接受连接,然后立即将窗口大小设置为0(阻止数据传输),但也阻止远程端closures连接,这意味着任何应用程序连接将不得不等待三到二十( !!)在连接超时结束前几分钟。

这对于停止端口扫描器也是很好的,因为这使得它们比通常情况下要长得多。

如果是Apache 2.0,则可以尝试mod_access: http ://httpd.apache.org/docs/2.0/mod/mod_access.html

在Apache 2.2中,它是mod_authz_host: http : //httpd.apache.org/docs/2.2/mod/mod_authz_host.html

但是看起来好像你将不得不向Apache发送重新加载configuration的信号,以使模块configuration的改变生效。

编辑:Modsecurity看起来像你想要的,而不是build立静态拒绝configuration通过grepping你的日志文件,并使用上述之一。 我现在要高举这个答案。

另一种可能是使用mod_rewite来匹配URL和发送客户端403(或任何你想要的代码)。 例:

 RewriteEngine on RewriteRule ^/.*passwd.*/ - [L,NC,G] 

或者为了好玩:

 RewriteEngine on RewriteRule ^/(.*passwd.*)/ http://127.0.0.1/$1 [L,NC,R=301] 

我当然会看OSSEC。 它检测这些模式,并可以阻止IP地址。 它也寻找扫描(例如多个404),并阻止罪犯IP。

是的,这是默认的。

链接: http : //www.ossec.net

一个例子是:

 <位置/>
   拒绝订单,允许
   拒绝从123.123.123.123 231.213.123.0/24
   全部允许
 </位置>

我build议在一个单独的文件中包含这个文件,并将其包含在主configuration文件中,然后重写这个小碎片。 你可以做一个重新加载来获取更改,这不会像重新启动会停止你的服务器。