レートリミッターはセキュリティ対策ではない

ボットが私のAPIから、わずか数分で1つのパスポートに関するすべてのデータを抜き取りました。

私のレートリミッターはそれを阻止できませんでした。

上限は月間3,000コールでした。パスポートの全スキャンにはわずか195コールしか必要ありません。ボットは制限の範囲内に収めながら、すべてを盗み出しました。

レートリミッティングはインフラコストを守るためのものです。データそのものを守るものではありません。

この2つの概念を混同すると、データ漏洩を招きます。

レートリミッターが問うのは、たった一つの質問です。「このクライアントは、今、私に多すぎるコストを強いていないか?」

スクレイパーは意図的にそのラインを下回るように動きます。私のケースでは、スクレイパーは毎分25リクエストのペースで動作していました。これは極めて微量な負荷です。データセット全体をコピーするには、わずか40,000コールあれば十分でした。ハッカーが大量の無料アカウントを使用すれば、いかなるボリューム制限も彼らを捕らえることはできません。

ボリューム(量)を見るのをやめましょう。アイデンティティ、カバレッジ、そしてパターンを見るのです。

私には2つのミスがありました。第一に、ソースIPをログに記録していなかったことです。これでは、ハッカーがまた無料で登録し直すだけで済みます。

まずはログを修正してください。データベースにIPと国のカラムを追加しましょう。リモートアドレスではなく、Cloudflareから取得できる実際のクライアントIPを使用してください。これにより、ネットワークレイヤーで攻撃者をブロックできるようになります。

第二に、制限の設定を変更してください。

単に月間のリクエスト数を制限するだけでは不十分です。1つのパスポートが1日にチェックできる「異なる宛先」の数を制限してください。実際のユーザーは数カ所の宛先しかチェックしませんが、スクレイパーはすべてをチェックしようとします。

データの一括取得(データスイープ)には、特有のシグネチャ(特徴)があります:

  • 高密度である。
  • 連続的である。
  • 1つのソースに対してすべてを網羅している。

アクティビティのスライディングウィンドウを確認することで、このパターンを検出できます。もし1つのパスポートが短時間にあまりにも多くの宛先にアクセスした場合は、フラグを立ててください。そのキーのレートを絞る(スロットリング)か、即座にブロックしてください。

これで、単に数字を数えるのではなく、振る舞いに反応できるようになります。

戦略を2つの役割に分けて考えましょう:

  1. Rate Limiter: お金を守る。キーごとのボリューム制限を使用する。
  2. Extraction Defense: データを守る。アイデンティティ、カバレッジ、ケイデンス(周期)を使用する。

レートリミッターしか持っていないのであれば、それは単なる「請求額のガードレール」に過ぎません。セキュリティではありません。

Source: https://dev.to/mathis_higuinen_6db9b244c/your-rate-limiter-is-not-a-security-control-4b3f