среда, 3 декабря 2014 г.

Защита от брутфорса WordPress, Joomla на шаред хостинге с помощью fail2ban

Понадобилось блокировать особо любопытных, написал пару правил.

Защита от брутфорса для сайтов на базе CMS WordPress:

Создадим файл с регексом для фильтрации попытки логина в админку:
# cat /etc/fail2ban/filter.d/bruteforce_wp.conf
[Definition]
failregex = ^<HOST> - - .* "POST /wp-login.php
ignoreregex = 

Проверим сразу попадают ли запросы под наше правило:
# fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/bruteforce_wp.conf
Running tests
=============
Use   failregex file : /etc/fail2ban/filter.d/bruteforce_wp.conf
Use         log file : /var/log/nginx/access.log

Results
=======
Failregex: 122795 total
|-  #) [# of hits] regular expression
|   1) [122795] ^<HOST> - - .* "POST /wp-login.php
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [790258] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 790258 lines, 0 ignored, 122795 matched, 667463 missed
Missed line(s): too many to print.  Use --print-all-missed to print all 667463 lines

Как видим, 123 тысячи запросов попадают под данное правило, а значит и будем блокировать таким способом.



И добавим секцию для нашего фильтра в jail.local:
# vim /etc/fail2ban/jail.local
[bruteforce_wp]
enabled = true
bantime = 3600
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
filter = bruteforce_wp
logpath = /var/log/nginx/access.log
maxretry = 5

Т.е. при 5 неправильных логинах залочим IP-адрес на час. Это должно успокоить особо активных.


Защита от брутфорса для сайтов на базе CMS Joomla:

Создадим фильтр:
# cat /etc/fail2ban/filter.d/bruteforce_joomla.conf
[Definition]
failregex = ^<HOST> - - .*/administrator/index.php
ignoreregex = 

Проверим:
# fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/bruteforce_joomla.conf
Running tests
=============
Use   failregex file : /etc/fail2ban/filter.d/bruteforce_joomla.conf
Use         log file : /var/log/nginx/access.log

Results
=======
Failregex: 36528 total
|-  #) [# of hits] regular expression
|   1) [36528] ^<HOST> - - .*/administrator/index.php
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [792266] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 792266 lines, 0 ignored, 36528 matched, 755738 missed
Missed line(s): too many to print.  Use --print-all-missed to print all 755738 lines

Теперь попадет 36 тысяч запросов.

И добавим секцию в jail.local:
# vim /etc/fail2ban/jail.local
[bruteforce_joomla]
enabled = false
bantime = 3600
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
filter = bruteforce_joomla
logpath = /var/log/nginx/access.log
maxretry = 5

После всех этих изменений перезапустим наш сервер fail2ban:
# /etc/init.d/fail2ban restart

Проверим подгрузились ли наши фильтры:
# /etc/init.d/fail2ban status
fail2ban-server (pid  688487) выполняется...
Status
|- Number of jail: 3
`- Jail list: bruteforce_joomla, bruteforce_wp, ssh-iptables

То, что надо 3 фильтра: ssh (по умолчанию), брутфорс WP и Joomla.

Минут через 10 проверим эффективность для наших новых фильтров:
# fail2ban-client status bruteforce_wp
Status for the jail: bruteforce_wp
|- filter
|  |- File list: /var/log/nginx/access.log
|  |- Currently failed: 8
|  `- Total failed: 22
`- action
   |- Currently banned: 2
   |  `- IP list: 109.86.15.97 94.138.171.124
   `- Total banned: 2

# fail2ban-client status bruteforce_joomla
Status for the jail: bruteforce_joomla
|- filter
|  |- File list: /var/log/nginx/access.log
|  |- Currently failed: 5
|  `- Total failed: 1658
`- action
   |- Currently banned: 4
   |  `- IP list: 134.249.50.47 79.148.245.79 94.153.8.248 109.86.15.95
   `- Total banned: 4

Как видим, фильтры работают и за 10 минут успели заблокировать примерно 1700 запросов к админкам сайтов.

3 комментария:

  1. Спасибо автору, за инструкцию, у меня, правда, не было атак на сайт, но думаю когда-нибудь пригодится. Всегда нужно знать как защититься от посягательства. Будет ли конфликтовать данный код с шаблонами joomla https://www.templatemonster.com/ru/joomla-templates-type/, или нужно смотреть конкретно в каждом случае ?

    ОтветитьУдалить
    Ответы
    1. Данный код работает с firewall и лог-файлами web-сервера nginx, а не с Joomla! Конфликта не будет.

      Удалить
  2. В примере для Joomla! в jail.local ошибочно указано enabled = false. Должнобыть enabled = true.

    ОтветитьУдалить