web-dev-qa-db-ja.com

Apacheでレート制限を実装するにはどうすればよいですか? (1秒あたりのリクエスト)

Apacheで堅牢なレート制限(リクエスト|バイト/ IP /ユニット時間)を実装するために利用できる技術やモジュールは何ですか?

77
bd808

最高の

  • mod_evasive (DoS暴露の低減に重点を置いています)
  • mod_cband (「通常の」帯域幅制御に最適)

そして残り

53
Vinko Vrsalovic

このブログ 投稿で述べたように、 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"
18
Diego F. Durán

Webアプリケーションファイアウォールを含む多くの方法がありますが、Apache modを使用する場合は最も簡単に実装できます。

私が推奨したいこのようなmodの1つは、 mod_qos です。これは、certin DOS、Bruteforce、Slowlorisタイプの攻撃に対して非常に効果的な無料のモジュールです。これにより、サーバーの負荷がかなり軽減されます。

非常に強力です

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.

http://opensource.adnovum.ch/mod_qos/

10
Panama Jack

Apache 2.4には、 mod_ratelimit と呼ばれる新しいストックモジュールがあります。モデムの速度をエミュレートするには、 mod_dialup を使用できます。なぜmod_ratelimitをすべてに使用できなかったのかはわかりませんが。

6
Janus Troelsen

悲しいことに、mod_evasiveプリフォーク以外の構成で使用すると、期待どおりに動作しません(最近のApacheセットアップは主にMPMです)

5
wuzer

もう1つのオプション-mod_qos

構成が簡単ではありませんが、強力です。

http://opensource.adnovum.ch/mod_qos/

2
mrT

レート制限を行う理由によって異なります。

サーバーの過負荷を防ぐために、実際にはNGINXをサーバーの前に置き、そこに レート制限 を設定するのが理にかなっています。 NGINXが使用するリソースははるかに少なく、1万接続あたり数MBのようなものなので、それは理にかなっています。そのため、サーバーがフラッディングされた場合、NGINXはレート制限を行い(わずかな量のリソースを使用)、許可されたトラフィックのみをApacheに渡します。

単純なものが必要な場合は、mod_evasiveなどを使用します。

いつものように、DDoSまたはDoS攻撃から保護する場合は、レート制限もあるCloudflareのようなサービスを使用します。

1
NerdOfLinux

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>
0
freedev