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