Brute force rules for mod security

Привет отново!

В продължение на предния ми пост за оптимизация на WHM сървъри, сега ще споделя и как се защитавам срещу brute force атаки към wordpress сайтове, хостнати на WHM сървър, с помощта на modsecurity!

За целта е нужно първо да имаме инсталиран modsecurity с активиран OWASP ModSecurity Core Rule Set V3.0.

Правилата се добавят от : Home »Security Center »ModSecurity™ Tools »Rules List - Add Rule

#Block WP logins with no referring URL
<Locationmatch "/wp-login.php">
SecRule REQUEST_METHOD "POST"  "deny,status:401,id:5000130,chain,msg:'wp-login request blocked, no referer'"
SecRule &HTTP_REFERER "@eq 0"
</Locationmatch>

#Wordpress Brute Force detection
SecAction phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},id:5000134
<Locationmatch "/wp-login.php">
# Setup brute force detection.
# React if block flag has been set.
SecRule ip:bf_block "@gt 0" "deny,status:401,log,id:5000135,msg:'ip address blocked for 5 minutes, more than 10 login attempts in 3 minutes.'"
# Setup Tracking.  On a successful login, a 302 redirect is performed, a 200 indicates login failed.
SecRule RESPONSE_STATUS "^302" "phase:5,t:none,nolog,pass,setvar:ip.bf_counter=0,id:5000136"
SecRule RESPONSE_STATUS "^200" "phase:5,chain,t:none,nolog,pass,setvar:ip.bf_counter=+1,deprecatevar:ip.bf_counter=1/180,id:5000137"
SecRule ip:bf_counter "@gt 10" "t:none,setvar:ip.bf_block=1,expirevar:ip.bf_block=900,setvar:ip.bf_counter=0"
</locationmatch>
#900 = block for 15 minutes

# check bots by user agent and match to included file
# block bad bots
#SecRule REQUEST_HEADERS:User-Agent "@pmFromFile /etc/apache2/conf.d/blackbots.txt" "id:980001,rev:1,severity:2,log,msg:'Bot Rule: Black Bot detected.'"

#XMLRPC block
SecRule REQUEST_LINE "POST .*xmlrpc.*" "pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.maxlimit=+1,deprecatevar:ip.maxlimit=1/600,nolog,id:350201"
SecRule IP:MAXLIMIT "@gt 10" "log,deny,id:350202,msg:'wp-xmlrpc: denying %{REMOTE_ADDR} (%{ip.maxlimit} connection attempts)'"

Следва рестарт на apache сървъра и тест дали работят правилата. Резултата при мен след няколко неуспешни опита за влизане във /wp-login.php беше следния :

[Thu Mar 29 20:56:41.299561 2018] [:error] [pid 25498:tid 140498557667072] [client 87.97.123.123:36841] [client 87.97.123.123] ModSecurity: Access denied with code 401 (phase 2). Operator GT matched 0 at IP:bf_block. [file "/etc/apache2/conf.d/modsec/modsec2.user.conf"] [line "37"] [id "5000135"] [msg "ip address blocked for 5 minutes, more than 10 login attempts in 3 minutes."] [hostname "qksite.com"] [uri "/wp-login.php"] [unique_id "Wr1E@aRFYAyVlLe-TFRsggAAAZI"], referer: http://qksite.com/wp-login.php

Същата работа е и със заявките към /xmlrpc.php

Да подчертая, горните са правила са няколко на брой, и може да се окажат доста чуствителни! Хубаво е да се изтестват едно по едно преди да се сложат на продукшън среда!

Това е! 🙂