Закрытие форм авторизации WordPress с помощью Nginx.

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

Первый способ подразумевает установку пароля на доступ к форме авторизации пользователей и админ-панели WordPress. Второй способ закрывает доступ к вышеуказанным частям сайта со всех ip-адресов кроме вашего. Способы просты в реализации, они работают на уровне сервера и не создают нагрузки на сайт, в отличии от плагинов. Но подойти они могут не всем владельцам сайтов.

Если на вашем сайте подразумевается возможность свободной регистрации пользователей, то лучше обратить внимание на плагины, например captcha от Google. Ну а если на сайте только ваша админская учетная запись, то эти способы как раз для вас.

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

apt-get install apache2-utils -y

Создадим каталог для .htpasswd файлов.

mkdir /etc/nginx/auth

Создадим файл аутентификации.

htpasswd -cmb /etc/nginx/auth/.htpasswd user password

user - имя пользователя
password - пароль

Например
htpasswd -cmb /etc/nginx/auth/.htpasswd vasya vasya_loh_1990

Закроем доступ к каталогу wp-admin и к файлу wp-login.php. Все прописывается в контексте server {} отвечающим за конфигурацию сайта. Внутри контекста location ~* /wp-login.php, обязательно нужно указать свои опции обработки PHP, в противном случае файл wp-login.php будет просто сохраняться на жесткий диск.

location ~* /wp-login.php {
    try_files $uri $uri/ $uri/wp-login.php /wp-login.php;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/auth/.htpasswd;

    root /var/www/techlist/public;
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

location /wp-admin {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/auth/.htpasswd;
}

Описанный способ надежен, но неудобен, хоть сервер и не просит пароли постоянно, но в начале сессии стабильно идет запрос пароля. К тому же, после ввода пароля на доступ, нужно вводить пароль от самого сайта. Поэтому существует второй способ, подразумевающий запрещение доступа со всех ip-адресов кроме разрешенных.

Работает это примерно следующим образом. Задаем два location-а /wp-login.php и /wp-admin. Директивой try_files обрабатываем все входящие запросы и отправляем их на обработку в location @deny, в котором по умолчанию запрещены запросы со всех ip-адресов (deny all), кроме разрешенных (allow). Точно также, как и в первом способе, не забываем указать обработку PHP в location @deny.

location = /wp-login.php {
    try_files /does_not_exists @deny;
}

location /wp-admin/ {
    try_files $uri $uri/ @deny ;
}

location @deny {
    allow 1.2.3.4;
    deny all;

    root /var/www/techlist/public;
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Разрешенных адресов может быть несколько, главное не забыть прописать - deny all.

location @deny {
    allow 1.2.3.4;
    allow 2.1.3.4;
    allow 3.1.2.4;
    и сколько угодно...
    deny all;

Это в случае со статическими (постоянными) ip-адресами. А если ip-адрес динамический (меняющийся)? Тогда можно разрешить доступ для подсети, к которой принадлежит ваш адрес. Если вы не знаете свою подсеть, то ее можно рассчитать в онлайн-калькуляторе. Нужно только узнать свой текущий ip-адрес, указать маску подсети и нажать на расчет, потом останется разрешить доступ с полученного адреса.

location @deny {
    allow 4.1.2.3/24; # Так указывают подсеть
    deny all;

Теперь, даже если адреса у вас будут меняться, они все равно будут входить в разрешенный диапазон, следовательно вы всегда получите доступ к админке сайта. Можно одновременно указывать и адреса и подсети.

location @deny {
    allow 1.2.3.4;
    allow 2.1.3.4;
    allow 3.1.2.4;
    allow 4.1.2.3/24;
    deny all;

Теперь при обращении по адресам вида mysite.com/wp-admin/ и  mysite.com/wp-login.php, всем неугодным будет отдаваться 403 страница (запрещено), а с разрешенных адресов доступ будет открыт. На моем сайте прижился именно этот способ.

Ответить:

Please enter your comment!
Please enter your name here