Борьба с брутфорсом на 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 = <HOST>.*/wp-login.php HTTP/1.1" 200
     <HOST>.*/wp-login.php/ HTTP/1.1" 302
     <HOST>.*/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): <Month/Day/Year@Hour:Minute:Second>

Success, the total number of match is 1

Проверка журнала блокировок

Fail2ban будет записывать все производимые блокировки. При необходимости можно проверять лог-файл /var/log/fail2ban.log на их наличие.

grep WARNING /var/log/fail2ban.log

Как вы оцените статью?
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *