Авторизация в Nginx по паролю

Привет, любители почитать бесполезную информацию!

Недавно мне понадобилось добавить базовую защиту на один из своих поддоменов через Nginx. Не то чтобы там что-то важное и вряд ли вообще это кого-то заинтересует. Но чтобы добавить хоть какой-то секурности, решил настроить парольную авторизацию на нем.

Конечно-же у меня есть AFFiNE, где я храню свои инструкции, но мало ли кому-то она еще пригодится 🙂

Когда полез настраивать, все оказалось довольно просто — для парольной защиты используется утилита htpasswd, которая обычно идёт с apache2-utils.
Устанавливаем эти утилиты на ubuntu:

sudo apt update
sudo apt install apache2-utils

При первом запуске нужно добавить флаг -c, чтобы создать файл с паролями. Например, я создал пользователя test:

sudo htpasswd -c /etc/nginx/.htpasswd test

После этого система попросит ввести и подтвердить пароль. Когда добавляете новых пользователей, -c больше не нужен, иначе файл перезапишется:

sudo htpasswd /etc/nginx/.htpasswd another_user

Если заглянуть в файл при помощи команды cat

cat /etc/nginx/.htpasswd

Увидите примерно такую картину:

username:password_hash

Затем нам нужно настроить Nginx так, чтобы он проверял эти пароли. Я открыл конфиг сервера при помощи редактора nano (у вас файл может называться по другому):

sudo nano /etc/nginx/sites-enabled/default

И внес такие изменения в конфигурацию:

Директива auth_basic включает проверку пароля, а auth_basic_user_file указывает на файл с учетками. Например, можно защитить весь сервер:

server {
    listen 80 default_server;

    ...

    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Или только определённый каталог через location:

server {
    listen 80 default_server;

    ...

    location / {
        try_files $uri $uri/ =404;
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Когда внес изменения, сохраняем файл и проверяем конфиг:

nginx -t
sudo systemctl reload nginx

Теперь выбранный каталог защищён паролем. На практике такое лучше использовать исключительно на тестовых страницах или страницах, где нет ничего важного…