Настройка парольной аутентификации через Nginx

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

Требования

  • Виртуальный сервер, а также пользователь sudo для выполнения административных задач. В этом мануале мы используем сервер Ubuntu 22.04, настроенный согласно этим инструкциям.
  • Предустановленный веб-сервер Nginx (инструкции вы найдете здесь).

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

Для начала нужно создать файл, в котором будут храниться учетные данные – комбинации имен и паролей. Сделать это можно с помощью утилит OpenSSL, которые, возможно, уже доступны на вашем сервере. Кроме того, вы можете использовать специальную утилиту htpasswd, включенную в пакет apache2-utils (файлы паролей в Nginx используют тот же формат, что и в Apache). Выберите тот метод, который вам больше нравится.

Создание файла с помощью утилит OpenSSL

Если на вашем сервере уже установлен OpenSSL, вы можете создать файл паролей без установки дополнительных средств. Для этого нужно создать в конфигурационном каталоге /etc/nginx скрытый файл .htpasswd для хранения учетных данных.

Вы можете добавить имя пользователя в файл с помощью следующей команды. Здесь в качестве условного имени используется 8host; просто укажите любое другое имя:

sudo sh -c "echo -n '8host:' >> /etc/nginx/.htpasswd"

Повторите этот процесс, если хотите добавить новых пользователей. Чтобы посмотреть, как имена пользователей и зашифрованные пароли хранятся в файле, откройте его:

cat /etc/nginx/.htpasswd

Вы увидите:

8host:$apr1$wI1/T0nB$jEKuTJHkTOOWkopnXqC1d1

Создание файла паролей с помощью apache2-utils

OpenSSL может шифровать пароли, но многим пользователям проще использовать вместо этого инструмента специальную утилиту. Утилита htpasswd из пакета apache2-utils хорошо выполняет эту функцию.

Установите пакет apache2-utils на свой сервер:

sudo apt update
sudo apt install apache2-utils

Теперь у вас есть доступ к команде htpasswd.  С ее помощью вы можете создать файл паролей, который Nginx может использовать для аутентификации пользователей. Создайте для этой цели скрытый файл .htpasswd в каталоге /etc/nginx.

При первом использовании этой утилиты нужно добавить флаг -c, который создаст требуемый файл. Укажите имя пользователя (мы используем условное имя 8host) в конце команды, чтобы создать новую запись.

sudo htpasswd -c /etc/nginx/.htpasswd 8host

Вам будет предложено ввести и подтвердить пароль для данного пользователя.

Аргумент -c нужно использовать при добавлении новых пользователей в файл:

sudo htpasswd /etc/nginx/.htpasswd another_user

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

cat /etc/nginx/.htpasswd

Вы получите:

8host:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

2: Настройка пароль аутентификации Nginx

Теперь, когда у нас есть файл с пользователями и паролями в том формате, который может прочитать Nginx, нам нужно настроить Nginx для проверки этого файла.

Откройте конфигурационный файл server блока, контент которого вы хотели бы защитить паролем. Здесь мы просто используем блок server по умолчанию, установленный вместе с пакетом Ubuntu Nginx:

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

Чтобы настроить аутентификацию, вам нужно выбрать контекст, на который распространится ограничение. Помимо прочего, Nginx позволяет устанавливать ограничения на уровне сервера или внутри определенного блока location.

В этом примере мы установим ограничение на уровне сервера. Директива auth_basic включает аутентификацию и отображает имя области, которое пользователь увидит при запросе учетных данных. Директива auth_basic_user_file покажет Nginx, где находится созданный вами файл паролей.

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, чтобы применить изменения:

sudo systemctl restart nginx

Указанный вами каталог теперь должен быть защищен паролем.

3: Тестирование аутентификации

Чтобы убедиться, что требуемый контент действительно защищен, попробуйте получить доступ к нему в веб-браузере:

http://server_domain_or_IP

На экране должна появиться форма, в которую вы должны ввести имя пользователя и пароль:

Если вы введете правильные учетные данные, вы получите доступ к контенту. В случае ввода неправильных учетных данных или нажатия Cancel вы увидите страницу с ошибкой «401 Authorization Required».

Заключение

Теперь у вас есть все необходимое для настройки базовой аутентификации на вашем сайте. Имейте в виду, парольную аутентификацию следует поддержать шифрованием TLS, чтобы ваши учетные данные не отправлялись на сервер в виде простого текста.

Читайте также: Создание сертификата Let’s Encrypt для Nginx

Tags: , , ,

Добавить комментарий