通过 access.log 阻止访问

通过 access.log 阻止访问

我的 access.log 充满了:

Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, [email protected])
CCBot/2.0 (http://commoncrawl.org/faq/)
Mozilla/5.0 (compatible; spbot/5.0.3; +http://OpenLinkProfiler.org/bot )
Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)
Mozilla/5.0 (compatible; SeznamBot/3.2; +http://napoveda.seznam.cz/en/seznambot-intro/)

以及:

85.55.237.132 - - [16/Jul/2018:06:30:44 +0000] "GET /wp-login.php HTTP/1.1" 404 11462 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
51.253.65.140 - - [16/Jul/2018:06:30:47 +0000] "GET /wp-login.php HTTP/1.1" 404 7645 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
113.161.75.37 - - [16/Jul/2018:06:30:57 +0000] "GET /wp-login.php HTTP/1.1" 404 12145 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
114.94.208.2 - - [16/Jul/2018:06:31:04 +0000] "GET /wp-login.php HTTP/1.1" 404 11096 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
112.134.172.163 - - [16/Jul/2018:06:31:07 +0000] "GET /wp-login.php HTTP/1.1" 404 11177 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
144.48.75.34 - - [16/Jul/2018:06:31:13 +0000] "GET /wp-login.php HTTP/1.1" 404 7736 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"

并且我的网站都不是 wordpress 的。

目前,我通过 UFW 阻止 IP 访问这些 IP,但它们已达数千个,并且每天的数量都在增加。

有没有办法对 Ubuntu 举例来说:

If the user-agent (or requested URL) contains "Mjbot" block it.

我见过一些工具,例如 Fail2ban、modsecurity 等,但它们似乎使事情变得复杂而不是简化。

我正在寻找一个非常简单的解决方案。

答案1

通过使用 可以轻松完成此操作mod-rewrite。只需修改您的开始部分.htaccess即可

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_USER_AGENT} *Mjbot* [NC]
  RewriteRule .* - [F,L]
</IfModule>

您可以*Mjbot*用您选择的正则表达式替换

RewriteCond指令设置了“重写”或修改 URL 的条件。在本例中,它会检查变量是否与不区分大小写的HTTP_USER_AGENT正则表达式匹配*Mjbot*[NC]

RewriteRule指令告诉 apache 对所有在此.htaccess( .*) 下的请求都以 403 Forbidden (标志F) 进行响应,并在之后立即停止重写过程 (L标志)

此外,您还可以通过使用已打包的mod_setenvif

为此,请.htaccess添加以下行:

SetEnvIf User-Agent "*Mjbot*" dontlog

答案2

我认为它不起作用......

我在 apache2.conf/httpd.conf 中有这样的规则

RewriteCond %{REQUEST_URI} wp-login.php$ [NC]
RewriteRule .* - [F,L]

如果我使用 curl 发送一个 URL,我会看到以下内容:

curl -Is https://www.alebalweb-blog.com/wp-login.php | head -n 1
HTTP/2 404 

我难道不应该看到 403 吗?

事实上,如果我直接在网站的 .htaccess 上添加相同的规则,我会看到以下内容:

curl -Is https://www.alebalweb-blog.com/wp-login.php | head -n 1
HTTP/2 403 

因此我对 apache2.conf/httpd.conf 中的 URL 重写规则进行了一些研究,发现有很多人对此感到困惑,也有很多困惑。

在许多事情中,有些事情能让人更清楚,但也有让人困惑的地方,比如这个:http://tltech.com/info/rewriterule-in-htaccess-vs-httpd-conf/

这里说了url重写的规则必须用标签括起来:

<Directory></Directory>

但是想要使用 apache2.conf/httpd.conf 时我不明白在哪个,我的 apache2.conf 中已经有 3 个:

<Directory />
<Directory /usr/share>
<Directory /var/www/>

我尝试添加一个标签:

<Directory>

在文件开头的代码周围,Apache 不喜欢它。

所以我尝试这样做:

<Directory />

apache 没有什么抱怨,但它似乎不起作用。

所以我尝试这样做:

<Directory /var/www/>

Apache 再次没有抱怨,但它似乎没有改变任何东西。

然后我尝试了一下,不添加标签,而是直接在现有的标签中输入URL重写规则,但是apache不喜欢。

然后我再次搜索并发现了这一点:https://stackoverflow.com/questions/344588/how-can-i-implement-a-global-rewritecond-rewriterule-in-apache-that-applies-to

这里他们讨论了 URL 重写的新选项:InheritDown、InheritDownBefore、IgnoreInherit。

但是再次想要使用 apache2.conf/httpd.conf,我应该把这些新选项放在哪里以及我的规则放在哪里?

我确信所有这些都能起作用,但我需要弄清楚每个部件应该放在哪里才能使一切正常工作。

有人能帮助我吗?

答案3

如果有的话,也许你应该买一本有关 fail2ban 的书。


您在回答中提出了更多问题。解决您的第一个问题不是更有意义吗?


如果你想知道我的答案/意见:从 Apache 更改为 Nginx 并执行类似的操作:

if ($http_user_agent ~* "AhrefsBot")
{
    rewrite .* /error.php?e=403 last;
}

在 error.php 中,您可以通过 $_SERVER 从请求者处获取更多数据并将其通过电子邮件发送给您,或者最好将其放在日志文件中。

禁止GET参数的SQL就更好玩了:

if ($query_string ~* "(alter|delete|update|select)(?![a-z._-])")
{
    set $lalala "bad_main_word";
}

if ($query_string ~* "1=1|ALL|DISTINCT|ON|AS|FROM|WHERE|GROUP|BY|HAVING|WINDOW|UNION|INTERSECT|EXCEPT|ORDER|ASC|DESC|USING|NULLS|FIRST|LAST|LIMIT|OFFSET|ROW|ROWS|FETCH|NEXT|ONLY|FOR|NO|KEY|SHARE|OF|NOWAIT|LATERAL|NATURAL|TABLE|CURRENT|RETURNING")
{
    set $lalala "${lalala}_and_bad_sub_word";
}

if ($query_string ~ "Put some RegEx here to whitelist your stuff, check your mail/log!")
{
    set $lalala "whitelist";
}

if ($lalala = "bad_main_word_and_bad_sub_word")
{
    rewrite .* /error.php?e=403 last;
}

当然,您还需要以下内容。

location = /error.php {
    alias /var/www/error.php;
    fastcgi_index error.php;
    fastcgi_pass php;
    include fastcgi_params;
    internal;
}

error_page 403 /error.php?e=403;

相关内容