Конечно мы хотим чтобы наш сайт был доступен для посетителей, однако на любом сайте найдутся такие места, которые мы бы предпочли оградить от всеобщего доступа.
В первую очередь это страница логина в админскую часть самого сайта или какого-нибудь инструмента по типу панели управления.
За время администрирования сайта вы будете часто замечать подозрительную активность ботов, которые проверяют вашу админку. Такова реальность, брутфорс первый шаг на пути взлома сайта. Боты ищут по всей сети не закрытые админки и формы логина и пытаются перебором подобрать пару логин/пароль чтобы получить доступ.
Конечно, длинный пароль, с разным регистром, с цифрами и символами защитит от брутфорса практически полностью.
Но это не повод не воспользоваться дополнительным уровнем защиты. Даже такой простой механизм как basic auth заметно сократит количество ботов атакующих ваш сайт.
Для начала используем htpasswd, чтобы создать файл с паролем, -c означает создать файл, если файл уже существует, данный аргумент не нужен, далее следуют путь до файла и имя пользователя, которое мы будем использовать:
[root@waky ~]# htpasswd -c /usr/share/nginx/.htpasswd anyname
New password:
Re-type new password:
Adding password for user anyname
Посмотрим что из себя представляет полученный файл. В нем записано имя пользователя и пароль в шифрованном виде. Восстановить пароль из файла не удастся, и если вы забыли пароль его придется пересоздавать командой выше.
[root@waky ~]# cat /usr/share/nginx/.htpasswd
anyname:$epr1$3HBDnu76$3KcMPoBcNj82v0sc/EGwx1
Пользователь и пароль готовы, теперь используем NGINX, чтобы установить пароль на сайт. Я включу его на весь домен отвечающий за PHPMyAdmin, ведь я точно не хочу чтобы случайные посетители имели доступ к нему. Для этого добавлю следующие строки в файл конфигурации NGINX для домена /etc/nginx/conf.d/pma.waky.ru.conf прямо в тело server:auth_basic "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
Целиком получится так:
# Settings for a TLS enabled server.
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pma.waky.ru;
root /usr/share/nginx/pma.waky.ru;
auth_basic "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
index index.php;
ssl_certificate "/etc/letsencrypt/live/pma.waky.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/pma.waky.ru/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Перезапускаем NGINX:nginx -s reload
и проверяем результат.

У нас получилось закрыть весь домен, давайте проделаем то же самое, но для отдельной страницы. Я хочу закрыть форму логина, чтобы боты не пытались ее ломать, но при этом оставить сам блог открытым для посетителей.
Добавим в конфигурацию основного домена /etc/nginx/conf.d/waky.ru.conf следующие строки:
location ~ /wp-login.php {
auth_basic "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
В этот раз мы помещаем auth_basic не в само тело server, а используем конкретную локацию — страницу логинаlocation ~ /wp-login.php
Полностью будет так:
# Settings for a TLS enabled server.
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name waky.ru;
server_name www.waky.ru;
root /usr/share/nginx/waky.ru;
index index.php;
ssl_certificate "/etc/letsencrypt/live/waky.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/waky.ru/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location ~ /wp-login.php {
auth_basic "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?$args;
index index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Пробуем открыть страницу логина https://waky.ru/wp-login.php

при этом основной сайт все так же доступен.