| 単位 | 説明 |
|---|---|
| IPアドレス | 送信元IPごとにリクエスト数を制限する |
| APIキー | 発行したキーごとにリクエスト数を制限する |
| ユーザーID | 認証済みユーザーごとにリクエスト数を制限する |
| セッション | セッションIDごとにリクエスト数を制限する |
| アルゴリズム | 動作 |
|---|---|
| Token Bucket | トークンを一定速度で補充し、リクエストごとにトークンを消費する。バースト許容。 |
| Leaky Bucket | リクエストをキューに格納し、一定速度で処理する。出力レートが一定。 |
| Fixed Window | 固定時間枠(例:1分間)内でリクエスト数をカウントする。境界でリセット。 |
| Sliding Window | 移動する時間枠内でリクエスト数をカウントする。境界問題を緩和。 |
- 制限超過時は HTTPステータスコード
429 Too Many Requestsを返却する Retry-Afterヘッダーで再試行可能までの秒数を通知する- レスポンスボディにエラー理由を含める
- 同一リクエストに対する処理を省略し、オリジンサーバーの負荷を削減する
- キャッシュヒット時はオリジンへの通信が発生しないため、計算リソースとデータ転送コストを削減する
| 対象 | 理由 |
|---|---|
| 静的ファイル(画像、CSS、JS) | 内容が変化しない |
| 読み取り専用APIレスポンス | 一定期間内で結果が同一 |
| 生成コストが高いコンテンツ | 再生成の回避による負荷削減 |
| ヘッダー | 用途 |
|---|---|
| Cache-Control | キャッシュの有効期間と動作を指定 |
| ETag | コンテンツのバージョン識別子 |
| Last-Modified | 最終更新日時 |
| 条件 | 説明 |
|---|---|
| IPアドレス/CIDR | 特定のIP範囲を許可または拒否 |
| 地理的位置 | IPアドレスから推定した国・地域による制御 |
| リクエストパターン | URL、ヘッダー、ボディの内容によるマッチング |
| リクエストレート | 単位時間あたりのリクエスト数による制御 |
| アクション | 説明 |
|---|---|
| 許可(Allow) | リクエストを通過させる |
| 拒否(Block) | リクエストを遮断し、エラーレスポンスを返す |
| チャレンジ(Challenge) | CAPTCHA等の検証を要求する |
| カウント(Count) | 統計目的で記録のみ行い、通過させる |
| 手法 | 説明 |
|---|---|
| シグネチャベース | 既知のボットのUser-Agent文字列やIPアドレスと照合する |
| 行動分析 | マウス移動、スクロール、クリックパターンを分析する |
| ブラウザフィンガープリンティング | ブラウザの特性(画面解像度、プラグイン、フォント等)を収集し識別する |
| JavaScriptチャレンジ | JavaScriptの実行を要求し、実行不可のクライアントを検出する |
| レート異常検出 | 人間の操作速度を超えるリクエスト頻度を検出する |
| 指標 | 異常パターン |
|---|---|
| リクエスト間隔 | 一定間隔での連続リクエスト |
| セッション内ページ遷移 | 人間の閲覧パターンと異なる遷移順序 |
| フォーム入力速度 | 人間の入力速度を超える送信 |
| JavaScript実行結果 | 期待される結果と異なる応答 |
- リクエスト元を識別し、匿名アクセスを制限する
- 識別されたクライアントごとに使用量を追跡・制限する
| 項目 | 説明 |
|---|---|
| クォータ | 一定期間内の総リクエスト数上限 |
| スロットリング | 単位時間あたりのリクエスト数上限 |
| 許可エンドポイント | アクセス可能なAPIパスの制限 |
| 許可メソッド | 使用可能なHTTPメソッドの制限 |
| 対象 | 説明 |
|---|---|
| 同時接続数 | 同時に処理可能なコネクション数の上限 |
| ワーカー/プロセス数 | リクエスト処理に使用するプロセス数の上限 |
| メモリ使用量 | アプリケーションが使用可能なメモリの上限 |
| スケールアウト上限 | 自動スケーリング時のインスタンス数上限 |
- 大量アクセス時にリソース消費が無制限に増加することを防止する
- コストの上限を予測可能にする
| 対象 | 説明 |
|---|---|
| リクエスト数 | 総リクエスト数、エンドポイント別リクエスト数 |
| データ転送量 | インバウンド/アウトバウンドの転送バイト数 |
| 計算リソース使用量 | CPU時間、メモリ使用量、実行時間 |
| 課金額 | 実際の発生コストまたは推定コスト |
| 条件タイプ | 説明 |
|---|---|
| 閾値超過 | 設定値を超えた時点で通知 |
| 異常検出 | 過去のパターンから逸脱した場合に通知 |
| 予測ベース | 現在の傾向から期間終了時の値を予測し、閾値超過が見込まれる場合に通知 |
[クライアント]
│
▼
[エッジ/CDN層]
- キャッシュ
- 地理的フィルタリング
- DDoS緩和
│
▼
[WAF層]
- リクエストフィルタリング
- レート制限
- ボット検出
│
▼
[ロードバランサー層]
- 接続数制限
- ヘルスチェック
│
▼
[アプリケーション層]
- 認証・認可
- ビジネスロジックレベルの検証
- APIキー検証
│
▼
[データ層]
- コネクションプール制限
- クエリタイムアウト
- 各レイヤーで独立した防御を実装する
- 外側のレイヤーで可能な限り不正リクエストを遮断し、内側のレイヤーへの負荷を軽減する
- 単一レイヤーの突破が全体の突破につながらないようにする
| 項目 | 用途 |
|---|---|
| タイムスタンプ | 時系列分析、パターン検出 |
| 送信元IPアドレス | 発生源の特定、IPベースの制限判断 |
| User-Agent | クライアント種別の識別 |
| リクエストパス | 攻撃対象エンドポイントの特定 |
| レスポンスステータス | エラー率の監視 |
| レスポンス時間 | パフォーマンス影響の測定 |
| リクエストサイズ/レスポンスサイズ | 転送量の追跡 |
| 観点 | 説明 |
|---|---|
| 時間帯別トラフィック | 異常な時間帯のアクセス増加を検出 |
| IP別リクエスト分布 | 特定IPへの集中を検出 |
| エンドポイント別負荷 | 攻撃対象となっているパスを特定 |
| エラー率推移 | ブルートフォース攻撃等の兆候を検出 |
| トリガー | アクション |
|---|---|
| 単一IPからの異常リクエスト数 | 当該IPを一時的にブロックリストに追加 |
| 特定エンドポイントへの集中アクセス | 当該エンドポイントのレート制限を強化 |
| コスト閾値超過 | スケールアウトを停止、管理者へ通知 |
| 認証失敗の連続 | 当該アカウントまたはIPをロックアウト |
- 誤検知による正規ユーザーへの影響を最小化するため、一時的な制限から開始する
- 自動対応の実行をログに記録し、事後検証を可能にする
- 自動対応の解除条件を明確に定義する