Борьба с брутфорсом на wordpress

Борьба с брутфорсом на wordpress

Довольно давно на различных сайтах и форумах статьи и темы, в которых говорилось о многочисленных брутфорс-атаках на 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
Leave a comment

    Send a Comment

    Ваш адрес email не будет опубликован.