こちらの記事の応用編。
Bot・クローラーへとアクセストラフィックを「特定のユーザーエージェントを弾く」
方法は「403エラーを返すため、柄の悪いBOTが繰り返し狙い続ける」弱点がありました。
また、confファイルに禁止するエージェントやIPを指定するため、メンテナンスが悪い難点もありました。
そこで、以下のような措置を執ります。
- 排除するクローラー(Bot)ならびにIPを別のファイルで管理する。
- 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です。