🐹 Nginx: Базовая аутентификация. Как поставить пароль на раздел, директорию или каталог сайта? Утилита htpasswd.

Содержание:

1. Для чего это нужно?
2. Как настроить доступ по паролю.
3. Подготовка httpd-tools.
4. Файл htpasswd.

4.1. Описание файла htpasswd.
4.2. Создание файла htpasswd с помощью утилиты htpasswd.
4.3. Создание файла htpasswd с помощью утилиты openssl.
4.4. Создание файла htpasswd с помощью онлайн инструментов.

5. Ограничение на каталог.
6. Ограничение для всего сайта.
7. Объединение ограничений IP с базовой аутентификацией.
8. Доступ внутри сети, но без доступа вне сети.
9. Проверка работы htpasswd.
10. Оригиналы источников информации.


1. Для чего это нужно.

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

Бывают случаи, когда нужно ограничить доступ пользователей к определенной папке на сайте (разделу сайта) и пускать туда посетителей только по паролю. Например, в раздел администратора.

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

Ограничить доступ можно по IP-адресу или организовать одновременное ограничение доступа по адресу и паролю.

2. Как настроить доступ по паролю.

Во-первых, необходим файл с кодами авторизации, который содержит имена пользователей и их пароли.

Во-вторых, необходимо указать web-серверу, что доступ к этому разделу сайта (папка, директория) возможен только авторизованным пользователям.

3. Подготовка httpd-tools.

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

На CentOS 7 вы можете установить его так:

# yum -y install httpd-tools

4. Файл htpasswd.

4.1. Описание файла htpasswd.

Название файла с паролями может быть любое. Назовем его исторически — htpasswd, но скрытым (с точкой перед файлом) делать не будем.

Расположение файла тоже может быть любое!

Файл htpasswd содержит список имен пользователей и паролей. Nginx использует его для проверки учетных данных пользователей, которые хотят получить доступ к защищенным областям сайта.

Задаёт файл, в котором хранятся имена и пароли пользователей.

Формат файла следующий:

# комментарий
имя1:пароль1
имя2:пароль2:комментарий
имя3:пароль3

В имени файла можно использовать переменные.

Сначала создайте пустой файл с именем /etc/nginx/htpasswd примерно так:

# touch /etc/nginx/htpasswd

4.2. Создание файла htpasswd с помощью утилиты htpasswd.

Или просто заказать первичное создание этого файла у утилиты:

# htpasswd -c /etc/nginx/htpasswd admin

Флажок -c указываем, когда только создаем htpasswd первично, /etc/nginx/htpasswd — путь к файлику, а admin — нужный логин.

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

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

Например, если вы хотите добавить пользователя bob в файл, запустите:

# htpasswd /etc/nginx/htpasswd bob

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

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

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

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

# cat /etc/nginx/htpasswd

Вот файл, в котором есть два пользователя alice и bob:

alice:$apr1$Q9qBLkLy$YQNxI8/GYuHLmoOUkbjN70
bob:$apr1$5rz0Qz20$Xuo4c3yrZRjkAk89il7Us/

Это пароли пользователей, никому не рассказывайте!

Если вы хотите удалить пользователя из файла, используйте ключ -D следующим образом:

# htpasswd -D /etc/nginx/htpasswd john

4.3. Создание файла htpasswd с помощью утилиты openssl.

Если вы любите Nginx и давно не используете Apache, то устанавливать apache2-utils только ради утилиты htpasswd кажется глупым. И это верно. У вас на сервере, скорее всего уже есть openssl.

Используем его:

# printf "${USER}:`openssl passwd -apr1`\n"

${USER} — можно поменять на любое имя пользователя. Если оставить так, то будет подставлено текущее имя пользователя.

Пароль команда запросит ввести дважды.

Полученную строку копируем в файл htpasswd.

# mcedit /etc/nginx/htpasswd

4.4. Создание файла htpasswd с помощью стороннего сервиса.

Если вы не хотите устанавливать дополнительный софт, то можно создать файл воспользовавшись онлайн сервисом, например этим: htaccesstools.com.

Вводим туда необходимые данные:

  • username — желаемое имя пользователя,
  • password — желаемый пароль

И жмем кнопку «Create .htpasswd file».

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

Далее необходимо создать файл /etc/nginx/htpasswd и вставить в него эту строку, которую нам сформировал сайт.

# mcedit /etc/nginx/htpasswd

5. Ограничение на каталог.

Теперь откройте файл конфигурации для конкретного сайта с помощью редактора, такого как mcedit.

Рассмотрим на примере центральной конфигурации Nginx /etc/nginx/nginx.conf:

# mcedit /etc/nginx/nginx.conf

Пролистайте файл и найдите блок server. Сделав это, добавьте блок location для пути, который вы хотите защитить. Внутри этого блока вы должны установить имя области и путь к файлу htpasswd.

В приведенном ниже примере мы ограничили доступ ко всему в каталоге /files, и «имя области» установлено как «Restricted«. Имя области отображается браузерами и используется для определения защищенных частей веб-сайта.

