Диагностика проблемы: как понять, что сайт под угрозой bruteforce-атаки
Bruteforce-атака — это массовая попытка подобрать правильные логин и пароль для входа в админку WordPress. Признаки проблемы:
- В логах сервера появляются сотни или тысячи попыток входа с разных IP за короткое время.
- Сайт начинает загружаться медленнее из-за высокой нагрузки на обработку запросов авторизации.
- Вы замечаете несанкционированные входы или попытки взлома, особенно если пароль слабый.
Для проверки можно посмотреть логи сервера или использовать команду на сервере (если есть SSH):
grep "POST /wp-login.php" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
Она покажет IP-адреса с наибольшим числом попыток входа.
Пошаговое решение: ограничение количества попыток входа через .htaccess и functions.php
Шаг 1. Ограничение доступа к wp-login.php через .htaccess по IP
Если у вас статический IP или фиксированный набор IP-адресов администраторов, можно ограничить доступ:
# В корне сайта в файл .htaccess добавьте:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 123.45.67.89
</Files>
Замените 123.45.67.89 на ваш IP. Это самый надежный способ, но не всегда применим.
Шаг 2. Ограничение попыток входа через код в functions.php
Добавим код, который будет блокировать IP с более чем N неудачными попытками входа за определённое время.
function limit_login_attempts() {
session_start();
$max_attempts = 5;
$lockout_time = 15 * 60; // 15 минут
if (!isset($_SESSION['login_attempts'])) {
$_SESSION['login_attempts'] = 0;
$_SESSION['last_attempt_time'] = time();
}
if (time() - $_SESSION['last_attempt_time'] > $lockout_time) {
$_SESSION['login_attempts'] = 0;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['log'])) {
if ($_SESSION['login_attempts'] >= $max_attempts) {
wp_die('Слишком много неудачных попыток входа. Попробуйте позже.');
}
add_action('wp_login_failed', function() {
$_SESSION['login_attempts']++;
$_SESSION['last_attempt_time'] = time();
});
add_action('wp_login', function() {
$_SESSION['login_attempts'] = 0; // сброс при успешном входе
});
}
}
add_action('init', 'limit_login_attempts');
Этот код хранит количество попыток в сессии пользователя. Недостаток — злоумышленник может менять IP и браузер, чтобы обходить ограничение.
Шаг 3. Блокировка IP через fail2ban (на сервере)
Если есть доступ к серверу, настройте fail2ban для автоматической блокировки IP, из которых идут подозрительные попытки:
- Создайте фильтр для
wp-login.phpв/etc/fail2ban/filter.d/wordpress.conf - Добавьте правило в
/etc/fail2ban/jail.local - Перезапустите сервис fail2ban
Это значительно эффективнее, но требует доступа к серверу и понимания работы fail2ban.
Проверка результата после внедрения
- Повторите запрос из раздела диагностики и убедитесь, что подозрительные IP заблокированы или ограничены.
- Попробуйте намеренно ввести неправильный пароль более 5 раз — должна появиться блокировка с сообщением.
- Проверьте логи сервера на отсутствие массовых попыток с одного IP.
Частые ошибки и как их исправить
- Ошибка: сессии не работают, и ограничения не срабатывают.
Причина: сессии не инициализированы в WordPress по умолчанию.
Решение: добавитьsession_start()в хукinitили использовать transient API для хранения попыток. - Ошибка: блокировка мешает легитимным пользователям.
Причина: слишком жесткие лимиты или нестабильный IP.
Решение: увеличьте количество попыток или время блокировки. - Ошибка: IP-ограничение через .htaccess не работает.
Причина: конфликт с другими правилами или неправильный синтаксис.
Решение: проверьте порядок правил и используйте правильный синтаксис для версии Apache.
Практические советы по безопасности и производительности
- Используйте сложные пароли и двухфакторную аутентификацию вместо простых ограничений.
- Регулярно обновляйте WordPress и плагины, чтобы закрыть известные уязвимости.
- Для сайтов с высокой нагрузкой лучше использовать серверные инструменты (fail2ban, firewall) для защиты от bruteforce, а не только PHP-код.
- Рассмотрите использование Cloudflare или другого CDN с функцией Web Application Firewall для дополнительной защиты.
Сравнение способов защиты от bruteforce-атак
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ограничение по IP в .htaccess | Очень надежно, блокирует до входа в WordPress | Требуются статические IP, неудобно для динамических | Для админов с фиксированным IP |
| Код в functions.php (сессии) | Просто реализовать, работает сразу | Легко обойти сменой браузера и IP | Для базовой защиты, когда нет доступа к серверу |
| Fail2ban на сервере | Эффективно блокирует на уровне сервера, не нагружает WordPress | Требуется доступ к серверу и навыки администрирования | Для крупных проектов и VPS/выделенных серверов |
Если вам нужна комплексная SEO-оптимизация и чистка сайта после атак, рассмотрите плагин Clearfy Pro от WPShop — он поможет оптимизировать производительность и убрать мусор.