世界を動かす技術を、日本語で。

HNに聞く: AWSボットが月に20億リクエストを送るのをどう止めるか?

221日前

概要

  • AWS Singapore 経由の “Mozilla/5.0 (compatible; crawler)” ボットによる大量リクエスト問題
  • CloudFlare WAF で一時的に対処中
  • AWSサポート からは実質的な対応なし
  • 4XX/30Xレスポンス も効果なし
  • 同様の経験 や追加対策案を求める内容

AWS経由ボットによる大量リクエスト問題と対処例

  • AWS Singapore 発の “Mozilla/5.0 (compatible; crawler)” ボットによる1秒間に700件超のリクエスト被害
  • CloudFlare WAF ルールと HTTP 444レスポンス でトラフィックを遮断し、アウトバウンド通信を抑制
  • AWSへの通報 後、「顧客と連携したが追加対応不要」とのテンプレート回答のみ
  • 4XX系レスポンス30Xリダイレクト も無効
  • CloudFlare契約見直し が必要なレベルのトラフィック量
  • アクセス解析やログ確認 の妨げとなるノイズ
  • リダイレクトによるAWS Abuseページ転送 も、規模的にDDoS誘発リスクあり

他の被害報告・経験共有の呼びかけ

  • 同様のAWS経由ボット被害 経験者の有無を確認
  • 追加対策案実効性の高い対応策 の共有を希望

考えうる追加対策案

  • CloudFlare Rate Limiting 機能の活用
    • 特定User-AgentやIPレンジに対するアクセス制限
  • AWS IPレンジのブラックリスト化
    • AWS公式のIPリストを定期取得し、WAFなどでブロック
  • CloudFlare Bot Management の導入検討
    • 高度なボット検知・遮断機能
  • ログフィルタリング・分析強化
    • Bot由来トラフィックを除外したレポート生成
  • AWS Abuseチームへの再度の詳細報告
    • 被害状況や影響範囲、証拠ログの明示
  • 法的・契約的なアプローチ
    • 弁護士相談や公式文書での申し入れ

注意点と倫理的配慮

  • 攻撃元へのリダイレクト は新たなDDoSやAbuseと見なされる恐れ
  • 報復的な対応 は避け、あくまで防御的・合法的な範囲で対応推奨

Hackerたちの意見

AWSシンガポールから正当なトラフィックを受け取ってる、または受け取る予定はある?もしないなら、全体をブラックホールにしちゃえば?

そうだね。WAFを設定して、パケットをそのまま捨てるようにすればいいと思うよ。レスポンスのオーバーヘッドも気にしなくて済むし。CloudflareのWAFではこれを「ブロック」って呼んでるみたい。

うん、これをしばらくやってたよ。TikTokのバイトダンス/バイトスパイダーボットが、私のサイトから何百万もの画像リクエストを送ってきてたんだ。何度も何度も止まらなかった。最終的にはCloudinaryに頼んで、関連するユーザーエージェントを全部ブロックしてもらったし、最初はシンガポールを完全にブロックしたよ。これらのAIスクレイピング会社のボットは本当にひどい!もし優しいCloudinaryを使ってなかったら、すごく高いホスティング料金に悩まされてたかも。今はCloudflareで全てのAIボットをブロックして、もう終わりにしてるよ!

これがIPアドレスの範囲だよー - https://docs.aws.amazon.com/vpc/latest/userguide/aws-ip-work...

明らかに悪用してるボットを高コストにするのも一つの手だね。終端サーバーをコントロールできるなら。gzipボムはボットが脆弱だったら効果的だけど、接続速度を遅くするだけでも十分なことが多いよ。404で応答する前に10秒待つだけで、彼らのサーバーで約7,000ポートを消費するから、ほとんどのLinuxプロセスをクラッシュさせるには十分だね(nginx + mod-http-echoを使うのが簡単だよ)。

同じような考えで、PoWチェックのanubis[1]がOPにも効くかもしれないね。 [1] https://github.com/TecharoHQ/anubis

この種の考え方は、ボットが非ステルスであることを前提にしてるね。

AWSの顧客はアウトバウンドトラフィックにお金を払わなきゃいけないんだよね。彼らに(またはCloudflareに)大量のトラフィックを送らせる方法はあるのかな?

いいアイデアだね!同じようなニーズで実装してる人もいるみたいだし(ソースコードのユーザーエージェントリストを見てみて)。実装は簡単そうだね。 https://github.com/0x48piraj/gz-bomb/blob/master/gz-bomb-ser...

