
私は最新バージョンの Joomla で複数のログイン失敗を検出してブロックするための Mod_Security ルールを探して作成しようとしています。2015 年 3 月の回答をここで見つけました:https://serverfault.com/a/646608/960638しかし、私自身のテストでは、ログイン失敗は検出されませんでした。ログ記録を有効にしても、何も検出されません。コードが古くなっているのではないかと思います。
IT Octopusが公開した別のModSecルールを見つけました。https://www.itoctopus.com/a-modsecurity-rule-to-block-brute-force-attacks-on-a-joomla-website コードは以下の通りです。サーバーでテストしてみましたが、あまりにも敏感すぎて、Joomlaにログインしてログアウトした後にブロックされてしまいました(正しい資格)。
<Location /administrator>
SecDefaultAction phase:2,deny,status:403,log,auditlog
SecRule IP:bf_counter "@eq 5" "id:1000002,phase:2,log,block,expirevar:IP.bf_counter=3600,msg:'IP address blocked because of a suspected brute force attack on the Joomla website'"
SecRule ARGS:option "@streq com_login" "id:1000000,phase:2,chain,t:none,log,pass,msg:'Multiple Joomla authentication failures from IP address', setvar:IP.bf_counter=+1"
</Location>
次に、ModSecurityルールを見つけました。http://artefact.io/brute-force-protection-modsecurity/これは私が何ヶ月もの間自分のサーバーで使用してきたものです。昨日バグが見つかるまでは、本当にうまく機能していました。あるクライアントは 10 個の Joomla Web サイトを持っていて、正しい認証情報でログインすると IP が制限されることがわかりました。私は自分のテストでこれを再現することができました。したがって、以下のコードはこれまで見つけた中で最高のコードですが、com_login / login 行はログイン失敗とログイン成功を区別していないようです。これは一般的なブルート フォース攻撃を防ぐのに有効ですが、クライアントが多数の Joomla サイトを持っていて、複数のインストールに同時に正当にアクセスする場合は機能しません。これがコードです。
# Joomla Brute Force
SecAction "phase:1,pass,setvar:TX.max_requests=6,setvar:TX.requests_ttl=180,setvar:TX.block_ttl=900,initcol:ip=%{REMOTE_ADDR},nolog,id:5001000"
<LocationMatch "/administrator/index.php">
SecAction "phase:2,chain,nolog,id:5001022"
SecRule REQUEST_METHOD "^POST$" "chain"
SecRule ARGS_POST_NAMES "^username$" "chain"
SecRule ARGS_POST_NAMES "^passwd$" "chain"
SecRule ARGS_POST:option "^com_login$" "chain"
SecRule ARGS_POST:task "^login$" "chain"
SecAction "setvar:ip.request_count=+1,expirevar:ip.request_count=%{TX.requests_ttl}"
SecRule IP:request_count "@ge %{TX.max_requests}" "phase:2,drop,setvar:ip.blocked=1,expirevar:ip.blocked=%{TX.block_ttl},log,msg:'Joomla brute force. Blocking for %{TX.block_ttl} seconds',id:5001023"
</LocationMatch>
最後に、私は「ログインが成功すると P3P ヘッダーが返される」ことを示唆する投稿をいくつか読みましたが、これは ModSecurity ルールで使用できる可能性があります。これは @godzillante によってここで提案されました:https://serverfault.com/a/646608/960638
ModSecurity フェーズ 5 (ログ ファイルの分析) を使用しているため、これがデメリットかどうかはわかりません。さらに重要なのは、私のテストでは動作させることができなかったことです。ログ記録を有効にしても、失敗したログインが検出されず、アクセスが制限されませんでした。コードは次のとおりです。
SecAction phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},id:5000144
<Locationmatch "/administrator/index.php">
SecRule ip:bf_block "@gt 0" "deny,status:401,log,id:5000145,msg:'ip address blocked for 5 minutes, more than 5 login attempts in 3 minutes.'"
SecRule RESPONSE_HEADERS:P3P "streq 0" "phase:5,t:none,nolog,pass,setvar:ip.bf_counter=0,id:5000146"
SecRule RESPONSE_HEADERS:P3P "!streq 0" "phase:5,chain,t:none,nolog,pass,setvar:ip.bf_counter=+1,deprecatevar:ip.bf_counter=1/180,id:5000147"
SecRule ip:bf_counter "@gt 5" "t:none,setvar:ip.bf_block=1,expirevar:ip.bf_block=300,setvar:ip.bf_counter=0"
</locationmatch>
ここでの私の目的は、コード「Joomla Brute Force」(上記) を改善することです。このコードはブルート フォース フラッディングをブロックしますが、残念ながら、ユーザーが Joomla に正当にログインしているときにもブロックされてしまいます。Joomla へのログイン失敗とログイン成功を区別できるコードが必要です。私はしばらくこの作業に取り組んできたので、ここでコミュニティに連絡しています。よろしくお願いします。