Блог на WordPress атакуют постоянно. В этом легко убедиться просмотрев логи. Наиболее частой атакой является подбор пароля.
Конечно есть плагины, позволяющие заблокировать назойливого посетителя, но лучше его вообще не пускать на уровень 7, заблокировав в самом низу. вручную все время отслеживать и добавлять новые правила сложно, эту операцию лучше немного автоматизировать. Поручим разбираться с атакующими fail2ban.
$ sudo apt install fail2ban
Правила для WP в стандартной поставке нет, но проанализировав журналы его легко составить самому. Например, попытки подбора пароля в файле логов выглядит так:
18.200.85.118 - - [12/May/2016:01:08:19 +0300] "POST /wp-login.php HTTP/1.0" 200 4185 "-" "-"
Cоздаем новый фильтр.
$ sudo /etc/fail2ban/filter.d/wp-auth.conf
[Definition]
failregex = ^ .* "POST /wp-login.php
ignoreregex =
Создаем /etc/fail2ban/jail.local:
[wp-auth]
enabled = true
port = http,https
filter = wp-auth
logpath = /var/log/apache2/*.log
Проверяем есть ли совпадения (matched):
$ sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/wp-auth.conf
Если все нормально, отдаем в работу. Перезапускаем сервис:
$ sudo service fail2ban restart
Результат достаточно быстро отобразится в логах.
Аналогичным образом создаем правила и для других ситуаций. Например попытка подбора пароля через RPC выглядит так.
178.137.93.24 - - [29/Jun/2016:21:17:14 +0300] "POST /xmlrpc.php HTTP/1.0" 200 101428 "-" "Mozilla/5.0 (Windows 10; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
Чтобы отслеживать такие попытки, достаточно добавить в wp-auth.conf
failregex = ^ .* "POST /xmlrpc.php
Попытка получения wp-config.php в логах выглядит так:
Создаем правило:
$ sudo nano /etc/fail2ban/filter.d/wp-conf.conf
[Definition]
failregex = ^.*"GET.*/wp-config.php.*
ignoreregex =
Проверяем
$ sudo fail2ban-regex -v /var/log/apache2/domains/access.log /etc/fail2ban/filter.d/wp-conf.conf
Running tests
=============
Use failregex file : /etc/fail2ban/filter.d/wp-conf.conf
Use log file : /var/log/apache2/domains/wpconfig.ru.log
Running tests
=============
Use failregex file : /etc/fail2ban/filter.d/wp-conf.conf
Use log file : /var/log/apache2/domains/wpconfig.ru.log
Results
=======
Failregex: 14 total
|- #) [# of hits] regular expression
| 1) [14] ^.*"GET.*/wp-config.php.*
| 81.215.144.101 Sun Jun 19 20:20:52 2016
| 81.215.144.101 Sun Jun 19 20:20:54 2016
| 81.215.144.101 Sun Jun 19 20:20:56 2016
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [42622] Day/MONTH/Year:Hour:Minute:Second
| [0] WEEKDAY MONTH Day Hour:Minute:Second[.subsecond] Year
| [0] WEEKDAY MONTH Day Hour:Minute:Second Year
| [0] WEEKDAY MONTH Day Hour:Minute:Second
| [0] MONTH Day Hour:Minute:Second
| [0] Year/Month/Day Hour:Minute:Second
| [0] Day/Month/Year Hour:Minute:Second
| [0] Day/Month/Year2 Hour:Minute:Second
| [0] Month/Day/Year:Hour:Minute:Second
| [0] Year-Month-Day Hour:Minute:Second[,subsecond]
| [0] Year-Month-Day Hour:Minute:Second
| [0] Year.Month.Day Hour:Minute:Second
| [0] Day-MONTH-Year Hour:Minute:Second[.Millisecond]
| [0] Day-Month-Year Hour:Minute:Second
| [0] Month-Day-Year Hour:Minute:Second[.Millisecond]
| [0] TAI64N
| [0] Epoch
| [0] ISO 8601
| [0] Hour:Minute:Second
| [0]
| [0] YearMonthDay Hour:Minute:Second
| [0] Month-Day-Year Hour:Minute:Second
`-
Lines: 42622 lines, 0 ignored, 14 matched, 42608 missed
Missed line(s):: too many to print. Use --print-all-missed to print all 42608 lines
В /etc/fail2ban/jail.local добавляем
[wp-conf]
enabled = true
port = http,https
filter = wp-conf
logpath = /var/log/apache2/domains/*.log
Перезапускаем сервис:
$ sudo service fail2ban restart