同じような状況に直面したことがあるよ。考えたのは、悪いデータを与えることだった。うちの場合、彼らが価格データを得るためにサイトをスクレイピングしているのは明らかだった。マスターカタログには数百万のSKUがあって、在庫状況や顧客契約、その他の要因に基づいて動的に価格が設定されてたんだ。それに、関連するクロスセルや代替選択肢のおすすめを商品ページに追加して、ちょっとでも価値を加えようとしてた。これって計算リソースをかなり使うし、スクレイピングの量が多すぎると、時にはDoS攻撃みたいになっちゃうこともあった。リクエストのバーストで埋もれちゃって、インフラが新しい仮想サーバーを立ち上げられないくらいの速さだったんだ。埋もれちゃうと、その負荷から抜け出すのが難しかった。そんな時期にたくさんのことを学んだよ。特に、キューイングや優先順位付けのアプローチが、見た目は良さそうでも、実際には意図しない悪影響を及ぼすことがあるってこと。話し合った戦略の一つは、悪者をブロックするんじゃなくて、来るトラフィックにタグを付けるってことだった。完璧な精度ではできなかったけど、少なくとも実際の顧客には影響を与えないようにできた(ログインしているユーザーなら常にわかるからね)。境界線のケースではデータをキャッシュして、再計算しなくて済むようにできることに気づいたんだ(攻撃してきたのは特にバカなボットで、同じものを何度もリクエストしてきたから)。そこから、データにランダムなファッジファクターを加えることで、攻撃者にとってデータが役に立たない状態にできるかもしれないって考えた。結局、OPが今やっていること、CloudFlareと連携して「攻撃」をできるだけ早く特定して対処することをするようになった。でも、開発者の時間やCFへの支払い、顧客の不満を考えると、かなりのコストがかかったのは間違いない。ちなみに、これがさらにイライラしたのは、攻撃者がうちの競合の契約したサービスだという状況証拠があったから。もし彼らが直接うちに来て話してくれていたら、APIを通じてカタログデータを簡単に取得できるようにして、無駄な計算をしなくて済むようにできたのに。もちろん、彼らは絶対にうちには来ないし、聞かれても認めないだろうから、どうしようもなかった。そんなことがあった時、ここHNで何度も話題に上がった裁判もあった。公的なサイトへのアクセスをブロックするかどうかの問題で、ここでのコンセンサスは「ウェブにサイトを持つなら、リクエストに対応できるようにするのは自分の責任。DoSレベルのトラフィックに耐えられないなら、デザインが悪いのが原因だ」って感じだった。だから、今の態度の変化を見るのは面白いね。

バカな質問だけど、それって自分のボックスのポートも7000個消費しちゃうんじゃないの?

私の個人サイトでも同じ問題があったよ。7、8年前に書いてたブログなんだけど、突然アナリティクスで異常なトラフィックのスパイクが見えたんだ。どこかの記事がバイラルになったのかと思ったけど、あまりにもロボット的で信じられなかった。で、開発者が私のサイトでボットやクローラーをテストしてることに気づいたんだ。何度も何度も優しく頼んでみたけど、全然ダメだった。最終的には、リダイレクトルールを設定して、ランダムなポルノサイトに送るようにしたら、実際に止まったよ。

正直、これが一番のアプローチだと思う。彼らの努力を台無しにする場所にリダイレクトするんだ。自分たちのところか、嫌なもの、誰もクローラーログで見たくないものにね。

Anubisのメイン著者だよ。CloudFlareには、拒否する代わりにHTTP 200レスポンスを返すようにしてもらうといいよ。それでボットが200レスポンスが来るまで叩き続けるのをやめるから。

アプリケーション層に達したら接続を切るだけでも、いい結果が出たよ。CloudFlareに望む動作を最初に返してもらえない場合はね。理想的ではないけど、原始的なボットには効果があるみたい。

オレンジのサイトを完全に辞めたと思ってた。

これを見てるってことは、メインサイトに何か問題があるよ: https://anubis.techaro.lol/

Cloudflareにそれが悪用されてるって伝えれば、アカウント外でブロックしてくれるから、あなたに不利にならないよ。

30Xリダイレクトを試したことがある(それに従う)301レスポンスを、あまり好きじゃない会社がホストしている非常に大きなファイルの選択に対してね。彼らのAWSインスタンスが70000のWindows ISOを並行してダウンロードし始めたら、気づくかも。Cloudflareではやりにくいけど、タールピットも使えるよ。リクエストを受け入れて、レスポンスを1文字ずつ送るんだ(バッファを解放してフラッシュするのを忘れずに)、文字の間に30秒の遅延を入れて。700リクエスト/秒で、例えば10Kbのヘッダー/レスポンスでね。サーバーがそんなに遅いのは残念だね。

あまり好きじゃない会社がホストしている非常に大きなファイルの選択に対して301レスポンスを。アマゾンをおすすめするよ。

「彼らのAWSインスタンスが70000のWindows ISOを同時にダウンロードし始めたら、気づくかもしれない。AWSの受信トラフィックは無料だし。」

リクエストを受け入れて、1文字ずつ返事を送るってことか。なんか、[1] スローロリスDDoS攻撃の逆みたいだね。遅い接続で攻撃する代わりに、遅い接続で防御するって感じ。

ボディにEICARテスト文字列を含む200レスポンスを返してみて。復讐的な楽しみのためにデータポイズニングほどいいものはないよね。 https://en.wikipedia.org/wiki/EICAR_test_file

へへ、SSRの逆利用みたいなことができるんじゃないかって考えてたんだ。ボットを/shutdownにリダイレクトするとか。さらに面白いのは、リダイレクトにEICARテスト文字列を含めて、クラウドプロバイダーのメタデータに送ること。もしかしたら、自動的な侵害検出に引っかかるかもね。

シンガポールの通信規制当局がポルノを禁止(所持することも)、ボットにはソフトコアを出して、規制当局とAWSにメールを送る。

正直、私もそれを試してみると思う。誰かがネット越しにあなたを困らせているとき、最善の返し方は、彼らの地元の法律システムを使うことだよ。他の誰も気にしないからね。

数年前に似たような状況に遭遇したことがある。あなたが言っている規模ではなかったけど、約80MBのソフトウェアインストーラーに対して、異常な数のリクエストが来てた。結局、問題のリクエストを「please-stop.txt」というファイルにリダイレクトして、何が起こっているのかを説明した短いメモを入れて、やめてくれるようにお願いしたんだ。少し時間が経ったら、彼らはやめてくれた。

100%合法な解決策は、彼らを訴えて、Amazonを訴訟の当事者にすることだよ。ディスカバリーを通じて、Amazonから関係者の名前を入手できるけど、Amazonはおそらく彼らをクライアントから外して問題を解決するだろうね。