Apache2.4: 迷惑な Crawler を SetenvIf でブロックする

最近、やたらとしつこく、同じメモを何度も何度もスキャンするWebサイトCrawlerとか、短いアクセス周期でスキャンを掛けてくる、振興Crawlerが増えてきて、とうとう、堪忍袋の緒が切れてしまいました。

回線のパフォーマンスにはまだ少しだけ余裕がありますが、ログがノイズだらけになってしまいます。どうせ、私のサイトにアクセスしに来る人は、google, msn, yahoo あたりの総和で99%なので、コロンビアとかヨーロッパの情報収集サイトなんかを私が考慮する価値はないんですよ。(なぜ、コロンビアのサイトが、私のメモを一時間に50ページもスキャンする必要がある?)

robots.txt に記述する手もありますが、あれはプログラマーのマナー次第でどうにでも変わりますからね。私のサーバー側で拒否することにします。

Apacheの場合、「SetenvIf」というコマンドを、.htaccess に記述することで、それ以下の階層へのアクセスを制限することが出来るそうです。

チェックすべきは、ユーザーエージェント。

例えば、以下の行はLineからと思われるスキャンの一行。

crawl.147-92-153-16.search.line-apps.com - - [02/Jan/2022:08:44:02 +0900] "GET /notes/2021/01/29/lga775-mother-board-d-g41agb3-v1_01/ HTTP/1.1" 200 86500 "-" "Mozilla/5.0 (compatible; Linespider/1.1; +https://lin.ee/4dwXkTH)"

赤の部分が、ユーザーエージェントの情報。ここに、どんなツールでアクセスしているかの情報や、クローラーの考え方を示すURLが記述されています。

下の行が、普通にスマートフォンのWebブラウザーから文章を読んでいるアクセス。botではないアクセス行。

133.106.62.4 - - [02/Jan/2022:13:27:35 +0900] "GET /notes/2019/09/28/bitlocker-recovery-code-input-field-appeared-after-bios-settings-change/ HTTP/1.1" 200 17276 "https://www.google.co.jp/" "Mozilla/5.0 (iPhone; CPU iPhone OS 15_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Mobile/15E148 Safari/604.1"

エージェントの記述が違います。

普通の情報アクセスはそのままで、クローラー、Bot だけをブロックするには、ここの情報を使います。

SetenvIf の記述方法に関して今回は、

Apache | SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する (javadrive.jp)

の情報を使わせていただきました。

以下が作業内容。

当メモサイトのトップに置いてある、.htaccess の上の方に、

SetEnvIf User-Agent "Linespider" chk_url
deny from env=chk_url

と書きました。

ダブルクォートの中が、HTTPDログに含まれる、ユーザーエージェント名。上記の例では、Linespider となります。(今回、Linespiderは、まだブロックしませんよ。ただの例です。)
chk_url というのがラベル。deny from env=”ラベル名” で実際のブロックを行います。

実際にブロックを行ったボットは、以下の3行。前々からアクセスがうざいと思っていたクロールで、今回、まとめてブロックすることにしました。

SetEnvIf User-Agent "PetalBot" chk_url
SetEnvIf User-Agent "AhrefsBot" chk_url
SetEnvIf User-Agent "MJ12bot" chk_url

エージェント情報はプログラマーが自由に設定できるので、悪意を持って、目的サイトに迷惑を掛けようとする場合は、この方法ではブロックできません。Agent情報を一文字変えれば、通過できるようになりますからね。

今回はブロックしなかったけど、マナーが悪いのは、MSNの bingbotも同じ。 ブロックするべきかどうかのギリギリライン上にいます。ログの汚れを我慢できる範囲なので許可していますが、ひどくなるようだったらブロックします。

Botのアクセスではないのですが、ついでに、リファラー を判断してブロックする書式も書いておきます。

リファラーとは、サイト訪問のきっかけとなったリンクのこと。
例えば、Web検索して、表示された一覧の中のリンクとか、どこかの掲示板やQ&Aページなどに情報元として記されたリンク情報。最近は、どの検索エンジンから飛んできたのかが記されていて、検索キーワードが秘匿される傾向にあります。それはいいとして、以下のアクセスの場合は、google の検索結果から飛んできたことがわかります。

104.28.83.196 - - [02/Jan/2022:14:11:10 +0900] "GET /notes/2020/07/30/cheep-compatible-usb-type-c-ad-adapter-may-break-hp-elitebook/ HTTP/1.1" 200 18709 "https://www.google.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 15_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/96.0.4664.101 Mobile/15E148 Safari/604.1"

こういう検索エンジンからのジャンプなら問題ないのですが、時々、掲示板やtwitter にURLを記述されて、回線とサーバーがパンクしそうになることがあります。そういう時に使うかどうかは別にして、このリファラーに掛かれている情報で、アクセスをブロックすることが出来ます。

SetEnvIf Referer "^https://www\.google\.com" chk_url

この例は、Referer フィールドが、https://www.google.com で始まっているアクセス全部にラベルを付けます。

^ を使っているのは、先頭からのパターンマッチング。\ (back slash) は . ピリオドを確実にピリオドとして判定するためのエスケープ。

これを実際に .htaccess に記述すると、サイトが静かになることは確実。

SetEnvIf Referer "^https://www\.google\.co\.kr" chk_url

.com を co.kr に書き換えれば、google.co.kr からたどり着くアクセスがブロックされることになります。例えば、海外検索サイトからマナーの悪いアクセスがある場合、リファラー情報でブロックすることが出来ます。

当然、定義とラベルがペアになる拒否文

deny from env=chk_url

が、必要になります。

今のところ、不特定IPアドレスからアクセスされる、ブロックしたいリクエストは、Bot対策とリファラーなので、まずはこれくらいを記録しておけばいいでしょう。

コメントを残す