負荷分散用ミラーサイトをBot(自動実行プログラム)から守る方法

Bot(自動実行プログラム)とは

Botは、あらかじめ設定された処理を自動で行うロボットプログラムを指します。Botには以下のような種類があります。良性と悪性がありますので気をつけて下さい。Botは、単体で動作が完結するよりも、他のBotと連動して動く事が多く、一種の生命体のようです。今回は、この中でも良性でありながら時には悪性になるのではと思われるクローラについてご紹介し対策方法を示します。また、この中でクラウドデザインパターンとして、Exceptional Behaviorパターンをご紹介します。

名前 説明
Webクローラ Webサイトのリンクを全てたどって内容を解析しインデックス化します。主に検索エンジンが検索結果に反映させるために定期的に行っています。
擬人化 Twitter等のアカウントを通じて定期的に投稿したり、特定のキーワードが含まれる投稿にリプライしたりします。前者は、偉人や有名人になりきって投稿する面白いプログラムですが、後者は宣伝広告に使われるため好まれません。
ゲーム代行 オンラインゲームで単純なレベル上げなどを自動化するために仕込んだもので、主にプレイヤーが寝ているときに実行します。

スパム Webサイトフォーム等から自動投稿を行います。投稿する内容は、アフィリエイト目的やマルウェア配布が多く、Webサイトの脆弱性を突いてきます。ウィルス感染や踏み台になる可能性がありますので気をつけて下さい。
アカウント作成 自動的にアカウントを大量作成します。生成されたアカウントは売買されたり、自動的にフォロワーやフレンドを増やしたりして相手を信用させようとします。キャプチャと呼ばれる方法でBotが読み取れない処理を間に挟むことである程度防ぐことができます。
ウィルス感染 主にコンピュータウィルスです。サーバやクライアントPCに感染して自動的に個人情報等を外部に送信します。
踏み台 主にコンピュータウィルスから送られてくるデータを中継することに特化したプログラムです。自分の情報が漏れていなくても、他人の情報を知らないうちに送っているなどがあります。

ミラーサイトとは

オリジンサイトへのアクセス集中に対して負荷を分散するために用いられる手法です。最近は、様々な負荷分散の方法がありますが、ミラーサイトはオリジンサイトへの変更をほとんど加えずに負荷分散することができます。主に静的なデータを置きますが、動的なプログラムの結果をキャッシュすることもできます。

CloudFrontでお手軽ミラーサイト作成

Amazon CloudFrontは、ブラウザ操作から簡単にミラーサイトを作る事が出来ます。このときに、キャッシュ期間や対象となるURLパターンなどを指定することができます。自動的にドメイン名が割り振られますので、CNAMEで独自ドメインを設定することもできます。

Webクローラに期待する動き

Webサイトに対して多くのアクセスがあることは、顧客獲得のチャンスですので本来喜ばしいことです。しかし、実際のところは、大量のアクセスによってWebサイトがダウンしたり、遅くなったりして既存の顧客を失いかねません。また、Webクローラが巡回してくれることは、検索エンジンが評価して検索結果に反映してもらうためには必要なことですが、一気に巡回されると負荷が掛かってしまいます。それが、負荷分散用に用意したミラーサイトに対して起こったら本末転倒。通常、ミラーサイトは静的なHTML等のデータを返しますのでオリジンサイトには全く負荷が掛かりませんが、クローラの対象となるHTML内のリンクで動的なプログラム実行を伴うリンクがあるときはキャッシュが効かずに全てオリジンサイトを見に行ってしまいます。いわば、複数のBotによるオリジンサイトへのサービス妨害攻撃(DDoS攻撃)です。

以上のような背景から、ミラーサイトに対して必要な設定は、以下の2つです。

  • どのオリジンのミラーサイトであるかを明示する
  • 検索エンジンによるインデックス作成を拒否する

どのオリジンのミラーサイトであるかを明示する

どのオリジンのミラーサイトであるかを明示するためには、canonicalという表記をします。検索エンジンがインデックスを行った結果、検索結果としてどちらのページを優先的に表示させるか困る事があります。それは、内容が同じときです。もしかしたら、同じ内容のWebサイトがたくさんあるということで、総合的なランキングが下がってしまうかもしれません。

例えば、以下のWebアドレスは同じ中身のサイトを示していますが、検索エンジンは別物として見て評価してしまう可能性があります。

表記 説明
http://www.classmethod.jp/ 正式名称として使うアドレス
https://classmethod.jp/ ホスト名無しでもアクセスできるアドレス
http://classmethod.jp 最後のスラッシュを除いてもアクセスできるアドレス

