apacheで堅牢なレート制限(リクエスト|バイト/ IP /ユニット時間)を実装するために利用できる手法やモジュールは何ですか?
回答:
mod_evasive
多くのオンライン推奨事項を取得していますが、2017年半ばの時点で、ブログからすべての参照を奇妙に削除した作者のJonathan Zdziarskiによって放棄されたようですが、ソースコードはまだアップロードとして利用できます。他のプロジェクトは、過去6年間(またはの場合は15年間mod_limitipconn
)更新されていません。
このブログ投稿で述べられているように、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"
mod_security
、Apacheプロジェクトではありません。
Webアプリケーションファイアウォールを含む多くの方法がありますが、Apachemodを使用する場合に実装するのが最も簡単な方法です。
私がお勧めしたいそのような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を使用できなかったのかわかりませんが。
SUSPENDED
状態を使用し、待機中にスレッドを浪費しないことに注意してください。一方、mod_ratelimitは、現時点では、厳密に接続ごとのスレッドです。cf. thread.gmane.org/gmane.comp.apache.cvs/20490
レート制限を行う理由によって異なります。
サーバーの過負荷から保護する場合は、実際にはNGINXをサーバーの前に配置し、そこでレート制限を構成するのが理にかなっています。NGINXは、1万接続あたり数MBのように、はるかに少ないリソースを使用するため、これは理にかなっています。そのため、サーバーがフラッディングした場合、NGINXはレート制限を行い(わずかな量のリソースを使用)、許可されたトラフィックのみをApacheに渡します。
単純さだけが必要な場合は、mod_evasiveのようなものを使用してください。
いつものように、DDoSまたはDoS攻撃から保護する場合は、レート制限もあるCloudflareのようなサービスを使用してください。