Botを駆逐する

FOXのコニーこと高橋です。
今回は仕事でnginxのアクセスログを解析する機会があったので、その過程を紹介したいと思います。
nginxのアクセスログ
まず、nginxのアクセスログの出力先ですが、nginxのconfファイルに定義してあります。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
/var/log/nginx/access.log
の部分が出力先のpathとなります。
また、main
は使用するログの書式名を指定しています。
したがって、この環境ではlog_format main
で定義されている書式で/var/log/nginx/
にアクセスログを出力するという設定になっていることが分かります。
書式に使用されている変数については以下の通りとなっています。
# $remote_addr : クライアントのIPアドレス
# $remote_user : クライアントのユーザ名
# $time_local : アクセス日時
# $request : httpの要求URI
# $status : httpのステータス
# $body_bytes_sent: 送信バイト数
# $http_referer : リファラー
# $http_user_agent: ユーザーエージェント情報(ブラウザ名・バージョン等)
ちなみに、ログの書式名が省略されている場合はcombined
が適応されるそうです。
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
改行する位置こそ違いますが、2つの書式は同じのようです。
したがって、log_format main
とaccess_log
のmain
の記述を削除してもログの出力フォーマットは変わらないことになります。
次に、確認した設定を元にアクセスログを見てみます。
$ vim /var/log/nginx/access.log
[IPアドレス] - - [30/Nov/2018:17:29:42 +0900] "GET [URI] HTTP/1.1" 301 185 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)"
[IPアドレス] - - [30/Nov/2018:17:29:46 +0900] "GET [URI] HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; SemrushBot/2~bl; +http://www.semrush.com/bot.html)"
[IPアドレス] - - [30/Nov/2018:17:29:48 +0900] "GET [URI] HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; SemrushBot/2~bl; +http://www.semrush.com/bot.html)"
[IPアドレス] - - [30/Nov/2018:17:29:50 +0900] "GET [URI] HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)"
[IPアドレス] - - [30/Nov/2018:17:29:50 +0900] "GET [URI] HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; SemrushBot/2~bl; +http://www.semrush.com/bot.html)"
どうやらBotからのアクセスがあるようです。
Botについて
まずはある1日にアクセスがあったBotがどのようなものか調べます。
AhrefsBot
AhrefsというSEO分析ツールのためのWebクローラー。
Baiduspider
百度(Baidu)という中国の検索エンジンのためのWebクローラー。
bingbot
Bing(Microsoftが提供する検索エンジン)のためのWebクローラー。
DotBot
MozというSEOツールのためのWebクローラーだと思われます。
Googlebot
GoogleのためのWebクローラー。
Mappy
株式会社Coreによる検索エンジン、マーケティング解析のためのWebクローラー。
MJ12bot
Majesticというイギリスの検索エンジンのためのWebクローラー。
SemrushBot
SEMrushというマーケティングツールのためのWebクローラー。
YandexBot, YandexImages
Yandexというロシアの検索エンジンのためのWebクローラー。
Yeti
NAVERという韓国のポータルサイトのためのWebクローラー。
あまり知らないものも見かけますが、多くが検索エンジンかSEOに関連するもののためにクローリングするものであることが分かりました。
またユーザーエージェント情報としてBotの説明やクローリングをブロックする方法が記述されたページのリンクの記載がありました。
Botからのクローリングをブロックする
次に、アクセスの頻度を調べる意味でアクセス数を集計してみました。
SemrushBot 8076
AhrefsBot 4113
MJ12bot 3917
bingbot 2244
Googlebot 1398
DotBot 496
Mappy 339
YandexBot 19
Yeti 17
YandexImages 12
Baiduspider 11
1分間に14回ほどのアクセスがある計算です。
この数字が多いのかどうか分かりませんが、アクセスログを整理したいのでクローリングをブロックしてみたいと思います。
今回は、クローリングをブロックする方法としてrobots.txt
を作成したいと思います。
まず、アプリケーションのルートディレクトリにrobots.txt
を作成します。
robots.txt
には、どのBotに対して、どのディレクトリやファイルのクローリングをブロックするかを記述していきます。
全てのBotからのクローリングを許可する場合は以下のように記述します。
User-agent: *
Disallow:
特定のBotからのクローリングをブロックするには、User-agent
にBot名を記述します。
一番アクセスの多かったSemrushBotからのクローリングをブロックするには以下のように記述します。
User-agent: SemrushBot
Disallow: /
また、一部のディレクトリへのクローリングをブロックするには、Disallow
にディレクトリを記述します。
User-agent: SemrushBot
Disallow: /dir/
Disallow: /tmp/
このようにrobots.txt
を記述することで、特定のBotからのクローリングをブロックすることができますが、リアルタイムに反映されるとは限らないので注意が必要です。また、robots.txt
を無視するBotもあるみたいなので絶対ではないと知っておくことが必要だと思います。
まとめ
今回は、Botについて紹介しました。Botはなんとなく悪質なイメージがありましたが、ユーザーエージェント情報をしっかり記載しているものが多く、あまり高頻度でないアクセスに関しては無理にブロックする必要がないかなと感じました。