Cloudflare Freeプランでスクレイパーの殺到:何が止まり、何をオフのままにしたか

オペレーション

ある朝、運営中の商品ページサイトの1つが開かなくなった。Cloudflareは訪問者に524を表示し、オリジンは1ページあたり2〜6分を要し、約10時間誰も気づかなかった。原因は、住宅用プロキシ経由で毎秒約225リクエストを投げるスクレイパーだった。

殺到の形状

すべてのリクエストでページがレンダリングされるため、各ワーカーは数百件のレンダリングをキューに積み、CPU上限に達した。

アドレス単位制限が助けにならなかった理由

レート制限はアドレスごとのリクエスト数を数える。数千のアドレスからそれぞれ1〜3リクエストでは、どの単一アドレスも制限に近づかない。国をブロックすれば訪問者までブロックしていた。スクレイパーが安価に偽装できなかったのは、以前そのサイトを訪れたことのあるブラウザのように振る舞うことだった。

Cloudflareのエッジで:無料ルール3つ

FreeプランではゾーンごとにWAFカスタムルールを5つまで使える。3つを使い、ブロックではなくマネージドチャレンジを設定した。誤って引っかかった人はクリックで通過できる:

3つとも、Cloudflareが検証済みのボット、自らをロボットと名乗るユーザーエージェント、当社の独自アドレス、APIおよびWebhookのパス、そしてページではないファイルは通過させます。2日後も洪水は続いていました。1時間で、偽ブラウザルールは10,000件以上のリクエストにチャレンジを課しました。クエリごとにCloudflareが返す10,000件のイベントは、9,627個のアドレスからのもので、いずれも4件を超えていませんでした。

オリジン側:アプリ内のゲート

ヘッドレス側は完全なブラウザヘッダーを持つため、緊急ルールが無効な間はエッジルールだけでは捕捉できません。アプリ自体では、ページレンダラーの前に小さなミドルウェアを配置しました:

開始後1分間で、ゲートは約6,700件の偽ブラウザを拒否し、約6,700件の見知らぬ訪問者を排除しました。一方、見知らぬ訪問者には毎秒約9ページを提供しました。遅いリクエストはゼロになり、ワーカーのCPU使用率は上限から12〜15パーセントに、メモリはそれぞれ4〜5GBから0.65GBに低下しました。

オフのままにしたもの

まとめ

住宅用プロキシ経由の洪水は、欠けているもの(ブラウザのfetchヘッダー、クッキー、Referer)で容易に見分けられます。エッジでチャレンジを課し、見知らぬ訪問者をワーカーがレンダリングできる範囲に抑え、ページが開かなくなったときにサーバー外から何かを検知できるようにしてください。Night Watchはこれら3つをパッケージ化しています:ウォッチ、緊急ルール用の自動スイッチ付きルール、そしてPython Webアプリ用のゲート。

更新済み: