Базовая аутентификация — самый быстрый способ спрятать тестовый сайт, каталог администрирования или приватный инструмент за окном входа. Это руководство охватывает Apache и Nginx на вашем VPS Linux Infrawire с файлом паролей, созданным через htpasswd.
📋 Требования
- Linux VPS (Ubuntu 24.04 / Debian 12 или AlmaLinux 9 / Rocky 9) с root-доступом по SSH. IP-адрес и root-пароль находятся в личном кабинете.
- Apache или Nginx, уже обслуживающий сайт.
- Действующий сертификат HTTPS для
example.com. Базовая аутентификация передаёт пароль в кодировке Base64, а это не шифрование: никогда не используйте её по обычному HTTP.
📦 Установка утилиты htpasswd
Команда htpasswd входит в небольшой пакет, даже если вы используете Nginx:
Bash# Debian / Ubuntu sudo apt install -y apache2-utils # AlmaLinux / Rocky sudo dnf install -y httpd-tools
🔐 Создание файла паролей
Храните файл вне корня веб-сервера, чтобы его нельзя было скачать:
Bashsudo mkdir -p /etc/htpasswd sudo htpasswd -c -B /etc/htpasswd/example.com USER
-B использует bcrypt. -c создаёт файл: применяйте его только для первого пользователя, так как для существующего файла он перезапишет всё (разрушительная операция). Остальных пользователей добавляйте без -c:
Bashsudo htpasswd -B /etc/htpasswd/example.com USER2
Веб-сервер должен иметь возможность читать файл:
Bash# Debian / Ubuntu (Apache и Nginx работают от www-data) sudo chown root:www-data /etc/htpasswd/example.com # AlmaLinux / Rocky: группа apache (Apache) или nginx (Nginx) sudo chmod 640 /etc/htpasswd/example.com
Чтобы удалить пользователя: sudo htpasswd -D /etc/htpasswd/example.com USER2.
🪶 Вариант A: Apache с .htaccess
Поместите файл .htaccess в защищаемый каталог, например /var/www/example.com/private/.htaccess:
ApacheAuthType Basic AuthName "Закрытая зона" AuthUserFile /etc/htpasswd/example.com Require valid-user
Файлы .htaccess игнорируются, пока виртуальный хост их не разрешит. В блоке <Directory> (файл в /etc/apache2/sites-available/ в Debian/Ubuntu, /etc/httpd/conf.d/ в AlmaLinux/Rocky):
Apache<Directory /var/www/example.com> AllowOverride AuthConfig </Directory>
Затем проверьте и перезагрузите:
Bashsudo apachectl configtest sudo systemctl reload apache2 # Debian / Ubuntu sudo systemctl reload httpd # AlmaLinux / Rocky
Если не хотите использовать .htaccess, поместите четыре строки аутентификации прямо в блок <Directory> или <Location>: так быстрее и безопаснее.
🚀 Вариант B: Nginx с auth_basic
Nginx не читает .htaccess. Добавьте директивы в блок server:
Nginx1server { 2 listen 443 ssl; 3 server_name example.com; 4 # строки ssl_certificate здесь 5 6 location /private/ { 7 auth_basic "Закрытая зона"; 8 auth_basic_user_file /etc/htpasswd/example.com; 9 } 10}
Чтобы защитить весь сайт, поместите эти две строки в блок server. Чтобы оставить открытым один путь внутри защищённого сайта (например, вебхук), добавьте auth_basic off; в его собственный location. Затем:
Bashsudo nginx -t && sudo systemctl reload nginx
✅ Проверка
Без учётных данных вы должны получить 401, с учётными данными — 200:
Bashcurl -I https://example.com/private/ curl -I -u USER https://example.com/private/
Ожидаемый первый ответ:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Закрытая зона"
curl запрашивает пароль, если указать только -u USER, и он не попадает в историю оболочки.
🛠️ Устранение неполадок
В Apache не появляется окно входа. AllowOverride всё ещё None либо .htaccess лежит не в том каталоге. Перепроверьте блок <Directory> и перезагрузите.
Всегда 401 при верном пароле. Веб-сервер не может прочитать файл (проверьте chown и chmod) либо путь в AuthUserFile или auth_basic_user_file указан неверно. Причина видна в журнале ошибок: /var/log/apache2/error.log, /var/log/httpd/error_log или /var/log/nginx/error.log.
Ошибка 500 после добавления .htaccess. Директива некорректна или не хватает модуля. Выполните sudo apachectl configtest и прочитайте сообщение.
Запрос пароля по HTTP. Сначала настройте редирект с HTTP на HTTPS, чтобы учётные данные никогда не передавались открыто.
🎉 Ваш приватный каталог теперь требует вход: пароли хранятся в виде хешей вне досягаемости и передаются только по HTTPS.