はじめに
Webサイトを外部に公開していると、非常に厄介なクローラーがアクセスログに蓄積。これらは
- 超高速
- 超高頻度
で行われるため、本当に必要なアクセスログ(どの検索サイトから来たか、攻撃の兆候となる不審な点はないか)がつかみにくくなっています。
これを解決するため、以下の措置を執りました。
- クローラーや悪質なボットのアクセス拒否
- それらをアクセスログにすら残さず、きちんとしたアクセスログを追いやすくする
(※こちらの記事を更に強力に推し進めたものです)
環境
- Ubuntu 24.04
- Apache 2.4
- setenvifモジュール
- authz_core モジュール
- (特段の理由がない限り、上記2つは標準で組み込まれていることが多いです。)
- ない場合は
sudo a2enmod setenvif
等とした後、sudo systemctl restart apache2.service
としてモジュールを組み込みます。
- また、バーチャルサイトによる複数ドメインにも対応しています。
さっくりとした手順
- クローラーのリストファイルを作成します。
- Apacheバーチャルサイトの.confファイルを修正します。
- 設定を反映後、状況を確認します。
クローラーのリストファイルを作成
- /etc/apache2/sites-enabled/il-vento-d-oro.txt
としてファイルを作成。(ファイル名や格納場所は自分の環境に合わせてください)
SetEnvIfNoCase User-Agent "facebookexternalhit/1\.1" bad_bot dontlog
SetEnvIfNoCase User-Agent "SemrushBot/7~bl" bad_bot dontlog
SetEnvIfNoCase User-Agent "AhrefsBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "MJ12bot" bad_bot dontlog
SetEnvIfNoCase User-Agent "DotBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "Baiduspider" bad_bot dontlog
SetEnvIfNoCase User-Agent "YandexBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "Sogou web spider" bad_bot dontlog
SetEnvIfNoCase User-Agent "Exabot" bad_bot dontlog
SetEnvIfNoCase User-Agent "MegaIndex\.ru" bad_bot dontlog
SetEnvIfNoCase User-Agent "SeznamBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "BLEXBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "Bytespider" bad_bot dontlog
SetEnvIfNoCase User-Agent "DataForSeoBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "serpstatbot" bad_bot dontlog
SetEnvIfNoCase User-Agent "SeekportBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "index\.community crawler" bad_bot dontlog
SetEnvIfNoCase User-Agent "PetalBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "BacklinksExtendedBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "meta-externalagent/1\.1" bad_bot dontlog
SetEnvIfNoCase User-Agent "ICC-Crawler" bad_bot dontlog
SetEnvIfNoCase User-Agent "bingbot" bad_bot dontlog
SetEnvIfNoCase User-Agent "msnbot" bad_bot dontlog
SetEnvIfNoCase User-Agent "Applebot" bad_bot dontlog
SetEnvIfNoCase User-Agent "DuckDuckBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "Majestic-SEO" bad_bot dontlog
SetEnvIfNoCase User-Agent "cognitiveSEO" bad_bot dontlog
SetEnvIfNoCase User-Agent "archive\.org_bot" bad_bot dontlog
SetEnvIfNoCase User-Agent "CCBot" bad_bot dontlog
SetEnvIfNoCase User-Agent "^$" bad_bot dontlog
SetEnvIfNoCase User-Agent "Custom-AsyncHttpClient" bad_bot dontlog
SetEnvIfNoCase User-Agent "ImagesiftBot" bad_bot dontlog
上記は、サイトを運営していく中で
- robots.txtを無視し
- あらゆるページにアクセスし
- 下手をすれば帯域を阻害する
ものを集めています。"^$"
は、エージェントを偽装するスクレイピングへの措置です。
この、
- SetEnvIfNoCase User-Agent "エージェント名"
- bad_bot
- dontlog
と、続けて書くことで、厄介なボットへの対処とアクセスログへの無視を決めます。
もちろん、これらのbotが必要というのであれば省いていきます。
apacheの設定ファイルを編集
- 設定ファイルのバックアップ
sudo cp -pi /etc/apache2/sites-available/hoge.conf /path/to/backup/directory/hoge.conf.$(date +%Y%m%d)
設定ファイルは自分の環境に合わせます。
任意のバックアップディレクトリを指定します。
- diffによるバックアップ確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) etc/apache2/sites-available/hoge.conf
差分(エラー)が無いことを確認します。
- ファイルの修正
以下のように修正していきます。(要管理者権限)
例)
<VirtualHost *:443>
# ServerName、ErrorLogは自分の環境に合わせます
ServerName hoge.example.com
ErrorLog /var/log/apache2/hoge/error.log
# 1)Robots.txtをすり抜ける悪質なbotのリスト(先ほど作成したリストファイルのパスをフルパスで指定)
Include /etc/apache2/sites-enabled/il-vento-d-oro.txt
# dontlogを付与したエージェントはアクセスログに記録させません
# CustomLogは自分の環境に合わせます
CustomLog /var/log/apache2/hoge/access.log combined env=!dontlog
# DocumentRootは自分の環境に合わせます。
DocumentRoot /var/www/html/hoge
# Directoryディレクティブは自分の環境に合わせます。
<Directory /var/www/html/hoge>
Options -MultiViews
AllowOverride All
<RequireAll>
# 上記リストに従い、"bad_bot"変数がセットされているクローラーのアクセスを拒否します
Require not env bad_bot
# それ以外は許可
Require all granted
</RequireAll>
</Directory>
# Require notでForbiddenにすると、クローラーは「拒否されただけで本体はある」と判断し、Webアクセスを繰り返すパターンがあるため、403に404を返す設定を付け加えます
# Directory
ErrorDocument 403 "Not Found"
- 差分確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) etc/apache2/sites-available/hoge.conf
- 上記、加えた設定が+になっていること
- ディレクティブの重複や閉じ忘れがないこと
を改めて確認します。
設定反映と確認
- 別のセッションでアクセスログを確認
tail -f /var/log/apache2/hoge/access.log
※この段階ではクローラーからのアクセスが多々来ています
- 構文確認
sudo apache2ctl configtest
Syntax Ok
を確認します
- Apache再起動前確認
systemctl status apache2.service
active(running)
を確認します
- Apache再起動
sudo systemctl restart apache2.service
- Apache再起動後確認
systemctl status apache2.service
active(running)
を確認します
この段階で、上記、
tail -f /var/log/apache2/hoge/access.log
が止まっていれば設定は成功です。
- 今までと同じようにアクセスができること
- 既存のWebサイトに異常が無いこと
- その場合のアクセスログが表示されること
を確認し、作業は成功です。
作業を切り戻す場合
何か不具合が起きた場合は、バックアップしていた.confを切り戻します。
- 差分確認
sudo cp -pi /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) etc/apache2/sites-available/hoge.conf
作業時に指定したバックアップディレクトリです。
- 差分確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) etc/apache2/sites-available/hoge.conf
差分が ない ことを確認します。
- 構文確認
sudo apache2ctl configtest
Syntax Ok
を確認します
- Apache再起動前確認
systemctl status apache2.service
active(running)
を確認します
- Apache再起動
sudo systemctl restart apache2.service
- Apache再起動後確認
systemctl status apache2.service
active(running)
を確認します
設定前になっていることを確認します。
コメントを残す