レートリミッターはセキュリティ対策ではない
ボットが私のAPIから、わずか数分で1つのパスポートに関するすべてのデータを抜き取りました。
私のレートリミッターはそれを阻止できませんでした。
上限は月間3,000コールでした。パスポートの全スキャンにはわずか195コールしか必要ありません。ボットは制限の範囲内に収めながら、すべてを盗み出しました。
レートリミッティングはインフラコストを守るためのものです。データそのものを守るものではありません。
この2つの概念を混同すると、データ漏洩を招きます。
レートリミッターが問うのは、たった一つの質問です。「このクライアントは、今、私に多すぎるコストを強いていないか?」
スクレイパーは意図的にそのラインを下回るように動きます。私のケースでは、スクレイパーは毎分25リクエストのペースで動作していました。これは極めて微量な負荷です。データセット全体をコピーするには、わずか40,000コールあれば十分でした。ハッカーが大量の無料アカウントを使用すれば、いかなるボリューム制限も彼らを捕らえることはできません。
ボリューム(量)を見るのをやめましょう。アイデンティティ、カバレッジ、そしてパターンを見るのです。
私には2つのミスがありました。第一に、ソースIPをログに記録していなかったことです。これでは、ハッカーがまた無料で登録し直すだけで済みます。
まずはログを修正してください。データベースにIPと国のカラムを追加しましょう。リモートアドレスではなく、Cloudflareから取得できる実際のクライアントIPを使用してください。これにより、ネットワークレイヤーで攻撃者をブロックできるようになります。
第二に、制限の設定を変更してください。
単に月間のリクエスト数を制限するだけでは不十分です。1つのパスポートが1日にチェックできる「異なる宛先」の数を制限してください。実際のユーザーは数カ所の宛先しかチェックしませんが、スクレイパーはすべてをチェックしようとします。
データの一括取得(データスイープ)には、特有のシグネチャ(特徴)があります:
- 高密度である。
- 連続的である。
- 1つのソースに対してすべてを網羅している。
アクティビティのスライディングウィンドウを確認することで、このパターンを検出できます。もし1つのパスポートが短時間にあまりにも多くの宛先にアクセスした場合は、フラグを立ててください。そのキーのレートを絞る(スロットリング)か、即座にブロックしてください。
これで、単に数字を数えるのではなく、振る舞いに反応できるようになります。
戦略を2つの役割に分けて考えましょう:
- Rate Limiter: お金を守る。キーごとのボリューム制限を使用する。
- Extraction Defense: データを守る。アイデンティティ、カバレッジ、ケイデンス(周期)を使用する。
レートリミッターしか持っていないのであれば、それは単なる「請求額のガードレール」に過ぎません。セキュリティではありません。
Source: https://dev.to/mathis_higuinen_6db9b244c/your-rate-limiter-is-not-a-security-control-4b3f
