タスクは、ApacheまたはFastCGI Webサーバーのフロントエンドとして機能するngx_http_limit_req_module [ 1 ]モジュールを使用して、またはWebサーバーの前でロードバランサーとして機能するHAProxy [ 2、3 ]を使用してNginxに実装できます。
どちらの場合も、アルゴリズムは次のとおりです。 認証中、ブラウザはサブストリング「/wp-login.php」を含むアドレスにアクセスします。 それを追跡し、他のすべてのアドレスへの呼び出しに影響を与えずに、1つのIPからの要求の数を制限する必要があります。 ブロッキングパラメータは、通常のユーザーに不便をもたらさないように選択する必要があります。 1つのIPアドレスからの多数のユーザーが認証フォームを使用する場合は、特にブロッキングを構成する必要があります。
メソッド番号1:Nginx
構成ファイルは、コメントのヒントに従って修正されます。 VBartとJ_o_k_e_Rに感謝します!
http { <...> limit_req_zone $binary_remote_addr zone=login:10m rate=15r/m; server { listen 80; server_name frontend.example.org; location ~* /wp-login.php { limit_req zone=login burst=4; proxy_pass http://backend:8080; <...> } location / { proxy_pass http://backend:8080; <...> } }
ブロックオプション:
limit_req_zone $ binary_remote_addr zone = login:10m rate = 15r / m; さまざまなIPアドレスの状態を保存する共有メモリゾーンのパラメーターを設定します。 この場合、状態は10メガバイトのサイズの「ログイン」ゾーンに保存され、このゾーンの平均リクエスト処理速度は1分あたり15リクエストを超えることはできません。 処理速度は、1秒あたりのリクエスト数(r / s)または1分あたりのリクエスト数(r / m)で設定できます。
limit_req zone =ログインバースト= 4; ログインゾーンとリクエストの最大バーストサイズ(バースト)を設定します。 要求の受信速度がゾーンに記述されている速度を超える場合、要求が所定の速度で処理されるように処理が遅延します。 過剰な要求は、その数が最大バーストサイズを超えるまで遅延されます。 超過した場合、要求はエラー503で終了します。
メソッド番号2:HAProxy
ブログを提供するバックエンドセクションで、次の行を追加します[ 2 ]。
tcp-request inspect-delay 10s tcp-request content accept if HTTP # brute force protection acl wp_login path_beg -i /wp-login.php stick-table type binary len 20 size 500 store http_req_rate(20s) peers local tcp-request content track-sc2 base32+src if METH_POST wp_login stick store-request base32+src if METH_POST wp_login acl bruteforce_detection sc2_http_req_rate gt 5 acl flag_bruteforce sc1_inc_gpc0 gt 0 http-request deny if bruteforce_detection flag_bruteforce
/wp-login.phpページへのPOSTリクエストが見つかると、HTTPホストヘッダー、URLパス、ソースIPの3つの要素のハッシュが保存されます。 ハッシュによって識別されるユーザーは、20秒で5つのリクエストを行うことができます。 6番目の要求はブロックされます。
文学
- ngx_http_limit_req_module モジュール -nginx.org
- ワードプレスCMS HAProxyによるブルートフォース保護 -blog.haproxy.com
- HAProxyを使用したすべてのユーザーのレート制限の改善 -blog.serverfault.com