server {
# Many lines of configuration…

location /files {
auth_basic "любой_ваш_текст_closed_site";
auth_basic_user_file /etc/nginx/htpasswd;
                }
        }

Если вы хотите защитить другой путь, просто добавьте еще один блок с тем же содержимым:

location /photos {
    # …
}

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

Сохраните файл и выйдите из редактора.

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

# systemctl restart nginx

6. Ограничение для всего сайта.

А если вы хотите установить ограничение для всего сайта?

Вы можете сделать это, переместив основные директивы аутентификации в блок server:

server {
# Many lines of configuration…

auth_basic "closed site";
auth_basic_user_file /etc/nginx/htpasswd;
   }

или так:

location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
   }

Вы также можете пропустить определенные пути, установив для auth_basic значение off в блоке location.

Например, следующий блок позволяет пользователям получить доступ.

location /files {
    auth_basic off;
    }

Директивы:

Синтаксис: auth_basic строка | off;
Умолчание: auth_basic off;
Контекст: http, server, location, limit_except

Включает проверку имени и пароля пользователя по протоколу “HTTP Basic Authentication”. Заданный параметр используется в качестве realm. В значении параметра допустимо использование переменных. Специальное значение off позволяет отменить действие унаследованной с предыдущего уровня конфигурации директивы auth_basic.

Синтаксис: auth_basic_user_file файл;
Умолчание:Контекст: http, server, location, limit_except

7. Объединение ограничений IP с базовой аутентификацией.

Скажем, у вас есть раздел на вашем сайте, предназначенный для использования сотрудниками компании. Любой сотрудник, обращающийся к веб-серверу из сети, может получить доступ к странице без использования пароля. Однако, если они пытаются получить к нему доступ через Интернет, им следует использовать пароль.

Это означает, что у нас должно быть два ограничения: ограничение IP и директива базовой аутентификации. Мы уже видели, как указать основные директивы аутентификации. IP-адреса могут быть разрешены или заблокированы с помощью директив allow и deny. Кроме того, вы можете указать Nginx выполнить одно из этих условий, используя satisfy any.

Таким образом, блок location может выглядеть примерно так:

location /files {
    satisfy any;

    allow 10.2.0.0/16;
    allow 10.3.155.26;
    deny all;

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

В приведенном выше примере любой пользователь с IP-адресом 10.2.0.0-10.2.255.255 и 10.3.155.26 допускается без пароля. Для других пользователей мы возвращаемся к базовой аутентификации.

Еще пример:

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

Правила проверяются в порядке их записи до первого соответствия. В данном примере доступ разрешён только для IPv4-сетей 10.1.1.0/16 и 192.168.1.0/24, кроме адреса 192.168.1.1, и для IPv6-сети 2001:0db8::/32.

Директивы:

Синтаксис: allow адрес | CIDR | unix: | all;
Умолчание:Контекст: http, server, location, limit_except

Разрешает доступ для указанной сети или адреса. Если указано специальное значение unix:, разрешает доступ для всех UNIX-сокетов.

Синтаксис: deny адрес | CIDR | unix: | all;
Умолчание:Контекст: http, server, location, limit_except

Запрещает доступ для указанной сети или адреса. Если указано специальное значение unix:, запрещает доступ для всех UNIX-сокетов.

8. Доступ внутри сети, но без доступа вне сети.

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

Чтобы внести это изменение, измените any на all:

location /files {
    satisfy all;

    # Other directives…
}

Пример ниже разрешает доступ, если все (all) или хотя бы один (any) из модулей разрешают доступ.

Пример:

location / {
    satisfy any;
    allow 192.168.1.0/32;
    deny all;

auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
     }

Директивы:

Синтаксис: satisfy all | any;
Умолчание: satisfy all;
Контекст: http, server, location

9. Проверка работы htpasswd.

Внимание! Если у вас открылся сайт без окошка авторизации, то просто страница сохранилась в кеше браузера. Перезагрузите страницу с Shift+F5 и увидите приглашение залогиниться. Работает!

Если вы все сделали правильно, то при посещении запароленной папки (раздела на сайте), вы должны увидеть примерно следующее уведомление:

При вводе неправильных данных вы получите стандартное сообщение о 401-й ошибке (несанкционированный доступ, посетитель не авторизован), а при корректных данных — доступ к закрытому разделу сайта.

10. Оригиналы источников информации.

  1. blog.listratenkov.com «Как настроить базовую HTTP-аутентификацию на nginx».
  2. webdevkin.ru «Базовая аутентификация в nginx. Закрываем админку магазина».
  3. sysadmin.ru «Как поставить пароль на сайт или каталог в Nginx».
  4. nginx.org«Модуль ngx_http_auth_basic_module».
  5. nginx.org «Модуль ngx_http_access_module».
  6. nginx.org «Модуль ngx_http_core_module».
  7. lyalyuev.info «Создаем htpasswd для nginx (без Apache)».