Как настроить базовую HTTP-аутентификацию на nginx

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

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

Подготовка

Очевидно, у вас должна быть копия nginx в вашей системе, прежде чем вы сможете ее настроить. Кроме того, вы должны установить утилиту Apache htpasswd для генерации хешированных паролей. В системах Debian/Ubuntu вы можете установить его с помощью:

sudo apt install apache2-utils

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

sudo yum install httpd-tools

Создание файла htpasswd

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

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

sudo touch /etc/nginx/htpasswd

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

sudo htpasswd /etc/nginx/htpasswd bob

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

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

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

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

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

sudo htpasswd -D /etc/nginx/htpasswd john

В следующем разделе мы настроим nginx для использования этого файла для ограничения доступа.

Конфигурирование nginx

Теперь откройте файл конфигурации для конкретного сайта с помощью редактора, такого как nano. Если вы используете Debian или Ubuntu, специфичная для сайта конфигурация присутствует в /etc/nginx/sites-available/default:

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

Однако, если вы используете другой дистрибутив Linux, он будет в /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf

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

server {
    # Many lines of configuration...

    location /files {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/htpasswd;
    }
}

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

sudo systemctl reload nginx

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

sudo service nginx reload

Теперь, если вы откроете веб-браузер для доступа к чему-либо из каталога /files, то будет запрошено имя пользователя и пароль:

browser

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

location /photos {
    # ...
}

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

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

В предыдущем примере мы ограничивали доступ к определенным каталогам на сервере. Что если вы хотите установить ограничение для всего сайта? Вы можете сделать это, переместив основные директивы аутентификации в блок server:

server {
     # Many lines of configuration...

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

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

location /files {
    auth_basic off;
}

Сочетание базовой аутентификации и других ограничений

До сих пор мы видели простые примеры базовой аутентификации. Nginx поддерживает множество ограничений, и их можно комбинировать различными способами. В этом разделе мы рассмотрим интересный случай: объединение ограничений 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 допускается без пароля. Для других пользователей мы возвращаемся к базовой аутентификации.

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

location /files {
    satisfy all;

    # Other directives...
}

Заключение

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

Если вам понравился этот пост, пожалуйста, поделитесь им.

Оставьте комментарий