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. Перевірте, який блок справді відповідає за адресу, і перечитайте конфігурацію вебсервера.