https://classmethod.jp/?from=hoge URLパラメータが付加されているアドレス

http://cdn.classmethod.jp 負荷分散用にミラーサイトとして利用するアドレス
http://classmethot.jp/ ※おまけ:似ているアドレス名でユーザをだます目的のフィッシングサイト(ドメイン名は架空です)

といことで、各HTML(※最後のは除くw)のヘッダ部分にcanonicalを記述しましょう。

<link rel="canonical" href="https://classmethod.jp/">

これで、ミラーサイトを作ったとしても、オリジンサイトが何処であるか明示されているため、検索エンジンが混乱して評価を下げたりすることは無いのではと思います。キャンペーンや広告からの流入をミラーサイトに流せば負荷分散の効果が現れて来ますね。もし、長期的にミラーサイトを使いたいのであれば、canonicalにミラーサイトを載せて負荷分散しても良いかもしれませんが、長期的な視点であれば、オリジンサイトの負荷軽減やDNSレベルでの負荷分散を検討してみてはいかがでしょうか。

検索エンジンによるインデックス作成を拒否する

Webサイトを多くの人に使ってもらいたいEコマースサイトなどでは、Webクローラによるインデックス作成を拒否するべきではありません。しかし、ミラーサイトを公開して数日経つと、Webクローラがミラーサイトの中を巡回し始めます。Eコマースサイトなどの商品の数だけページが存在するようなサイトでは、分散サービス拒否攻撃並みにアクセスが跳ね上がるかもしれません。そこで、ミラーサイトのみインデックス作成を拒否する記述をしてみたいと思います。

Google、Yahoo、Microsoft等の大手検索サイトは、robots.txtというファイルを先にチェックし、その中にあるルールに沿ってWebクローラがサイトを巡回します。たとえば、オリジンサイトは全てのクローラを許可する設定にするのであれば、以下のように記述します。

以下は、全てのクローラを許可する設定です。

User-agent: *
Disallow:

以下は、全てのクローラを拒否する設定です。

User-agent: *
Disallow: /

これで、ミラーサイトに対するWebクローラの巡回が無くなりました。オリジンサイトは今まで通りです。しかし、ここでひとつ問題点があります。ミラーサイトに対して手作業で更新するのは現実的ではないですし、CloudFrontでどうやって個別設定するのか不明な点があります。

Exceptional Behaviorパターン

Exceptional Behaviorパターンは、ある特定のURLへのアクセスの時だけ別のオリジンを見るように設定するテクニックです。クラウドデザインパターン的なもので、思いつきですw。今回の記事であれば、robots.txtへのリクエストの時だけ、設定内容の異なるファイルを見に行くようにします。CloudFrontでは、ひとつのディストリビューション(ミラーサイトのドメイン)に対して、複数のオリジンを設定することができ、URLのパスパターンに応じてオリジンを切り替える(URL Behaviorパターン)ことができるため、Exceptional Behaviorパターンを実現することができます。

以下は概念図です。

まずは、例外的な宛先を設定するためにS3バケットを作成しておきます。S3のWebサイトとして公開状態にしておきます。

以下はCloudFrontの設定画面です。ひとつのディストリビューションに対して2つのオリジンを作成します。

そして、ビヘイビア(振る舞い)の画面で、パスパターンを指定しています。

これで必要な設定は完了です。Botからの巡回を拒否するミラーサイトが完成しました。あ、そうそう、ミラーサイトの公開を終えたいときは、オリジンサイトへアクセスするように、Exceptional Behaviorパターンを用いつつ、S3の新機能であるWebリダイレクトの仕組みを組み合わせればOKですね。

まとめ

今回は、CloudFrontによって作成したミラーサイトをより効果的に運用するためのテクニックとして、Exceptional Behaviorパターンを用いたBot巡回拒否の方法についてご紹介しました。また、HTML内でcanonical指定をすることで、ミラーサイトやURL表記揺れによる検索エンジンからの評価低下を防ぐ方法についてもご紹介しました。CloudFrontは、オリジンサーバへの負荷を軽減するソリューションとして非常に有効ですが、特性を押さえておく事でさらに効果的になると思います。クラスメソッドでは、AWSクラウドの各サービスを活かしたWebの最適化について日々研究を続けています。既存のお客様からのご協力の下、たくさんのノウハウを公開しております。今年は合計で100本ほど公開する予定ですので、ネタ切れしないようにたくさんのお仕事のご依頼をお待ちしておりますw。今日から君もWebマーケ担当!?

参考情報

Amazon CloudFront Developer Guide