こちらの記事の応用編。

Bot・クローラーへとアクセストラフィックを「特定のユーザーエージェントを弾く」

方法は「403エラーを返すため、柄の悪いBOTが繰り返し狙い続ける」弱点がありました。

また、confファイルに禁止するエージェントやIPを指定するため、メンテナンスが悪い難点もありました。

そこで、以下のような措置を執ります。

  1. 排除するクローラー(Bot)ならびにIPを別のファイルで管理する。
  2. Rewriteルールで「403」ではなく「404」を返すようにする。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • 要:Rewriteモジュール

リライトモジュールのインストール確認

sudo apache2ctl -M |grep rewrite

rewrite_module (shared)と有効化を確認します。

有効化されていない場合は

sudo a2enmod rewrite
sudo systemctl restart apache2.service

で有効化します。

特定のユーザーエージェントを弾くためのファイルを作成

/etc/apache2/site-enabled/spam-clawler.txt として、以下のようなファイルを作成。

RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit/1\.1) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SemrushBot/7~bl) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (AhrefsBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (MJ12bot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (DotBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Baiduspider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (YandexBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Sogou\ web\ spider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Exabot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (MegaIndex\.ru) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SeznamBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (BLEXBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (Bytespider) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (DataForSeoBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (serpstatbot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (SeekportBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (index\.community\ crawler) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (PetalBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (BacklinksExtendedBot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (GPTBot/1\.2) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (ICC-Crawler) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (ImagesiftBot) [NC]

正規表現などがある場合は注意してください。

特定のIPアドレスを弾くためのファイルを作成

/etc/apache2/site-enabled/spam-ips.txt として、以下のようなファイルを作成。

RewriteCond %{REMOTE_ADDR} ^190\.92\.
RewriteCond %{REMOTE_ADDR} ^159\.138\.
RewriteCond %{REMOTE_ADDR} ^166\.108\.
RewriteCond %{REMOTE_ADDR} ^124\.243\.
RewriteCond %{REMOTE_ADDR} ^114\.119\.
RewriteCond %{REMOTE_ADDR} ^119\.8\.
RewriteCond %{REMOTE_ADDR} ^110\.238\.
RewriteCond %{REMOTE_ADDR} ^217\.113\.194\.
RewriteCond %{REMOTE_ADDR} ^34\.123\.
RewriteCond %{REMOTE_ADDR} ^119\.13\.

confファイルの修正

  • バックアップ
sudo cp -pi /etc/apache2/sites-availables/sites.conf /path/to/backup/directory/sites.conf.$(date +%Y%m%d)

任意のバックアップファイル、利用しているサイトを用います。

  • バックアップ確認
diff -u /path/to/backup/directory/sites.conf.$(date +%Y%m%d) /etc/apache2/sites-availables/sites.conf

差分がないことを確認します。DocumentRoot等は修正します。

ファイル修正

  • /etc/apache2/sites-availables/sites.conf

以下のように修正していきます。

DocumentRoot /home/www-data/atelier/public
    <Directory /home/www-data/atelier/public>
        Options -MultiViews
        AllowOverride All
    <IfModule mod_rewrite.c>
    RewriteEngine On
    # 2025/03/21追加
    # 読み込まれたUser-Agentに基づき、Clawlerに対して404を返す
    Include /etc/apache2/sites-enabled/spam-clawler.txt
    RewriteRule .* - [R=404,L]

    # 2025/03/21追加
    # 読み込まれたIPアドレスに基づき、偽装エージェントのIPに対して404を返す
    Include /etc/apache2/sites-enabled/spam-ips.txt
    RewriteRule .* - [R=404,L]
   </IfModule>
     <RequireAll>
      Require all granted
     </RequireAll>
    </Directory>

この時、ディレクトリやパスファイルが合っていることを確認します。

整合性確認

sudo apache2ctl configtest

Syntax OKを確認します。

Webサービス再起動

sudo systemctl restart apache2.service && echo $?

0を確認

systemctl status apache2.service

tatus(running)を確認します。

設定後の確認

sudo tail -f /path/to/web/access_log 

等として、ログを流し続けて、
指定したBOTからのアクセスが404になっていることを確認できればOKです。