Ограничение доступа с помощью HTTP basic authentication

4 min read

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

На простом примере будет показана настройка доступа для веб-серверов Nginx и Apache.

Создание файла с ключами

Для создания пар пользователь-пароль воспользуемся утилитой htpasswd. Установить её можно следующей командой:

$ apt install apache2-utils

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

Рекомендуется разместить этот файл в рабочей директории  вашего веб-сервера /etc/nginx или /etc/apache2.

$ htpasswd -c /etc/nginx/.htpasswd user1

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

Если файл с ключами уже создан и вы добавляете уже не первого пользователя, то не нужно больше передавать ключ -c. Создадим второго пользователя.

$ htpasswd /etc/nginx/.htpasswd user2

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

$ cat /etc/nginx/.htpasswd

На каждой строчке есть имя пользователя и его зашифрованный пароль

user1:$apr1$cuyHIt1g$KBw/cVxx/0AwGg8Xab6yd/ user2:$apr1$FmoTpfYo$VTOJN10R98RRie7r7t46w1

Далее необходимо настроить веб-сервер Nginx или Apache, в зависимости от того, какой из них вы используете.

Настройка Nginx

Добавьте следующие директивы в конфигурационный файл вашего проекта.

Их можно использовать в контекстах: http, server, location, limit_except. Это значит, что можно, например, ограничить доступ ко всему серверу (файл /etc/nginx/nginx.conf):

http { ... auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; ... }

к определенному проекту:

server { ... auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; ... }

или к конкретному адресу в проекте:

server { ... location / { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; ... } }

Настройка Apache

Документация по модулю mod_authn_core доступна на официальном сайте.

Можно настроить обязательную проверку авторизации для всего сервера. Для этого в конфигурационном файле /etc/apache2/apache2.conf добавим в соответствующие теги Directory требование.

<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None # Require all granted AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory>

Если необходимо настроить доступ только к определенному хосту, то редактируем его конфигурационный файл

<VirtualHost *:80> DocumentRoot /var/www/html ... <Directory "/var/www/html"> AuthType Basic AuthName "Restricted Area" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> </VirtualHost>

Файл .htaccess

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

... AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user ...

Чтобы Apache мог применять настройки файлов .htaccess в проектах, необходимо установить для AllowOverride значение "All" в соответствующей директории в настройках сервера.

<Directory /var/www/> Options Indexes FollowSymLinks # AllowOverride None AllowOverride All Require all granted </Directory>

О том, как работать с файлом .htaccess можно прочитать в этой статье.

Результат

После перезагрузки сервера можно открыть страницу проекта и увидеть окно с просьбой авторизоваться.

Ссылки

Документация по модулю ngx_http_auth_basic_module для Nginx.

Документация по модулю mod_authn_core для Apache.