Настройка HTTP Basic Auth (htpasswd) в Nginx и Apache: защита URL и API
- Ошибка
401 Unauthorizedпри вводе корректного пароля из-за неподдерживаемого алгоритма хеширования. - В логах Nginx ошибка
open() ".../.htpasswd" failed (13: Permission denied). - Необходимость закрыть доступ к Swagger, метрикам Prometheus или административной панели.
1. Установка утилиты и генерация .htpasswd файла
# Установка пакета apache2-utils / httpd-tools
apt-get install -y apache2-utils || dnf install -y httpd-tools
# Создание файла с безопасным хешированием bcrypt (-B)
mkdir -p /etc/nginx/auth
htpasswd -B -c /etc/nginx/auth/.htpasswd devops_admin
# Права доступа на чтение
chown root:www-data /etc/nginx/auth/.htpasswd
chmod 640 /etc/nginx/auth/.htpasswd2. Настройка HTTP Basic Auth в Nginx
Добавьте директивы в целевой location:
location /admin/ {
auth_basic "Restricted Administrator Area";
auth_basic_user_file /etc/nginx/auth/.htpasswd;
# Исключение для локальной офисной сети
satisfy any;
allow 192.168.1.0/24;
allow 10.100.0.0/16;
deny all;
proxy_pass http://backend_admin;
}3. Настройка HTTP Basic Auth в Apache HTTP Server
В блоке <Directory> или .htaccess:
<Directory "/var/www/html/admin">
AuthType Basic
AuthName "Restricted Administrator Area"
AuthUserFile /etc/nginx/auth/.htpasswd
Require valid-user
</Directory>4. Валидация и перезапуск
nginx -t && systemctl reload nginx || apachectl -k graceful Частые вопросы (FAQ)
Почему флаг -B (bcrypt) предпочтительнее стандартного crypt/MD5 в htpasswd?
Bcrypt использует медленную функцию формирования ключа с солью (cost factor), что делает подбор пароля по радужным таблицам и перебор на GPU вычислительно невозможным.
Что делает директива satisfy any в Nginx?
Она разрешает доступ клиенту, если выполнено ХОТЯ БЫ ОДНО из условий: либо клиент прошел проверку по белому IP адресу (allow), либо успешно ввел логин и пароль в HTTP Basic Auth.