Найти в Дзене
WebHOST1.ru

Защита wp-login.php на Nginx: как остановить брутфорс

Страница входа WordPress — один из самых посещаемых адресов на вашем сайте и самая частая цель брутфорса. Каждая неудачная попытка авторизации всё равно запускает PHP и запросы к базе данных, нагружая сервер и замедляя сайт для реальных пользователей. Гораздо эффективнее отрезать лишний трафик на уровне веб-сервера. Ниже — практичные настройки Nginx, которые снижают нагрузку и блокируют автоматические атаки, не мешая административной работе. Плагины безопасности ограничивают попытки входа уже после того, как WordPress принял запрос. Nginx позволяет отбрасывать подозрительные обращения раньше, экономя CPU и I/O. Правильно настроенные правила и брандмауэр дадут доступ только доверенным пользователям и снизят риск перегрузки при массированных переборах пароля. 🧰 Настроим Nginx для WordPress «под ключ»: allow/deny по IP, Basic Auth, limit_req, Fail2ban и HTTPS — чтобы wp-login.php не грузил PHP и БД.
Услуга «Администрирование сайта» → Администрирование сайтов Самый «жёсткий» подход — бел
Оглавление

Введение

Страница входа WordPress — один из самых посещаемых адресов на вашем сайте и самая частая цель брутфорса. Каждая неудачная попытка авторизации всё равно запускает PHP и запросы к базе данных, нагружая сервер и замедляя сайт для реальных пользователей. Гораздо эффективнее отрезать лишний трафик на уровне веб-сервера. Ниже — практичные настройки Nginx, которые снижают нагрузку и блокируют автоматические атаки, не мешая административной работе.

Почему защищать wp-login.php именно через Nginx

Плагины безопасности ограничивают попытки входа уже после того, как WordPress принял запрос. Nginx позволяет отбрасывать подозрительные обращения раньше, экономя CPU и I/O. Правильно настроенные правила и брандмауэр дадут доступ только доверенным пользователям и снизят риск перегрузки при массированных переборах пароля.

🧰 Настроим Nginx для WordPress «под ключ»: allow/deny по IP, Basic Auth, limit_req, Fail2ban и HTTPS — чтобы wp-login.php не грузил PHP и БД.

Услуга «Администрирование сайта» →
Администрирование сайтов

Ограничение доступа по IP

Самый «жёсткий» подход — белый список адресов для админ-зоны и страницы входа. С чужих IP форма логина даже не отобразится.

Откройте конфигурацию сайта (обычно /etc/nginx/sites-available/… или раздел server в nginx.conf), сделайте резервную копию файла и добавьте правила. Пример для статического IP 111.111.111.111:

location /wp-admin {
allow 111.111.111.111;
deny all;
}

location = /wp-login.php {
allow 111.111.111.111;
deny all;

include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Проверьте синтаксис и перезапустите службу:

nginx -t
# Ubuntu/Debian
sudo service nginx restart
# CentOS/AlmaLinux/RHEL
sudo systemctl restart nginx

Если IP меняется, будьте готовы оперативно обновлять список через SSH или используйте более гибкие методы ниже.

Базовая HTTP-авторизация для wp-login.php

Если доступ по IP неудобен, добавьте второй рубеж — Basic Auth. Перед загрузкой формы авторизации браузер запросит учётные данные, а до WordPress запрос даже не дойдёт.

# Установите утилиты и создайте файл паролей
sudo apt-get update
sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin

Подключите авторизацию в конфиге:

location = /wp-login.php {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;

include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

При необходимости закройте базовой авторизацией и /wp-admin. Обязательно используйте HTTPS: базовые логин и пароль передаются в кодировке, но без шифрования.

Где хватит бесплатного SSL, а где нужен коммерческий — Let’s Encrypt vs GlobalSign.

Дополнительные меры на стороне Nginx и системы

  • Ограничение методов. Если не требуется отправка данных анонимными пользователями, оставьте для гостей только безопасные запросы на чтение, а модифицирующие (POST, PUT, DELETE) разрешайте лишь из доверённых источников или после авторизации.
  • Лимиты частоты запросов. Замедляйте или блокируйте «шторм» обращений к wp-login.php, чтобы бот не мог делать десятки попыток в минуту. Используйте limit_req_zone и limit_req, аккуратно подобрав пороги, чтобы не мешать легитимным пользователям.

Если атака идёт на уровне L7 — как мы фильтруем трафик на L3–L7.

  • Fail2ban. Настройте наблюдение за логами Nginx и автоматическую блокировку IP, которые многократно ошибаются при вводе пароля или слишком часто обращаются к странице входа. Это переносит блокировку на уровень брандмауэра и снимает нагрузку с веб-сервера.

Для глубокой защиты используйте правила на уровне сервера — iptables/nftables на практике.

  • Базовая гигиена безопасности. Используйте уникальные сложные пароли администраторов, включите reCAPTCHA на форме входа, при необходимости измените URL авторизации и закройте прямой доступ к оригинальному wp-login.php правилами Nginx. Все изменения проверяйте в тестовой среде или в непиковые часы.

Заключение

Перенос «точки отказа» на уровень Nginx экономит ресурсы и делает атаки на wp-login.php бессмысленными. Комбинация белых списков IP или базовой авторизации, лимитов частоты и Fail2ban существенно снижает вероятность успешного брутфорса и защищает сервер от пиков нагрузки. Настраивайте поэтапно, проверяйте логи и держите под рукой доступы для восстановления, чтобы не заблокировать себя. Когда защита встроена в веб-сервер, WordPress работает стабильнее, а админка остаётся доступной только тем, кому действительно нужно.