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