Авторизация на nginx — auth_basic

Иногда нужно закрыть сервис от посторонних глаз — не писать полноценную авторизацию, а просто добавить логин и пароль на уровне nginx. Это называется HTTP Basic Authentication.

Как это работает

Когда заходишь на защищённый URL, браузер показывает стандартное системное окно с полями «Имя пользователя» и «Пароль» — это не кастомная страница, а встроенное поведение браузера. Логин/пароль проверяет сам nginx по файлу .htpasswd.

Установка утилиты

Для создания файла паролей нужна утилита htpasswd из пакета apache2-utils:

apt install apache2-utils

Создание файла паролей

Создаём файл и добавляем первого пользователя:

htpasswd -c /etc/nginx/.htpasswd username

Флаг -c создаёт файл. Если файл уже есть и нужно добавить ещё одного пользователя — без -c:

htpasswd /etc/nginx/.htpasswd username2

Посмотреть содержимое файла:

cat /etc/nginx/.htpasswd
# username:$apr1$xyz...$hashedpassword

Пароли хранятся в хешированном виде — открытым текстом не лежат.

Настройка nginx

Добавляем в нужный location или весь server блок:

server {
    listen 443 ssl;
    server_name service.example.com;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:8080;
    }
}
  • auth_basic — текст заголовка который браузер показывает в окне входа. Можно написать любой, например "Admin Panel" или "Private". Именно его видно над полями логина и пароля.
  • auth_basic_user_file — путь к файлу с логинами и паролями.

Закрыть только часть сайта

Если нужно закрыть не весь сайт, а конкретный путь:

location /admin/ {
    auth_basic "Admin area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://127.0.0.1:8080;
}

Применить изменения

nginx -t && systemctl reload nginx

Удалить пользователя

htpasswd -D /etc/nginx/.htpasswd username

Важно

HTTP Basic Auth передаёт логин и пароль в base64. Это не шифрование — поэтому использовать только поверх HTTPS. Без SSL — пароль виден в трафике.

Комментарии

Комментариев пока нет.