Защита WordPress с помощью fail2ban

Небольшая настройка fail2ban, которая позволит Вам защитить свой блог от перебора паролей к панели управления. Меня в свою очередь такое решение спасло от большого числа ботов гуляющих по сети и не один раз упомянутых, к примеру на хабрахабре Распределенная атака на WordPress сайты и Большая атака ботов на WordPress-сайты

Итак, редактируем файл jail.conf:

vi /etc/fail2ban/jail.conf
vi /etc/fail2ban/jail.conf

Добавляем в его содержимое:

[wp-login]
enabled = true
port    = http,https
action   = iptables[name=WP, port=http, protocol=tcp]
filter  = wp-login
logpath = /var/www/vhosts/*/statistics/logs/access_log
maxretry = 3
[wp-login]
enabled = true
port    = http,https
action   = iptables[name=WP, port=http, protocol=tcp]
filter  = wp-login
logpath = /var/www/vhosts/*/statistics/logs/access_log
maxretry = 3

Не забываем отредактировать поле logpath, указав правильный путь до log файла вашего сайта.
Создаем новый фильтр для fail2ban в соответствии с названием, указанным в поле filter:

vi /etc/fail2ban/filter.d/wp-login.conf
vi /etc/fail2ban/filter.d/wp-login.conf
# Fail2Ban configuration file
[Definition]
#failregex = <HOST>.*] "POST /wp-login.php
#более быстрый вариант фильтра
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =
# Fail2Ban configuration file
[Definition]
#failregex = <HOST>.*] "POST /wp-login.php
#более быстрый вариант фильтра
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =

Подобный фильтр, будет отлавливать в логах запись следующего вида:

1.2.3.4 - - [16/Dec/2014:15:12:50 +0300] "POST /wp-login.php HTTP/1.1" 200
1.2.3.4 - - [16/Dec/2014:15:12:50 +0300] "POST /wp-login.php HTTP/1.1" 200

Такой формат лога используется по умолчанию в Nginx. Если у Вас другой форма, то необходимо изменять failregex. Теперь, остается проверить, что созданный фильтр успешно работает. Проверять советую на совсем небольших файлах логов, так как процесс его полной обработки занимает приличное время. Запускаем следующим образом:

fail2ban-regex /logs/access.log /etc/fail2ban/filter.d/wp-login.conf
fail2ban-regex /logs/access.log /etc/fail2ban/filter.d/wp-login.conf

И получаем результат такого плана:

Running tests
=============
 
Use regex file : /etc/fail2ban/filter.d/wp-login.conf
Use log file   : /logs/access.log
 
 
Results
=======
 
Failregex
|- Regular expressions:
|  [1] <HOST>.*] "POST /wp-login.php
|
`- Number of matches:
   [1] 1656 match(es)
 
Ignoreregex
|- Regular expressions:
|
`- Number of matches:
 
Summary
=======
 
Addresses found:
[1]
    188.93.16.171 (Fri Mar 28 06:11:59 2014)
    37.193.138.69 (Fri Mar 28 06:32:24 2014)
    46.105.105.58 (Fri Mar 28 07:17:51 2014)
    5.39.106.19 (Fri Mar 28 07:18:05 2014)
    42.121.108.147 (Fri Mar 28 07:18:06 2014)
    46.60.253.41 (Fri Mar 28 08:16:32 2014)
    37.59.29.48 (Fri Mar 28 11:07:27 2014)
    37.193.138.69 (Fri Mar 28 13:01:55 2014)
    176.102.37.92 (Fri Mar 28 14:38:35 2014)
    176.102.37.92 (Fri Mar 28 14:38:37 2014)
    176.102.37.92 (Fri Mar 28 14:38:40 2014)
    176.102.37.92 (Fri Mar 28 14:38:41 2014)
    176.102.37.92 (Fri Mar 28 14:38:43 2014)
    176.102.37.92 (Fri Mar 28 14:38:46 2014)
    176.102.37.92 (Fri Mar 28 14:38:47 2014)
    176.102.37.92 (Fri Mar 28 14:38:49 2014)
    176.102.37.92 (Fri Mar 28 14:38:53 2014)
    176.102.37.92 (Fri Mar 28 14:38:55 2014)
    176.102.37.92 (Fri Mar 28 14:38:59 2014)
    176.102.37.92 (Fri Mar 28 14:39:00 2014)
    176.102.37.92 (Fri Mar 28 14:39:02 2014)
