К некоторым компонентам и данным сайта доступ должен быть только у администратора и отдельных пользователей. Многие веб-приложения предоставляют собственные средства для аутентификации, но если стандартный метод по какой-либо причине не подходит, для ограничения доступа можно использовать сам веб-сервер.
Данный мануал поможет настроить парольную аутентификацию через Apache на сервере Ubuntu 18.04, благодаря чему у сервера появится дополнительный уровень безопасности.
Требования
- Предварительно настроенный сервер Ubuntu 18.04.
- Пользователь с доступом к команде sudo (создать такого пользователя можно с помощью этого мануала).
- Веб-сервер Apache2 (чтобы установить его, следуйте мануалу Установка веб-сервера Apache в Ubuntu 18.04).
- Поддержка SSL. Если у вас есть доменное имя, вы можете получить бесплатный SSL-сертификат от Let’s Encrypt. Если у вас нет зарегистрированного домена, вы можете создать самоподписанный сертификат.
Войдите в сессию вашего пользователя sudo и приступайте к работе.
1: Установка пакета apache2-utils
Для начала нам нужно установить на сервер пакеты, которые понадобятся нам в работе.
Чтобы создать файл для хранения паролей, понадобится утилита htpasswd. Она входит в пакет apache2-utils, который можно найти в стандартном репозитории.
Обновите индекс пакетов и установите apache2-utils с помощью следующих команд:
sudo apt update
sudo apt install apache2-utils
2: Создание файла паролей
Теперь у вас есть доступ к команде htpasswd, которая позволяет создавать файлы паролей. С помощью такого файла Apache будет выполнять аутентификацию пользователей. Создайте скрытый файл .htpasswd в каталоге /etc/apache2.
При первом запуске утилита требует флаг -c, который создаёт необходимый файл .htpasswd. Чтобы создать новую запись в файле, укажите в конце команды имя пользователя:
sudo htpasswd -c /etc/apache2/.htpasswd 8host
Команда запросит пароль текущего пользователя.
Чтобы добавить в этот файл данные других пользователей, используйте команду htpasswd без флага –с.
sudo htpasswd /etc/apache2/.htpasswd another_user
Теперь просмотрите содержимое файла; в нём должны быть имена пользователей и их зашифрованные пароли.
cat /etc/apache2/.htpasswd
8host:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/
another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1
3: Настройка аутентификации Apache
Файл паролей с необходимыми данными готов. Теперь нужно настроить Apache, чтобы он проверял этот файл перед обслуживанием закрытого контента. Это можно сделать двумя способами: добавить информацию о файле паролей в виртуальный хост или создать файлы .htaccess в тех каталогах, содержимое которых нужно защитить. Обычно использовать виртуальный хост удобнее. Но если в вашем случае обычные пользователи системы должны иметь возможность самостоятельно управлять доступом, лучше добавить файлы .htaccess.
Выберите наиболее подходящий метод настройки и следуйте инструкциям соответствующего раздела.
Вариант 1: Настройка аутентификации через виртуальный хост
Этот метод обеспечивает более высокую производительность, поскольку веб-серверу не придется читать дополнительные конфигурационные файлы. Для такой настройки вам нужен доступ к конфигурации, который есть не у всех пользователей.
Откройте файл виртуального хоста того сайта, доступ к которому нужно ограничить. В данном мануале используется стандартный файл default-ssl.conf , который поставляется вместе с apache.
sudo nano /etc/apache2/sites-enabled/default-ssl.conf
Внутри файл выглядит так (для удобства закомментированные строки опущены):
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
В Apache аутентификация настраивается на основе каталогов. Чтобы настроить ее, сначала найдите раздел каталога, к которому нужно ограничить доступ, в блоке <Directory ___>. Здесь мы для примера показываем, как ограничить доступ к корневому каталогу (а вы при необходимости укажите другой каталог):
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
</Directory>
</VirtualHost>
В блоке этого каталога нужно указать тип аутентификации (в данном случае это Basic). В AuthName укажите имя, которое будет отображаться при запросе учетных данных. В директиве AuthUserFile укажите созданный ранее файл паролей. Установите значение valid-user для директивы Require, чтобы разрешить доступ к контенту только зарегистрированным пользователям.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
Сохраните и закройте файл.
Проверьте файл на наличие ошибок:
sudo apache2ctl configtest
Команда должна вернуть:
Syntax OK
После этого можете перезапустить веб-сервер. Система systemctl не отображает на экране вывода некоторых команд управления сервером, потому состояние сервера после его перезапуска нужно запросить вручную:
sudo systemctl restart apache2
sudo systemctl status apache2
Теперь пользователь должен будет ввести пароль, чтобы просматривать каталог.
Вариант 2: Настройка аутентификации с помощью файлов .htaccess
Apache может управлять аутентификацией с помощью файлов .htaccess. При этом Apache перечитывает каждый такой файл, что, конечно, отражается на производительности. По этой причине мы рекомендуем настраивать веб-сервер согласно первому варианту. Вариант 2 подходит, если вы уже используете файлы .htaccess или хотите предоставить пользователям без прав root возможность управлять ограничениями.
Чтобы включить поддержку аутентификации по файлам .htaccess, откройте конфигурационный файл Apache:
sudo nano /etc/apache2/apache2.conf
Найдите блок <Directory> для каталога /var/www (document root по умолчанию). Чтобы включить поддержку файлов .htaccess, нужно изменить значение директивы AllowOverride с None на All.
. . .
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
Сохраните и закройте файл.
Затем нужно добавить файл .htaccess в тот каталог, доступ к которому вы хотите ограничить. Мы для примера покажем ниже, как закрыть доступ к каталогу document root, /var/www/html (то есть ко всему сайту). Чтобы ограничить доступ к другому каталогу, внесите в код соответствующие поправки.
sudo nano /var/www/html/.htaccess
В этом файле нужно указать тип аутентификации, в данном случае это Basic. В AuthName укажите имя, которое будет отображаться при запросе учетных данных. В директиве AuthUserFile укажите созданный ранее файл паролей. Для директивы Require укажите значение valid-user, чтобы открыть доступ к контенту только тем пользователям, которые могут пройти аутентификацию.
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Сохраните и закройте файл. Перезапустите веб-сервер, чтобы обновить настройки.
sudo systemctl restart apache2
sudo systemctl status apache2
4: Тестирование авторизации
Чтобы убедиться, что все необходимые каталоги теперь защищены паролем, попробуйте получить доступ к закрытому контенту в веб-браузере. На экране должна появиться форма аутентификации, предлагающая ввести имя пользователя и пароль:
Authentication Required
The server requires a username and password. The server says:
Restricted server.
User Name:
Password:
Введите валидные учётные данные, чтобы получить доступ к контенту. Если вы предоставите неправильные данные, сервер вернёт ошибку «Unauthorized».
Заключение
Теперь контент сайта защищён с помощью пароля. Парольную аутентификацию рекомендуется комбинировать с шифрованием SSL, в противном случае учетные данные будут передаваться на сервер в виде простого текста, а это очень серьёзная проблема для безопасности.
Читайте также: