Блокировка атак 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));
}