Botとは何か?
webサイトに訪問してくるアクセスのうち人間によるアクセスではなく、機械的なアクセスのことをBotアクセスと呼びます。
有名なBotはGoogleBotやBingBotなどの検索エンジンを運営している会社が動かしているBotです。
これらのBotはネット上に存在する無数のページ情報を収集して検索の質を向上させるために利用しています。こうしたBotはアクセス拒否されると困るのでお行儀よくアクセスしてくることが多いですが、中には悪意のあるBotもあります。例えばDDos攻撃など対象のサーバーに対して大量のトラフィックを発生させてサーバをダウンさせるような悪質なものもあります。
DDos攻撃のような明らかに悪意のある攻撃的なアクセスは実際は少なく、どちらかというと管理者が気づかないレベルでアクセスしてくるbotが多いです。特にユーザエージェントをGooglebotなどに偽装してクロールしてくるbotは厄介です。そんなbotはアクセス元のIPを見て判断します。大抵CNやRU、VNなど国外のIPです。海外アクセスの見込みがないwebサービスであれば国別でブロックしてしまうのも有効な方法です。
Botのアクセスの影響
正規のbot(Facebookやgoogle等)でも非力なサーバでは負荷が上がって応答スピードが低下することもあります。
また、PV集計などの統計情報にbotアクセスが加わることで正しいwebマーケティング戦略が立てられなくなります。
- 正しいPV数集計結果が得られない(人間のアクセス数を見たいはず!)
- サーバの負荷上昇
- 表示速度低下でSEOに悪影響
- サーバダウンによるユーザの機会損失
- 不必要なサーバスペックアップ・コスト増
Botアクセスマネージメント・拒否のメリットとデメリット
Botアクセスが全て悪ではありません。Googlebotなどの検索エンジンのBotは検索結果に影響するので、無計画に拒否してしまうと掲載内容や検索順位に悪影響が及びます。
– デメリット
- Bot運営者のサービス上で不利になる(google検索やBing検索など)
メリット
- アクセス関連の正しい統計情報が得られる(アクセス数、直帰率、セッション時間)
- サーバリソース節約になる
- サーバダウンによる機会損失の予防
- ハッキング被害の予防
つまり、googleやbingなど訪問者が利用するような検索エンジンbotの拒否は行わないことが重要です。
逆に訪問者がいなそうな国の検索エンジンやSNS等のwebサービスのbot、あるいは正規のbotに偽装してくるbotのアクセスは拒否しても問題ないでしょう。
Botアクセスの見分け方
見分け方法は下記の流れです。
- アクセスログ中のUAを見る
- ~botという場合はbotによるアクセスの可能性が高い
- リクエストメソッド(GET, POST. OPTIONS)やアクセス先、頻度、IPのwhois情報を見て正規か判定
- 怪しいものはIPをブロックする
Botによるアクセスかどうか見分けるにはまずUAをみます。下記はapacheのログの例です。
13.66.139.13 - - [07/Apr/2021:21:50:12 +0000] "GET / HTTP/1.1" 200 10 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
UAの部分を見るとbingbot/2.0と書かれています。
bingbotとはMicrosoftが運営している検索エンジンbingのbotです。
秒間に複数アクセスしてくるということもなく、特段怪しいところはありませんでした。
このIPを見ると管理はUSでmicrosoft管理のIPでしたので正規のbotであると思われます。
$ whois 13.66.139.13
NetRange: 13.64.0.0 - 13.107.255.255
CIDR: 13.96.0.0/13, 13.64.0.0/11, 13.104.0.0/14
NetName: MSFT
NetHandle: NET-13-64-0-0-1
Parent: NET13 (NET-13-0-0-0-0)
NetType: Direct Allocation
OriginAS:
Organization: Microsoft Corporation (MSFT)
ここでCNのIPだったりしたらbingbotではないとおもわれますのでIP拒否しておきましょう。正規のbotでもbingなんて利用しないというのであればbingbotを拒否しても良いかもしれません。
ユーザエージェント(UA)は偽装することができます。そのため、UA上はbingbotでも実際は異なる場合もあります。偽装している場合は攻撃的なアクセスであることが多いので(脆弱性のある.phpにPOSTしたり、ディレクトリトラバーサル攻撃など)見分けられます。その場合はIPのwhoisを調べましょう。
Botを名乗らないBotのアクセス
UAにbotと書いてないが実態はbotである場合もあります。これを見分けるにはアクセス頻度と訪問先を見る必要があります。
例えば下記のようなアクセスがあったとします。同じIP(xx.xx.xx.xxx)から1秒1ページ以上のアクセスが続いています。UAはbotと書いていませんが、このようなアクセスの仕方は人間はできないのでbotであることがわかります。
xx.xx.xx.xxx - - [07/Apr/2021:21:50:12 +0000] "GET / HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
xx.xx.xx.xxx - - [07/Apr/2021:21:50:12 +0000] "GET /page1/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
xx.xx.xx.xxx - - [07/Apr/2021:21:50:13 +0000] "GET /page2/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
xx.xx.xx.xxx - - [07/Apr/2021:21:50:14 +0000] "GET /test/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
xx.xx.xx.xxx - - [07/Apr/2021:21:50:15 +0000] "GET /power/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
いろんなページの情報を取得しているので個人的なクロール目的のbotと思われますが1秒1アクセス以上と高頻度なので拒否してしまってよいでしょう。
Botの種類
下記のようなbotのアクセスがあります。
- amazonbot
- Adsbot
- Applebot
- AhrefsBot
- bingbot
- DataForSeoBot
- Googlebot
- PetalBot
- Semrush
- MJ12bot
Botアクセスを拒否する
IPで拒否
IPアクセスはどんなアクセスに対しても有効です。firewallやiptablesなどでIPを指定してブロックできます。
ユーザエージェントで拒否
ユーザエージェントの文字列を指定してそのユーザエージェントを拒否することができます。
実際にapache(.htaccess)で拒否する方法を紹介します。
SetEnvIf User-Agent "PetalBot" block_bot
<RequireAll>
Require all granted
<RequireNone>
Require env block_bot
</RequireNone>
</RequireAll>
これでSetEnvIfで指定したbotは403になります。
設定を確認するにはcurlでUser-Agentを指定してアクセスしてみましょう。
curl -iL -H "User-Agent: PetalBot" http://example.com
HTTP/1.1 403 Forbidden
curl -iL http://example.com
HTTP/1.1 200 OK
Requireの使い方については下記を参照してください
apache2.4でのアクセス制御はAllowではなくRequireを使おうRobots.txtで拒否
robots.txtはクローラーに対してサイトのbotアクセスポリシーを伝える文章です。
拒否しているクローラやクロール可能な場所、アクセス頻度を表明することができます。
正規のbotはrobots.txtを参照してクロールを開始しますが、強制力はないので悪質なbotは参照すらせずにクロールを開始します。しかし、前述したように正規botでも負荷が高くなることがあるので設定しておいて無駄になることはないです。
国別で拒否
HTTPヘッダーなどには国の表記はありませんが、IPは国ごとに割り振られる幅が決まっているので、IPを見れば国がわかります。中国に割り振られているIP帯を全拒否すれば中国IPからのアクセスを遮断できます。
個人でクローラー・スクレイピングする時に拒否されないようにする方法
これまではクロールされる側のサーバの話でしたが、逆にクロールする側の目線では拒否されると困りますよね?
ブロックの仕方によって変わりますが、一度ブロックされるとそのIPではアクセスできなくなります。場合によっては一定の期間があくと取り消されることもありますが、永久にブロックされるパターンもあります。
そこでサーバ管理者に悪質だと認定されて拒否されないようにする方法を紹介します。
- アクセス頻度を落とす (3~5秒空ける)
- botを名乗らない
- 国外IPを使用しない(特にUS以外の国)
1. アクセス頻度は空けられるだけ空ける
高頻度アクセスはそれだけで攻撃とみなされてブロックされる恐れがあります。
定期的に対象のサイトを巡回する場合は特に気を付けましょう。
botアクセスの間隔は最低1秒くらいといわれることが多いですが、個人サイトなど規模が小さいサイトは特にもっと開けたほうがよいでしょう。5秒程度は空けましょう