[...]
    203.195.184.151 (Sun Mar 30 22:28:17 2014)
    142.4.208.97 (Sun Mar 30 22:29:45 2014)
    188.93.16.52 (Mon Mar 31 00:51:15 2014)
 
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
175286 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 1656
 
However, look at the above section 'Running tests' which could contain important
information.
Running tests
=============

Use regex file : /etc/fail2ban/filter.d/wp-login.conf
Use log file   : /logs/access.log


Results
=======

Failregex
|- Regular expressions:
|  [1] <HOST>.*] "POST /wp-login.php
|
`- Number of matches:
   [1] 1656 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    188.93.16.171 (Fri Mar 28 06:11:59 2014)
    37.193.138.69 (Fri Mar 28 06:32:24 2014)
    46.105.105.58 (Fri Mar 28 07:17:51 2014)
    5.39.106.19 (Fri Mar 28 07:18:05 2014)
    42.121.108.147 (Fri Mar 28 07:18:06 2014)
    46.60.253.41 (Fri Mar 28 08:16:32 2014)
    37.59.29.48 (Fri Mar 28 11:07:27 2014)
    37.193.138.69 (Fri Mar 28 13:01:55 2014)
    176.102.37.92 (Fri Mar 28 14:38:35 2014)
    176.102.37.92 (Fri Mar 28 14:38:37 2014)
    176.102.37.92 (Fri Mar 28 14:38:40 2014)
    176.102.37.92 (Fri Mar 28 14:38:41 2014)
    176.102.37.92 (Fri Mar 28 14:38:43 2014)
    176.102.37.92 (Fri Mar 28 14:38:46 2014)
    176.102.37.92 (Fri Mar 28 14:38:47 2014)
    176.102.37.92 (Fri Mar 28 14:38:49 2014)
    176.102.37.92 (Fri Mar 28 14:38:53 2014)
    176.102.37.92 (Fri Mar 28 14:38:55 2014)
    176.102.37.92 (Fri Mar 28 14:38:59 2014)
    176.102.37.92 (Fri Mar 28 14:39:00 2014)
    176.102.37.92 (Fri Mar 28 14:39:02 2014)
[...]
    203.195.184.151 (Sun Mar 30 22:28:17 2014)
    142.4.208.97 (Sun Mar 30 22:29:45 2014)
    188.93.16.52 (Mon Mar 31 00:51:15 2014)

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
175286 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 1656

However, look at the above section 'Running tests' which could contain important
information.

Статистика снята всего лишь за несколько дней, а нашлось уже 1656 неверных попыток входа в панель. Для вступления правил в силу остается только перезапустить сервис fail2ban:

service fail2ban restart
service fail2ban restart

Если у Вас настроен мониторинг munin, то все заблокированные попытки будут прекрасно отображаться на графиках.

VN:F [1.9.22_1171]
Рейтинг: 10.0/10 (1 голос)
Защита WordPress с помощью fail2ban, 10.0 out of 10 based on 1 rating

4 Ответы

  1. Спасибо, легко настроил. Но у вас небольшая ошибка в конфигах. В jail.conf в секции [wp-login] указан параметр:
    filter = apache-wp-login
    Но в папке /etc/fail2ban/filter.d/ создается конфиг файл с именем wp-login.conf.
    Нужно либо имя файла конфига поменять на apache-wp-login.conf, либо параметр filter указать wp-login. Я сделал последнее.

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

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