Apacheで堅牢なレート制限(リクエスト|バイト/ IP /ユニット時間)を実装するために利用できる技術やモジュールは何ですか?
このブログ 投稿で述べたように、 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 です。これは、certin DOS、Bruteforce、Slowlorisタイプの攻撃に対して非常に効果的な無料のモジュールです。これにより、サーバーの負荷がかなり軽減されます。
非常に強力です。
mod_qosモジュールの現在のリリースでは、管理するための制御メカニズムが実装されています。
ロケーション/リソース(URL)または仮想ホストへの同時リクエストの最大数。
URLへの1秒あたりの最大許容リクエスト数や1秒あたりのダウンロードされたキロバイトの最大/最小などの帯域幅の制限。
1秒あたりのリクエストイベントの数を制限します(特別なリクエスト条件)。
不正な操作を拒否するための一般的な要求行とヘッダーフィルター。
ボディデータの制限とフィルタリングを要求します(mod_parpが必要です)。
個々のクライアント(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
プリフォーク以外の構成で使用すると、期待どおりに動作しません(最近のApacheセットアップは主にMPMです)
レート制限を行う理由によって異なります。
サーバーの過負荷を防ぐために、実際にはNGINXをサーバーの前に置き、そこに レート制限 を設定するのが理にかなっています。 NGINXが使用するリソースははるかに少なく、1万接続あたり数MBのようなものなので、それは理にかなっています。そのため、サーバーがフラッディングされた場合、NGINXはレート制限を行い(わずかな量のリソースを使用)、許可されたトラフィックのみをApacheに渡します。
単純なものが必要な場合は、mod_evasiveなどを使用します。
いつものように、DDoSまたはDoS攻撃から保護する場合は、レート制限もあるCloudflareのようなサービスを使用します。
Apache 2.4 mod_ratelimit をご覧ください。
クライアントの帯域幅を制限するRATE_LIMITという名前のフィルターを提供します。スロットリングは、各HTTP応答がクライアントに転送される間に適用され、IP /クライアントレベルで集約されません。シミュレートする接続速度は、環境変数rate-limitを使用して、KiB/sで指定されます。
<Location "/downloads">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400
SetEnv rate-initial-burst 512
</Location>