Довольно давно на различных сайтах и форумах статьи и темы, в которых говорилось о многочисленных брутфорс-атаках на wordpress-сайты. Недавно пришлось столкнуться с этой заразой. :)
В данном посте хотелось бы рассказать о своём опыте борьбы с подбором пароля на сайтах, работающих на WordPress. Сразу отмечу, что все мои сайты работают на nginx + php-fpm.
В качестве инструкции в основу была взята одна статья. Однако, описанный рецепт пришлось немного модифицировать под специфику своих атакующих. :)
Настройка
Первым делом необходимо установить fail2ban. Это не должно вызвать трудностей.
aptitude install fail2ban
После чего в конец конфигурационного файла /etc/fail2ban/jail.conf добавляем следующее:
[nginx-wp-auth] enabled = true filter = nginx-wp-auth action = iptables-multiport[name=wp-auth, port="http,https"] logpath = /var/log/nginx/*.access.log maxretry = 3 bantime = 3600
В данном случае action будет блокировать доступ для нарушителей только по указанным протоколам и помечать их как wp-auth. В logpath указываем путь к логам.
Будут анализироваться все логи, типа example.com.access.log. Для логов сайтов на вордпресс можно задать особые имена, например, wordpress-example.com.access.log, чтобы анализировались только эти лог-файлы.
Максимальное число попыток авторизации для одного айпи — три. Время блокировки — час. Оба эти параметра можно подбирать в индивидуальном порядке.
Следующим шагом будет создание фильтра.
touch /etc/fail2ban/filter.d/nginx-wp-auth.conf
Во время этого действия у меня возникли сложности: пример из оригинальной статьи не работал. И его пришлось изменить. :)
[Definition] failregex =.*/wp-login.php HTTP/1.1" 200 .*/wp-login.php/ HTTP/1.1" 302 .*/wp-login.php HTTP/1.0" 200 ignoreregex =
В первом параметры записаны все совпадения, которые следует искать в лог-файлах. Здесь нужно проанализировать запросы атакующих в логах вашего сервера и добавить все подозрительные, связанные с wp-login.php.
Второй параметр предназначен для исключений из первой строки. Он не потребуется и остаётся пустым.
Тестирование
После создания фильтра проверьте его работу командой:
fail2ban-regex /var/log/nginx/example.com.access.log /etc/fail2ban/filter.d/nginx-wp-auth.conf
Обнаруженные совпадения будут отображены в результатах теста. Например, так:
Running tests ============= Use regex file : /etc/fail2ban/filter.d/nginx-wp-auth.conf Use log file : /var/log/nginx/***.ru.access.log Results ======= Failregex |- Regular expressions: | [1] .*/wp-login.php HTTP/1.1" 200 | [2] .*/wp-login.php/ HTTP/1.1" 302 | [3] .*/wp-login.php HTTP/1.0" 200 | `- Number of matches: [1] 1 match(es) [2] 0 match(es) [3] 0 match(es) Ignoreregex |- Regular expressions: | `- Number of matches: Summary ======= Addresses found: [1] 192.99.186.30 (Fri Jul 04 07:29:20 2014) [2] [3] Date template hits: 0 hit(s): MONTH Day Hour:Minute:Second 0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year 0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second 0 hit(s): Year/Month/Day Hour:Minute:Second 0 hit(s): Day/Month/Year Hour:Minute:Second 0 hit(s): Day/Month/Year Hour:Minute:Second 58 hit(s): Day/MONTH/Year:Hour:Minute:Second 0 hit(s): Month/Day/Year:Hour:Minute:Second 0 hit(s): Year-Month-Day Hour:Minute:Second 0 hit(s): Year.Month.Day Hour:Minute:Second 0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond] 0 hit(s): Day-Month-Year Hour:Minute:Second 0 hit(s): TAI64N 0 hit(s): Epoch 0 hit(s): ISO 8601 0 hit(s): Hour:Minute:Second 0 hit(s):Success, the total number of match is 1
Проверка журнала блокировок
Fail2ban будет записывать все производимые блокировки. При необходимости можно проверять лог-файл /var/log/fail2ban.log на их наличие.
grep WARNING /var/log/fail2ban.log