Webサイトへの大量アクセスに備える|過負荷によるサイト停止を防止

当ページは検証・整備中のドラフトです。
内容は実環境での検証や追加調査により変更される予定です。
参照:ページ公開・更新ポリシー

大量アクセスは攻撃以外でも発生する

Webサイトへのアクセスが処理能力を超えると、表示の遅延やエラーが発生し、サイトを利用できなくなることがある。

原因はDoSやDDoSといったサイトへの悪意ある攻撃だけではなく、SNSやニュースをきっかけに利用者が集中することもあれば、Botによる巡回や特定機能への大量リクエストが負荷を生むこともある。

まず、アクセスが増えている原因を分けて考える。

原因内容
正常なアクセス集中多数の利用者が短時間にアクセスするSNS・ニュース掲載、キャンペーン、災害時の情報確認
Botによるアクセス自動化されたプログラムが継続的にアクセスするクローラー、スクレイピング、AI Bot
大量リクエスト特定のページや機能へ通信が集中する検索、API、ログイン、フォームへの連続アクセス
DoS一つまたは限定された送信元から大量の通信や処理を発生させる大量リクエストによるサービス妨害
DDoS多数の送信元から分散して通信や処理を発生させるボットネットなどを利用した攻撃

同じアクセス数でも負荷は異なる

Webサイトへの負荷は、単純なアクセス数だけでは決まらない。

画像など既に存在するファイルを返す処理と、アクセスのたびにプログラムを実行してデータベースから情報を取得する処理では、サーバーへ与える負荷が異なる。

アクセス
   ↓
通信・データ転送
   ↓
Webサーバー
   ↓
アプリケーション
   ↓
データベース

WordPressやEC-CUBEなどのCMSに代表される動的サイトでは、ページ生成や検索によってPHPやデータベースの処理が発生する。

大量アクセスへの対策では、アクセス数だけでなく、通信、Webサーバー、アプリケーション、データベースのどこに負荷が集中しているかを見る。

大量アクセスへの対策を選ぶ

大量アクセスへの対策には複数の方法があり、それぞれ役割が異なる。

対策何をするか主な適用場所(サービス提供者)
キャッシュ同じ処理の繰り返しを減らすCMS、Webサーバー、ホスティング、CDN
CDNコンテンツ配信を分散するCDNサービス、ホスティング
Bot対策不要な自動アクセスを判定・制限するCDN、外部サービス、ホスティング
WAFWeb通信を検査し、不正な通信を遮断する外部サービス、ホスティング
レート制限短時間の連続リクエストを制限するCDN、WAFを提供するサービス、ホスティング
リソース増強Webサイトが処理できる量を増やすホスティング、クラウド

一つの方法ですべてに対応するのではなく、負荷の原因に合った対策を組み合わせる。

キャッシュで処理回数を減らす

キャッシュは、一度生成したページやデータを保存し、同じ要求に再利用する仕組みである。

アクセスのたびに同じページを生成している場合、キャッシュから返せばアプリケーションやデータベースの処理回数を減らせる。

特にCMSなどの動的サイトでは、アクセスそのものを減らさなくても、一回あたりの処理を軽くすることでアクセス集中に対応しやすくなる。

CDNで配信負荷を分散する

CDNは、Webサイトのコンテンツを複数の配信拠点から利用者へ届ける仕組みである。

画像、CSS、JavaScriptなどをCDNから配信すれば、すべての通信を元のWebサーバーで処理する必要がなくなる。構成によっては、キャッシュしたWebページもCDN側から配信できる。

特に静的コンテンツへのアクセスが多い場合は、元のサーバーへの通信や転送量を減らしやすい。

Bot対策で不要なアクセスを減らす

WebサイトへアクセスするBotには、検索エンジンのクローラーなど正当なものもあれば、スクレイピングや攻撃を目的とするものもある。

サイト運営に必要のないBotが大量のアクセスを発生させているなら、それらを判定して制限することで不要な通信を減らせる。

検索エンジンなど必要なBotまで遮断しないよう、判定や制限の範囲に注意が必要となる。

WAFで攻撃リクエストを遮断する

WAFはWebサイトへの通信を検査し、一定の条件に該当する不正なリクエストを遮断する仕組みである。

WAF自体はサーバーの処理能力を増やすものではないため、正常なアクセス集中に対する中心的な対策にはならない。一方、大量の通信にWebアプリケーションへの攻撃が含まれている場合には、防御手段の一つとなる。

また、WAFを提供するサービスがレート制限やBot対策などを併せて備えていることもある。これらはWAFそのものとは分けて考える。

参照:WAFとは

レート制限で過剰な連続アクセスを抑える

レート制限は、一定時間内に許可するリクエスト数などに上限を設ける仕組みである。

例えば、同じ送信元から検索を繰り返したり、APIやフォームへ短時間に大量のリクエストを送ったりする通信の抑制に使える。

レート制限は単独の製品として導入するというより、CDN、WAFを提供する外部サービス、ホスティングなどに備わる機能として利用することが多い。まず、現在利用しているサービスに該当する機能があるかを確認する。

制限を厳しくしすぎれば正常な利用者にも影響するため、対象とするURLや条件、上限値は実際の利用状況に合わせたい。

処理能力が不足するならリソースを増強する

アクセスそのものが正常で、今後も継続すると見込まれるなら、通信を制限するだけでは解決しない。

ホスティングの上位プランへの変更、CPUやメモリなどのリソース増強、より多くのアクセスを処理できる環境への移行が選択肢となる。

恒常的なアクセス増加では、キャッシュやCDNによって一回あたりの負荷を減らしつつ、それでも不足する処理能力を増やすという考え方が適している。

原因に合わせて対策を組み合わせる

大量アクセスの原因によって、優先する対策は変わる。

大量アクセス
    │
    ├─ 正常なアクセス集中
    │      ↓
    │   キャッシュ
    │   CDN
    │   リソース増強
    │
    ├─ 不要なBot
    │      ↓
    │   Bot対策
    │   レート制限
    │
    ├─ 特定機能への連続アクセス
    │      ↓
    │   キャッシュ
    │   レート制限
    │
    └─ 攻撃
           ↓
        WAF
        Bot対策
        レート制限

実際には複数の原因が重なることもある。アクセス集中だからCDN、攻撃だからWAFと一つに決めるのではなく、原因と負荷が生じている場所を確認して対策を組み合わせる。

どこで対策するか

キャッシュ、Bot対策、WAF、レート制限などは、それぞれ独立した製品を追加しなければならないわけではない。

ホスティング、CDN、外部セキュリティサービス、CMSなどが複数の機能を提供しており、一つのサービスでCDN、WAF、Bot対策、レート制限などを利用できる場合もある。

小規模環境では、まず現在利用しているホスティングや外部サービスで利用可能な機能を確認し、不足するものを追加する方が管理対象を抑えやすい。

参考:ホスティング・外部サービスのセキュリティ機能の利用

まとめ

Webサイトの過負荷は、正常なアクセス集中、Bot、特定機能への大量リクエスト、DoS・DDoSなど複数の原因によって発生する。

大量アクセスが発生したら、まず原因と負荷が生じている場所を確認する。そのうえで、キャッシュやCDNで処理を軽くする、不要なBotや連続アクセスを制限する、WAFで攻撃リクエストを遮断する、処理能力そのものを増やすといった対策から必要なものを選び、必要な処理を通しながらも不要なアクセスや攻撃を遮断するよう、実装していく。