【入門編】レート制限(Rate Limiting)によるブルートフォース攻撃の緩和 – アプリケーションセキュリティ & 安全な開発防御ガイド

APIを守る最初の砦:レート制限(Rate Limiting)で「泥棒の居座り」を防ごう

こんにちは。セキュリティの世界へようこそ。

今日は、皆さんが作った大切なアプリケーションを「ブルートフォース攻撃(総当たり攻撃)」という泥棒から守るための、もっとも基本的で強力な武器「レート制限(Rate Limiting)」についてお話しします。

「セキュリティ」と聞くと難しく感じるかもしれませんが、まずは皆さんの家の防犯を想像してみてください。

1. なぜ「レート制限」が必要なのか?(家の鍵の例え)

あなたが家に帰ってきて、ドアの鍵を開けようとします。もし、目の前に「1秒間に100回、ありとあらゆる鍵をガチャガチャ試してくる泥棒」がいたらどう思いますか?

普通の人間なら、鍵が合わなければ諦めます。しかし、コンピュータを使った攻撃者は違います。彼らはプログラムを使って、寝ている間も、食事中も、休むことなく数千万通りのパスワードを試し続けます。これが「ブルートフォース攻撃」です。

レート制限とは、「このドアは、1分間に3回までしか鍵を試せませんよ」という制限を設けることです。泥棒が何万回試そうとしても、1分間に3回しかできないのであれば、正しい鍵を見つけるまでに何年もかかってしまいます。これなら、泥棒も諦めて他の家(別の標的)を探しに行きますよね。

2. 攻撃者はどこを狙っているのか?

攻撃者は主に、パスワードを入力する「ログイン画面」や、ユーザー情報を取得する「APIエンドポイント」を狙います。

特にAPIは、人間がブラウザで見る画面とは違い、プログラムから直接リクエストを送るため、攻撃者にとっては「自動化しやすい格好の標的」なんです。何も対策をしていないAPIは、言ってみれば「鍵のかかっていない、誰でも入り放題の裏口」と同じ状態になってしまいます。

3. 実装のステップ:まずはここから始めよう

では、具体的にどうやって制限をかければいいのでしょうか。難しく考える必要はありません。まずは「IPアドレス」と「ユーザーID」で制限をかけるのが基本です。

IPアドレスベースの制限(門番を置く)

一番シンプルなのは、特定のIPアドレス(その家の住人が住んでいるエリアのようなもの)からのリクエスト数に制限をかけることです。

// Node.js (Express) の例:express-rate-limit を使った実装
const rateLimit = require(“express-rate-limit”);

const limiter = rateLimit({
windowMs: 15 60 1000, // 15分間に
max: 100, // 最大100回までリクエストを許可
message: “短時間にリクエストが多すぎます。少し待ってからやり直してください。”,
standardHeaders: true, // レスポンスヘッダーに制限状況を含める
});

// ログインAPIだけに適用する
app.use(“/api/login”, limiter);

なぜヘッダー(Headers)が重要なのか?

上のコードで standardHeaders: true としましたが、これはブラウザやクライアントに対して「今、あと何回リクエストできるか」を伝える親切な仕組みです。

  • X-RateLimit-Limit: 15分間に許容される合計回数
  • X-RateLimit-Remaining: 残り何回リクエストできるか
  • Retry-After: 制限が解除されるまでの待ち時間

これらを返すことで、正当なユーザー(アプリやシステム)は「あ、今ちょっと使いすぎたな。少し休もう」と、自発的にリクエストを控えることができます。

4. 盲点:IPアドレス制限だけでは足りない理由

ここで一つ、セキュリティのプロとしての知見を共有しますね。

IPアドレスだけで制限をかけると、例えば「社内の同じオフィスからアクセスしている全員が、一人のせいで制限を食らってしまう」という問題が起きます。また、攻撃者は複数のIPアドレスを使い分ける(ボットネット)ため、IPだけでは突破されることもあります。

そこで有効なのが「ユーザーID(アカウント)単位での制限」です。

特定のユーザーIDに対して「1時間で5回パスワードを間違えたら、そのアカウントは30分間ロックする」といったロジックを加えることで、たとえ攻撃者がIPを変えて攻撃しても、特定のアカウントを守り抜くことができます。

5. 一歩ずつ、確実に進もう

レート制限は、セキュリティ対策の「最初の一歩」でありながら、非常に高い効果を発揮します。

1. まずは重要なAPIを特定する(ログイン、会員登録、パスワードリセットなど)
2. レート制限のライブラリを入れる(何でも自分で作ろうとせず、信頼できるライブラリを使いましょう)
3. しきい値を設定する(最初は緩めに設定し、ログを見ながら徐々に厳しくしていくのがコツです)

セキュリティに完璧はありません。ですが、鍵をかけ、制限を設けることで、泥棒にとって「割に合わないターゲット」になることはできます。

皆さんが作った素晴らしいサービスを、悪意ある攻撃から守るために。まずは今日から、APIに「制限」という名の鍵をかけてみませんか?

一歩ずつ、着実に。そうすれば、必ずアプリケーションはより強固で安心できる場所になりますよ。応援しています!

コメント

タイトルとURLをコピーしました