Настройка авторизации на основе пароля на Nginx в Ubuntu 14.04

Published by Leave your thoughts

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

Это руководство покажет, как настроить авторизацию на основе пароля на веб-сервере Nginx в Ubuntu 14.04.

Требования

Для выполнения руководства нужен не-root пользователь с правами sudo. Чтобы создать такой аккаунт, обратитесь к этому руководству.

Если сервер Nginx не был установлен ранее, установите его сейчас при помощи команд:

sudo apt-get update
sudo apt-get install nginx

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

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

Примечание: На Nginx файлы паролей используют тот же формат, что и на Apache.

Выберите наиболее подходящий метод и следуйте инструкциям соответствующего раздела.

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

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

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

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

Примечание: Замените условное имя 8host именем своего пользователя.

Затем добавьте в файл пароль пользователя в зашифрованном виде:

sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

Чтобы добавить в файл других пользователей, просто повторите вышеописанный процесс. Файл паролей содержит имена пользователей и их пароли в зашифрованном виде:

cat /etc/nginx/.htpasswd
8host:$apr1$wI1/T0nB$jEKuTJHkTOOWkopnXqC1d1

Создание файла паролей при помощи .htpasswd

Несмотря на то, что OpenSSL отлично справляется с поддержкой файла паролей для Nginx, большинство пользователей предпочитает использовать для этих целей утилиту htpasswd, которая находится в пакете apache2-utils.

Чтобы установить пакет утилит apache2-utils, введите:

sudo apt-get update
sudo apt-get install apache2-utils

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

При первом запуске этой утилиты нужно использовать флаг –c, который и создаёт необходимый файл. Укажите имя пользователя в конце команды, чтобы создать новую запись в файле:

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

Примечание: Замените условное имя 8host именем своего пользователя.

Программа предложит создать и подтвердить пароль для этого пользователя.

Чтобы добавить в файл паролей других пользователей, просто используйте команду htpasswd без флага –с:

sudo htpasswd /etc/nginx/.htpasswd another_user

Просмотрите содержимое файла, чтобы убедиться, что учётные данные внесены правильно:

cat /etc/nginx/.htpasswd
8host:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

Настройка авторизации Nginx

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

Откройте конфигурационный файл блока server (так называется виртуальный хост Nginx) для сайта, доступ к контенту которого нужно ограничить. В данном примере используется стандартный блок default, который поставляется в Ubuntu по умолчанию.

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

Раскомментированный файл выглядит так:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}

Чтобы настроить авторизацию, нужно выбрать контекст ограничения доступа. Веб-сервер Nginx позволяет ограничивать доступ к контенту на уровне сервера или же по определённому адресу. В данном примере мы ограничим доступ к каталогу document root при помощи блока location (при необходимости укажите другой каталог).

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

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}

Сохраните и закройте файл. Перезапустите Nginx, чтобы обновить конфигурации.

sudo service nginx restart

Теперь контент, находящийся в этом каталоге, защищён паролем.

Тестирование авторизации

Чтобы убедиться, что нужные каталоги защищены паролем, попробуйте получить доступ к закрытому контенту в браузере. Если настройка прошла успешно, на экране должна появиться форма авторизации, предлагающая ввести имя пользователя и пароль:

Authentication Required
The server requires a username and password. The server says:
Restricted server.
User Name:
Password:

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

Заключение

Теперь контент сайта защищён паролем. Обратите внимание: защиту паролем следует комбинировать с шифрованием SSL, в противном случае учетные данные будут передаваться  на сервер в виде простого текста, а это очень серьёзная уязвимость для безопасности.

Примечание: Чтобы узнать, как создать SSL-сертификат для Nginx, читайте это руководство.

Tags: , , ,

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>