はじめに
AWS SAAの勉強中にCloudFrontのキャッシュヒット率を向上させる方法を知りました。
それをきっかけにキャッシュバイパスを利用したDDoSというものを知り、調べたのですが記事がほとんどヒットしなかったので今回記事を作成しました。
キャッシュバイパスを利用したDDoS攻撃とは
キャッシュをヒットさせずに直接オリジンにリクエストを送りまくる攻撃のことです。
例えば、CDNのキャッシュ対象が
https://example.com/api/products
だったとして、攻撃者が以下のようにリクエストを送ったとします。
https://example.com/api/products?x=1
https://example.com/api/products?x=2
https://example.com/api/products?x=3
すると、x=1やx=2というクエリパラメータはこのアプリに関係のないパラメータなので、上の三つのリクエストは全てhttps://example.com/api/productsと同じ結果を返します。
ですが、URL全体をキャッシュキーとして扱っている場合、別のリクエストとして受け取ってしまうので、キャッシュではなくオリジンにアクセスして結果を返してしまいます。
このリクエストをxの値を変えて大量にリクエストを送ると、キャッシュがないので直接オリジンサーバーに行き、オリジンサーバーに負荷がかかり、DoS状態になります。
対策方法
- オリジンが返すオブジェクトのバージョンが実際に変化する(一意のオブジェクトを返す)パラメータのみを転送するように設定する
- 不要なクエリパラメータを削除する
参考文献
おわりに
実際のプロダクトではこれが対策されているのか気になりました。
クエリパラメータごとにキャッシュを残すのであればかなり不便な気がするのでやってない方がおかしいのではと思います。WAFとかが勝手にやってくれるのかな。
