Nginx レート制限設定
Nginxでリクエストのレートリミットを実装し、APIやログインエンドポイントをDDoS攻撃、ブルートフォースログイン試行、リソース悪用から保護する方法を解説。
詳細な説明
レート制限は、指定された時間枠内にクライアントが送信できるリクエスト数を制御します。サーバーを不正利用、ブルートフォースログイン攻撃、過度なAPI使用から保護するために不可欠です。
レート制限ゾーンの定義
http ブロックの limit_req_zone ディレクティブでレート制限を設定します。キーごとのリクエストレートを追跡する共有メモリゾーンを定義します。
http {
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
}
$binary_remote_addr キーはクライアントIPごとに制限を適用します。ゾーンサイズ 10m で約160,000のユニークIPアドレスを同時に追跡できます。
レート制限の適用
location ブロック内で limit_req ディレクティブにより設定した制限を適用します:
location /api/ {
limit_req zone=general burst=20 nodelay;
proxy_pass http://backend;
}
location /login {
limit_req zone=login burst=5;
proxy_pass http://backend;
}
BurstとNodelay
burst パラメータは、Nginxが拒否を開始する前に定義レートを超える一時的なスパイクを許可します。nodelay なしの場合、バースト許容量内の超過リクエストはキューに入り定義レートで処理され、遅延が生じます。nodelay ありの場合、バーストリクエストは即座に処理され、バーストバケットが枯渇した後のリクエストにレート制限が適用されます。
カスタムエラーレスポンス
デフォルトではレート制限されたリクエストは503ステータスコードを受け取ります。limit_req_status でより適切なレスポンスにカスタマイズできます:
limit_req_status 429;
これにより429 Too Many Requestsが返され、APIクライアントや監視ツールが適切に処理できます。
ログ
limit_req_log_level でレート制限されたリクエストのログレベルを制御します。warn に設定すると、持続的な攻撃時のエラーログの肥大化を防ぎつつ、レート制限の活動を可視化できます。
複数のレート制限
同じlocationに複数のレート制限を適用して多層防御を実現できます。例えば、IPごとの制限とサーバー全体の制限を組み合わせます。
信頼されたIPのホワイトリスト
geo ブロックを使用して、内部監視サービス、ヘルスチェックプローブ、オフィスVPNアドレスなどの信頼されたIPアドレスをレート制限から除外できます。
ユースケース
公開APIやログインエンドポイントを運用し、ブルートフォースパスワード攻撃や毎秒数千リクエストを送信する悪意あるクライアントから保護する必要があります。