apacheで堅牢なレート制限(リクエスト|バイト/ IP /ユニット時間)を実装するために利用できる技術やモジュールは何ですか?
7 に答える
このブログ投稿で述べたように、 mod_securityを使用して 1 秒あたりのレート制限を実装することは可能のようです。
構成は次のようなものです。
SecRuleEngine On
<LocationMatch "^/somepath">
SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>
ErrorDocument 509 "Rate Limit Exceeded"
Web アプリケーション ファイアウォールを含む多くの方法がありますが、Apache mod を使用する場合に最も簡単に実装できます。
私がお勧めしたいそのような mod の 1 つがmod_qosです。これは、特定の DOS、ブルートフォース、スローロリス タイプの攻撃に対して非常に効果的な無料のモジュールです。これにより、サーバーの負荷がかなり軽減されます。
とてもパワフルです。
mod_qosモジュールの現在のリリースでは、以下を管理するための制御メカニズムが実装されています。
ロケーション/リソース (URL) または仮想ホストへの同時要求の最大数。
URL への 1 秒あたりの最大許容リクエスト数や 1 秒あたりのダウンロードキロバイトの最大/最小数などの帯域幅の制限。
1 秒あたりのリクエスト イベントの数を制限します (特別なリクエスト条件)。
- 定義された期間内のリクエスト イベントの数を制限します。
- また、制限なしまたは制限なしで Web サーバーにアクセスする可能性のある非常に重要な人物 (VIP) を検出することもできます。
許可されていない操作を拒否するための一般的な要求行とヘッダー フィルター。
リクエスト本文データの制限とフィルタリング (mod_parp が必要)。
個々のクライアント (IP) の要求イベントの数を制限します。
TCP 接続レベルの制限。たとえば、単一の IP ソース アドレスまたは動的キープアライブ制御から許可される接続の最大数。
- サーバーが空き TCP 接続を使い果たした場合、既知の IP アドレスを優先します。
これは、何に使用できるかのサンプル構成です。ニーズに合わせて何百もの構成が可能です。コントロールの詳細については、サイトをご覧ください。
Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate 120
# limits the connections for this virtual host:
QS_SrvMaxConn 800
# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose 600
# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP 50
# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP 172.18.3.32
QS_SrvMaxConnExcludeIP 192.168.10.
Apache 2.4 には、mod_ratelimitという新しいストック モジュールがあります。モデム速度をエミュレートするには、mod_dialupを使用できます。mod_ratelimit をすべてに使用できなかった理由はわかりませんが。
残念ながら、mod_evasive
prefork 以外の構成で使用すると期待どおりに動作しません (最近の apache セットアップは主に MPM です)。