Защита wp-admin с помощью пароля в Nginx

Защита административной панели WordPress — важный шаг для повышения безопасности сайта. Один из лучших методов — использование базовой аутентификации, добавляющей дополнительный уровень защиты. В этой статье мы подробно рассмотрим, как настроить такую защиту для папки /wp-admin/ и страницы /wp-login.php в Nginx.

В этой заметке рассмотрим защиту без использования сторонних плагинов для WordPress, для этого будем использовать возможности NGINX.

Установка и настройка пакета apache2-utils

Для управления паролями базовой аутентификации нам понадобится утилита htpasswd, которая является частью пакета apache2-utils.

Установка apache2-utils

Введите следующую команду в терминале:

sudo apt update && sudo apt install apache2-utils

Создание файла с паролями

Далее с помощью утилиты htpasswd создаем файл паролей. Например, создадим файл /etc/nginx/.htpasswd и добавим туда пользователя admin:

sudo htpasswd -c /etc/nginx/.htpasswd admin

После выполнения команды вас попросят ввести и подтвердить пароль для пользователя. Флаг -c создаёт новый файл, поэтому при добавлении новых пользователей его использовать не нужно. Например, чтобы добавить второго пользователя, используйте команду ниже:

sudo htpasswd /etc/nginx/.htpasswd имя-второго-пользователя

Проверка содержимого файла

Убедитесь, что файл /etc/nginx/.htpasswd создан и содержит хэшированные пароли:

cat /etc/nginx/.htpasswd

Вывод должен быть примерно таким:

admin:$apr1$0BLj/X9a$g3kQxoYpfybTx2hczicSl.

Настройка Nginx для защиты wp-admin и wp-login.php

Добавьте в конфигурацию вашего сайта следующий код:

# Защита wp-admin паролем
location /wp-admin/ {
    auth_basic "Restricted Area"; # Сообщение, которое увидит пользователь
    auth_basic_user_file /etc/nginx/.htpasswd;

    # Отключаем пароль для внутренних запросов от самого сервера
    satisfy any;
    allow 127.0.0.1;  # Разрешить доступ локальному серверу
    allow 192.168.1.0/24; # Разрешить доступ из локальной сети
    deny all;

    # Обработка PHP
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Оставляем доступ для ajax-запросов
    location ~ admin-ajax\.php$ {
        allow all;
    }
}

# Защита wp-login.php паролем
location = /wp-login.php {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # Отключаем пароль для внутренних запросов от самого сервера
    satisfy any;
    allow 127.0.0.1;
    allow 192.168.1.0/24;
    deny all;

    # Обработка PHP
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Подробные комментарии к конфигурации

auth_basic — Эта директива включает базовую аутентификацию. Текст в кавычках (например, «Restricted Area») отображается как подсказка при запросе логина и пароля.

auth_basic_user_file — Указывает путь к файлу с хэшированными паролями, созданному ранее с помощью утилиты htpasswd.

satisfy any — Позволяет разрешить доступ без ввода пароля, если запросы исходят от определённых IP-адресов, указанных в директивах allow.

allow и deny

  • allow 127.0.0.1; позволяет доступ с локального сервера.
  • allow 192.168.1.0/24; разрешает доступ для всей подсети.
  • deny all; запрещает доступ всем остальным.

Блоки для PHP — Включение PHP-обработки необходимо для корректной работы динамических страниц. Убедитесь, что путь к PHP-FPM сокету /run/php/php8.1-fpm.sock соответствует вашей версии PHP.

Обработка ajax-запросов — Ajax-запросы (например, к admin-ajax.php) не должны блокироваться, так как это может нарушить работу сайта. Для этого предусмотрен отдельный блок с allow all.

Применение изменений

После внесения изменений в конфигурацию, перезагрузите Nginx:

sudo systemctl reload nginx

Тестирование

Попробуйте зайти в административную панель по адресу http://yourwebsite.ru/wp-admin/ и убедитесь, что требуется ввод логина и пароля.

Проверьте, что ajax-запросы (например, при публикации постов) работают корректно.

Убедитесь, что доступ к /wp-login.php также защищён паролем.

На этом настройка базовой аутентификации для административной панели WordPress завершена.

Такая защита значительно повышает уровень безопасности вашего сайта. Даже если злоумышленник узнает логин и пароль администратора WordPress, ему придётся преодолеть дополнительный барьер в виде базовой аутентификации. Следуйте рекомендациям из этой статьи, чтобы надёжно защитить ваш сайт.

Помогла статья? Подписывайся на Telegram канал автора.

Анонсы всех статей, много другой полезной и интересной информации, которая не попадает на сайт.

Если у вас имеются вопросы, задавайте их в комментариях.

Оставьте комментарий