Botを駆逐する

Blog Single

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 mainaccess_logmainの記述を削除してもログの出力フォーマットは変わらないことになります。

次に、確認した設定を元にアクセスログを見てみます。

$ 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はなんとなく悪質なイメージがありましたが、ユーザーエージェント情報をしっかり記載しているものが多く、あまり高頻度でないアクセスに関しては無理にブロックする必要がないかなと感じました。

参考

心無い冗談を愛するエンジニア。音楽とサッカーが好きです。

Other Posts: