Блокировка атак bruteforce на Joomla с помощью Fail2Ban на сервере Debian

Здесь объясняется как заблокировать IP-адреса, которые пытаются брутфорсить сайты Joomla. Мануал аписан для серверов на базе Debian/

1. Установка плагина Joomla

Для Joomla 2.5.x и Joomla 3.x вы можете установить: plg_system_fail2ban_j25.zip

Для Joomla 1.5.x вы можете установить: plg_system_fail2ban_j15.zip

Официальная страница этого плагина здесь, но актуальная версия не содержит нужного нам функционала, а именно - записи неудачных попыток авторизации в системные логи.

После установки и включения плагина неудачные попытки авторизации будут регистрироваться в файле /var/log/syslog

Убедитесь что на этом этапе все работает как надо.

2. Настройка логгирования в отдельный файл

Создать файл /etc/rsyslog.d/10-joomla.conf с содержанием:

if $programname == 'joomla' then /var/log/joomla.log
& ~

Затем сделаем перезагрузку rsyslog:

# service rsyslog restart

После этого неудачные авторизации будут записаны только в /var/log/joomla.log

3. Настройка fail2ban

Если fail2ban не установлен, сделаем это:

# apt-get install fail2ban

Далее создаем файл /etc/fail2ban/filters.d/joomla-error.conf с содержимым:

[Definition]
# Option: failregex
# Notes.: matches something like:
# [Mon Mar 31 10:15:00 2014] [error] [client 212.109.14.203] user mywebsite authentication failure
# Values: TEXT
failregex = [[]client <HOST>[]] user .* authentication failure.*
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Добавить в конец файла /etc/fail2ban/jail.local :

[joomla-error]
enabled = true
port = http,https
filter = joomla-error
logpath = /var/log/joomla.log
maxretry = 5

Теперь протестируем добавленное правило:

# fail2ban-regex /var/log/joomla.log /etc/fail2ban/filter.d/joomla-error.conf

Если все нормально, результат будет примерно такой:

Running tests
=============
Use failregex file : /etc/fail2ban/filter.d/joomla-error.conf
Use log file : /var/log/joomla.log

Results
=======

Failregex: 15 total
|- #) [# of hits] regular expression
| 1) [15] [[]client <HOST>[]] user .* authentication failure.*
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [15] MONTH Day Hour:Minute:Second
`-

Lines: 15 lines, 0 ignored, 15 matched, 0 missed

Lines: 15 lines, 0 ignored, 15 matched, 0 missed - говорит о том, что в логе нашлось 15 совпадений из 15 строк, это нам и нужно

Теперь перезагрузим fail2ban:

# fail2ban-client reload

4. Настройка ротации /var/log/joomla.log

Создадим файл /etc/logrotate.d/joomla.conf с содержимым:

/var/log/joomla.log {
rotate 12
weekly
missingok
notifempty
create 777 root adm
compress
size 5M
minsize 5M
delaycompress
}

Перезагружать logrotate не нужно, т.к. он работает по крону

На этом все

 

Для подготовки материала использовались следующие материалы:
https://www.rupostel.com/joomla/hacks/blocking-joomla-brute-force-login-attacks-with-fail2ban-on-ubuntu-server

 

P.S.

До кучи в тот же лог-файл можно писать неудачные попытки авторизации в VestaCP и успешно бороться с брутфорсом этой панели

Для этого в файле /usr/local/vesta/web/login/index.php

Заменить код:

if ( $return_var > 0 ) {
$ERROR = "<a class=\"error\">".__('Invalid username or password')."</a>";

}

на:

if ( $return_var > 0 ) {
$ERROR = "<a class=\"error\">".__('Invalid username or password')."</a>";

$msg = '[error] [client '.$_SERVER['REMOTE_ADDR'].'] user '.$_POST['user'].' VestaCP authentication failure';
openlog('joomla', LOG_NDELAY, LOG_USER);
syslog(LOG_ERR, sprintf($msg));
}