HTTP Basic Auth позволяет закрыть паролем каталог, служебную страницу или всю тестовую копию сайта, не меняя ни строки кода приложения. Браузер сам покажет окно входа. Ниже: как создать файл паролей, настроить Nginx и Apache, закрыть страницу входа WordPress и чем такая защита ограничена.
Когда подходит Basic Auth
Это встроенный механизм веб-сервера: он проверяет логин и пароль до того, как запрос дойдёт до PHP или другого приложения. Он хорошо подходит в таких случаях:
- закрыть тестовую копию сайта от поисковых роботов и случайных посетителей;
- спрятать служебные страницы: панель базы данных, статистику, страницу входа в админку;
- добавить второй рубеж перед формой входа приложения.
Для публичных страниц с регистрацией клиентов он не годится: нет выхода из учётной записи, нет восстановления пароля и нет блокировки подбора.
Создаём файл паролей
Файл создаёт утилита htpasswd. Она входит в пакет apache2-utils в Debian и Ubuntu и в httpd-tools в семействе RHEL. Ключ -c создаёт файл и затирает существующий, поэтому для второго и последующих пользователей его не указывайте. Ключ -B выбирает bcrypt. Не передавайте пароль в командной строке ключом -b: он попадёт в историю команд.
sudo apt install apache2-utils
sudo dnf install httpd-tools
sudo htpasswd -B -c /etc/nginx/.htpasswd admin
sudo htpasswd -B /etc/nginx/.htpasswd editor
Файл не должен лежать в каталоге сайта. Разрешите чтение только владельцу и группе, под которой работает веб-сервер (например, www-data в Debian и Ubuntu), и проверьте вход вручную: если выбранный алгоритм сервер не принимает, вход не пройдёт.
Настройка в Nginx
Добавьте две директивы в блок server или в нужный location. Всё, что входит в префикс /admin/, потребует пароль.
location /admin/ {
auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Страницу входа WordPress закрывают точным совпадением. Директивы авторизации нужно добавить в тот блок, который передаёт запрос в PHP, иначе страница откроется без пароля.
location = /wp-login.php {
auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/.htpasswd;
# ... existing PHP directives
}
Проверьте конфигурацию и перечитайте её. Исключение для отдельного пути (например, для приёма уведомлений от платёжной системы) делается директивой auth_basic off в его location.
sudo nginx -t
sudo systemctl reload nginx
Настройка в Apache
В Apache правила кладут в файл .htaccess нужного каталога, если в конфигурации разрешено AllowOverride AuthConfig. Работа с этим файлом описана и в статье Редирект через .htaccess.
AuthType Basic
AuthName "Restricted area"
AuthUserFile /home/user/.htpasswd
Require valid-user
Путь в AuthUserFile должен быть абсолютным. Для одного файла вместо каталога используйте блок Files.
<Files "wp-login.php">
AuthType Basic
AuthName "Restricted area"
AuthUserFile /home/user/.htpasswd
Require valid-user
</Files>
Ограничения и защита от подбора
Basic Auth проще любого входа через форму, и у него есть слабые места. Прежде чем на него полагаться, учтите следующее. Выпуск сертификата описан в статье Nginx и Certbot.
- Логин и пароль кодируются, но не шифруются, и уходят с каждым запросом. Без HTTPS их увидит любой, кто слушает канал.
- Блокировки подбора нет: перебирать пароли можно сколько угодно.
- Если закрыть весь сайт WordPress, перестанут работать запросы к REST API с паролями приложений, потому что они тоже используют заголовок Authorization. Защищайте отдельные пути.
Для перебора поставьте fail2ban: он умеет читать журнал ошибок веб-сервера и банить адреса после неудачных входов. Настройка описана в статье Настройка fail2ban, а общие меры для Nginx собраны в статье Укрепление Nginx.
Частые вопросы
Как поставить пароль на сайт в Nginx?
Создайте файл паролей командой htpasswd, затем добавьте в нужный server или location директивы auth_basic с текстом приглашения и auth_basic_user_file с путём к файлу. Проверьте конфигурацию командой nginx -t и перечитайте её. После этого браузер будет запрашивать логин и пароль перед показом страниц.
Как закрыть паролем сайт на WordPress?
Проще всего закрыть паролем только страницу входа wp-login.php и каталог wp-admin, а не весь сайт. Так посетители и REST API продолжат работать. Для тестовой копии допустимо закрыть всё целиком. Помните, что без HTTPS пароль передаётся в открытом виде, поэтому сначала подключите сертификат.
Безопасен ли Basic Auth без HTTPS?
Нет. Логин и пароль передаются в каждом запросе в кодировке base64, которая не является шифрованием. Любой, кто перехватит трафик, прочитает их за секунду. Используйте Basic Auth только поверх HTTPS и дополняйте его блокировкой подбора через fail2ban, иначе пароль можно перебирать бесконечно.
Почему браузер не запрашивает пароль после правки?
Чаще всего не перечитана конфигурация Nginx, в Apache не разрешён AllowOverride AuthConfig, либо директивы стоят не в том блоке: запрос обрабатывает другой location, например тот, что передаёт его в PHP. Проверьте, какой блок реально отвечает за адрес, и перечитайте конфигурацию веб-сервера.