Apache 2.2 / CentOS:拒绝恶意机器人

Apache 2.2 / CentOS:拒绝恶意机器人

我在尝试限制 Apache 2.2 服务器上的恶意机器人时遇到了各种问题,希望有人可以提供帮助。

为了解决这个问题,我绞尽了好几天脑筋,尝试了好几种不同的方法,但似乎都没有奏效。

我在一台机器上有几个网站,当然,我可以在.htaccess每个网站的单独文件中拒绝恶意机器人 - 但维护起来很麻烦。所以,我想把限制放在httpd.conf.

我使用的第一个方法(我认为有效)是使用一个<Location "/">部分,例如

<Location "/"> 
SetEnvIfNoCase User-Agent "lwp-trivial" bad_bot 
SetEnvIfNoCase User-Agent "libwww" bad_bot 
SetEnvIfNoCase User-Agent "Wget" bad_bot 
Deny from env=bad_bot 
</Location>

但是,我发现,尽管这确实阻止了机器人,但还是存在一个问题,因为它允许提供隐藏文件,例如.htaccess.htpasswd,即使有代码httpd.conf禁止它。我尝试了<Files ...块(执行阻止文件访问的操作)和块的顺序<Location ...,但无论哪个优先,它仍然允许提供隐藏文件。如果我删除该<Location ...块,则服务器会阻止提供隐藏文件,这是应该的。

我也尝试过重写,httpd.conf但似乎也不起作用(块位于文件的底部,但我也尝试过在虚拟主机部分之上),例如

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} AhrefsBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} AlphaBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider [NC,OR]
RewriteRule ^(.*)$ - [L,R=403] 
</IfModule>

使用这两种方法我都没有遇到错误,但它们并没有达到我想要的效果。第二种方法似乎根本无法阻止机器人。

我也尝试过以下类似操作,但也没有成功:

<Location "/var/www/sites/">
SetEnvIf User-Agent BLEXBot GoAway
Order allow,deny
Allow from all
Deny from env=GoAway
</Location>

... 和

RewriteCond %{HTTP_USER_AGENT} "blexbot" [nocase]
RewriteRule ^.*$ – [forbidden,last]

... 以及似乎所有可能的其他组合。但我仍然只能使用单个.htaccess文件或部分<Location "/">(允许显示隐藏文件)来阻止机器人。

正如所见,我正在测试的用户代理字符串之一是“Blexbot”及其变体,因此我最后尝试的是使用 modsecurity。

不过,我似乎也无法让它正常工作:这里有几个我尝试过的例子:

SecRule REQUEST_HEADERS:User-Agent "BLEXBot" "deny,status:403,id:5000218,msg:'Badbot test for Blexbot'"
SecRule REQUEST_HEADERS:User-Agent "@pmFromFile badbots.txt" "id:350001,rev:1,severity:2,log,msg:'BAD BOT - Detected and Blocked. '"

如果我查看/var/log/modsec_audit.log,我可以看到 modsecurity 确实识别了用户代理,并提供了相应的日志条目,但它实际上并没有阻止页面被提供(这有点像是重点)。

我确实注意到modsec_audit.log有条目Engine-Mode: "DETECTION_ONLY",这可能解释了页面仍在提供,但我对 modsecurity 不太熟悉,所以我不太确定它在做什么。

如果有人能帮忙,我将不胜感激!我只需要一种方法来工作,但如果可以的话,我有点喜欢使用 modsecurity 的想法,因为看起来我可以将任何 bad-bot 条目放在一个单独的文件中。

答案1

要禁止某个页面,重写规则应该包含[F]而不是[R=403]

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} AhrefsBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} AlphaBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Baiduspider [NC]
RewriteRule ^ - [L,F]

你对 mod_security 的猜测是正确的。DETECTION_ONLY这意味着它实际上不会禁止任何东西,只是检测并记录它所做的事情。可以。您需要查看您的配置SecRuleEngine DetectionOnly并将其注释掉。


以 开头的配置的问题<Location "/var/www/sites/">在于它/var/www/sites是文件系统上的目录而不是 URL 中的路径。<Location>指的是 URL 并<Directory>指的是文件系统路径。

您可以使用:

<Directory "/var/www/sites/">

或者

<Location "/">

我看不出第一个片段能允许 .ht*文件。它唯一能做的就是拒绝一些机器人。我认为你搞错了导致这些文件可访问的原因。.ht*如果你无法找出访问问题,你可以将文件中的所有配置移到 Apache 配置中以避免该问题。

文件的目的.htaccess是允许没有权限更改全局 Apache 配置的用户对自己的目录进行有限的控制。如果您有权限编辑全局 Apache 配置,则不需要.htaccess文件。

相关内容