Привет хабраюзер, хочу поделится опытом настройки bruteblock'a для защиты CMS Joomla 2.5 от брутфорс атак, началось все с того как я заметил на сервере в логах Jooml'ы неудачные попытки авторизации в файле error.php, Joomla сама рапортует о неудачных попытках в этот файл, в моем случае конфигурация сервера FreeBSD 10 + Nginx+PHP-FPM+MySQL+chroot. Файл error.php лежал по пути /usr/local/www/example.org/log/error.php. На сервере так же установлен bruteblock который служил стражем против брутфорса sshd демона о его настройке говорить я не буду, статей на просторах интернета предостаточно, предположим что у Вас он установлен и настроен…
Bruteblock работает с syslog'ом и берет все неудачные попытки авторизации из него же, встал вопрос о перенаправлении вывода из файла error.php в syslog и попалась мне утилитка входящая в состав UNIX систем под названием logger с ее помощью мы и перенаправим файл error.php в syslog, для этого добавим строчку в cron:
после этого наш файл error.php будет каждую минуту скидываться в syslog с тегом joomla приоритетом auth.info и обнулятся что бы в следующий раз не импортировать уже существующие записи, теперь в логе /var/log/auth.log должны появляться записи:
Хорошо, идем дальше, теперь создаем конфиг для bruteblock'а /usr/local/etc/bruteblock/joomla.conf с содержимым:
и добавим в файл /etc/syslog.conf обработчик
перезапускаем syslog
Теперь если кто-то попытается ввести неверный логин и пароль 4 раза в течение 10 минут, то он будет заблокирован на один час, посмотреть заблокированные IP адреса можно командой:
очистить список заблокированных IP адресов:
По аналогии можно реализовать и на других CMS системах.
Bruteblock работает с syslog'ом и берет все неудачные попытки авторизации из него же, встал вопрос о перенаправлении вывода из файла error.php в syslog и попалась мне утилитка входящая в состав UNIX систем под названием logger с ее помощью мы и перенаправим файл error.php в syslog, для этого добавим строчку в cron:
* * * * * /usr/bin/logger -f /usr/local/www/example.org/log/error.php -t joomla -p auth.info && /bin/cat /dev/null > /usr/local/www/example.org/log/error.php
после этого наш файл error.php будет каждую минуту скидываться в syslog с тегом joomla приоритетом auth.info и обнулятся что бы в следующий раз не импортировать уже существующие записи, теперь в логе /var/log/auth.log должны появляться записи:
Feb 16 18:12:42 example joomla: 2014-02-16 14:11:44 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("admin") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:26 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:29 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:32 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:34 INFO 1.2.3.4 Joomla FAILURE: Empty password not allowed ("aaaaa") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:37 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaaaa") Feb 16 18:12:42 example joomla: 2014-02-16 14:12:40 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa")
Хорошо, идем дальше, теперь создаем конфиг для bruteblock'а /usr/local/etc/bruteblock/joomla.conf с содержимым:
regexp = joomla.*INFO.(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).Joomla FAILURE.* max_count = 4 within_time = 600 reset_ip = 3600 ipfw2_table_no = 1
и добавим в файл /etc/syslog.conf обработчик
auth.info;authpriv.info | exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/joomla.conf
перезапускаем syslog
# /etc/rc.d/syslogd restart Stopping syslogd. Waiting for PIDS: 3855. Starting syslogd.
Теперь если кто-то попытается ввести неверный логин и пароль 4 раза в течение 10 минут, то он будет заблокирован на один час, посмотреть заблокированные IP адреса можно командой:
# ipfw table 1 list 1.2.3.4/32 1392563442 4.3.2.1/32 1392563562 1.2.4.3/32 1392564766
очистить список заблокированных IP адресов:
# ipfw table 1 flush
По аналогии можно реализовать и на других CMS системах.