Как веб-администратор, вы можете счесть полезным ограничить доступ посетителей к некоторым частям веб-сайта, будь то временно или на постоянной основе. Хотя веб-приложения могут предоставлять свои собственные методы проверки подлинности и авторизации, вы также можете полагаться на сам веб-сервер, чтобы ограничить доступ по тем или иным причинам.
В этом руководстве вы узнаете, как защитить паролем ресурсы на веб-сервере Apache, работающем в Debian или Ubuntu, чтобы обеспечить вашему серверу дополнительную безопасность. Данная инструкция также применима к производным этих дистрибутивов, в том числе к Linux Mint и Kali Linux.
Если вы хотите настроить базовую аутентификацию на Apache в Windows, то смотрите статью «Как защитить папку Apache паролем в Windows».
Предполагается, что вы уже установили веб-сервер Apache, если нет, то смотрите инструкции:
- Как установить веб-сервер Apache с PHP 7, MariaDB/MySQL и phpMyAdmin (LAMP) на Ubuntu
- Установка веб-сервера (Apache, PHP, MySQL, phpMyAdmin) на Linux Mint
Также крайне желательно, чтобы вы использовали HTTPS протокол, который делает невозможным перехвату логина и пароль.
Также нам потребуются инструменты из пакета apache2-utils:
sudo apt update sudo apt install apache2-utils
Чем различаются HTTP Basic и Digest аутентификации
HTTP Basic и Digest аутентификации предназначены для контроля доступа на уровне веб-сервера. Если при попытке открыть веб-страницу или войти в настройки роутера вы видите такое окно:
Для конечного пользователя Basic и Digest выглядят одинаково. С технической точки зрения они различаются тем, что при Basic аутентификации пароль передаётся в открытом виде, а при Digest пароль зашифрован. Но официальная документация Apache рекомендует не полагаться на шифрование Digest, поскольку оно слишком слабое, а вместо этого использовать Basic аутентификацию в паре с HTTPS, чтобы невозможно было перехватить логин и пароль.
Как включить HTTP Basic аутентификацию в Apache (Kali Linux, Ubuntu, Debian, Linux Mint)
Для начала нужно включить поддержку файлов .htaccess, чтобы веб-сервер использовал настройки из этих файлов — по умолчанию это отключено.
Откройте файл /etc/apache2/apache2.conf
sudo gedit /etc/apache2/apache2.conf
Найдите группу строк:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
и замените её на:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Сохраните и закройте файл.
Перезапустим веб-сервер.
sudo systemctl restart apache2.service
Создайте папку, где будут защищённые паролем файлы:
sudo mkdir /var/www/html/basic-protected
С помощью утилиты htpasswd мы создадим файл с именем пользователя и хешем пароля. Если указана опция -c, то старый файл будет удалён, а новый создан. Утилита htpasswd присутствует и в Apache для Windows, но нужно указать полный путь до неё.
Общий вид команды:
sudo htpasswd -c -B /ПУТЬ/ДО/ФАЙЛА/.htpasswd ПОЛЬЗОВАТЕЛЬ
Пример:
sudo htpasswd -c -B /etc/apache2/.htpasswd mial
Опция -B означает использовать для шифрования пароля bcrypt. В настоящее время это считается очень безопасным. Для наших тестов это безразлично, но для реальной защиты папки или сайта паролем рекомендуется выполнять показанные выше команды с опцией -B. В дополнении к этой опции вы можете использовать флаг -C со значением от 4 до 17. Он устанавливает время вычисления, используемое для алгоритма bcrypt (чем выше, тем безопаснее, но медленнее). Значением по умолчанию является 5.
Если файл .htpasswd уже существует, то для добавления ещё одного пользователя, без удаления старых, используйте эту же команду, но без опции -c:
sudo htpasswd -B /etc/apache2/.htpasswd user1
Для смены пароля, вновь используйте эту же команду без опции -c, указав имя пользователя, чей пароль вы хотите поменять.
Конечно же файл .htpasswd рекомендуется хранить в директориях, не доступных для постороннего доступа (например, /etc/apache2/.htpasswd). Особенно не нужно его хранить в папках веб-сервера вместе с файлами сайтов. Но иногда веб-мастер в силу простоты или невозможности сохранить файл где-либо ещё (на виртуальных хостингах, например) хранит этот файл прямо вместе с файлами сайтов.
Посмотрим содержимое файла .htpasswd:
cat /etc/apache2/.htpasswd
У меня это:
mial:$2y$05$xq4u60Y/nruX65hCk9kY1.n8sZ/E3/blHLXSL4GIdMsb2NPEFO2xG user1:$2y$05$Z1Rb4AhtksDLgMt.weXo..28NGNDbs5nTIyViMyUG1tXbWVQrlxDy
Теперь создадим файл .htaccess:
sudo gedit /var/www/html/basic-protected/.htaccess
И скопируем в него:
AuthName "For registered members only" AuthType Basic Require valid-user AuthUserFile /etc/apache2/.htpasswd
Откройте в веб-браузере адрес http://localhost/basic-protected/ - вы должны увидеть форму для ввода имени пользователя и пароля.
Опция -B означает использовать для шифрования пароля bcrypt. В настоящее время это считается очень безопасным. Для наших тестов это безразлично, но для реальной защиты папки или сайта паролем рекомендуется выполнять показанные выше команды с опцией -B. В дополнении к этой опции вы можете использовать флаг -C со значением от 4 до 17. Он устанавливает время вычисления, используемое для алгоритма bcrypt (чем выше, тем безопаснее, но медленнее). Значением по умолчанию является 5.
Как включить HTTP Digest аутентификацию в Apache (Kali Linux, Ubuntu, Debian, Linux Mint)
По умолчанию модуль Digest аутентификации отключён, включим его:
sudo a2enmod auth_digest
Если вы ещё этого не сделали, включите поддержку файлов .htaccess, чтобы веб-сервер использовал настройки из этих файлов — по умолчанию это отключено.
Откройте файл /etc/apache2/apache2.conf:
sudo gedit /etc/apache2/apache2.conf
Найдите группу строк:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
и замените её на:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Сохраните и закройте файл.
Перезапустим веб-сервер.
sudo systemctl restart apache2.service
Создайте папку, где будут защищённые паролем файлы:
sudo mkdir /var/www/html/digest-protected
Для генерации паролей нужно использовать команду htdigest. Если указать опцию -c, то будет создан новый файл, а старый удалён.
Общий формат команды:
sudo htdigest -c /etc/apache2/.digest_pw REALM ПОЛЬЗОВАТЕЛЬ
REALM — это область применения. Она соответствует директиве AuthName в файле .htaccess. То есть можно для одного пользователя установить разные пароли, изменяя значения REALM. В разных директивах можно менять значение AuthName в файле .htaccess и в зависимости от этого значения будет подходить тот или иной пароль.
Примеры команд:
sudo htdigest -c /etc/apache2/.digest_pw USERS mial sudo htdigest /etc/apache2/.digest_pw USERS user1
Посмотрим содержимое файла .htpasswd:
cat /etc/apache2/.digest_pw
Пример содержимого файла:
mial:USERS:48e54f80673b884a8d6f23f48aa2ade3 user1:USERS:8033e1980bcfb694719ae72793c792ec
Теперь создадим .htaccess:
sudo gedit /var/www/html/digest-protected/.htaccess
И скопируем в него следующее:
AuthName "USERS" AuthType Digest Require valid-user AuthUserFile /etc/apache2/.digest_pw AuthDigestDomain /
Отроем в веб-браузере адрес http://localhost/digest-protected/ и убедимся, что теперь для доступа к странице необходим пароль.
Аутентификация Basic и Digest в настоящее время считаются слабыми. Если вам нужно использовать какую-то из них, то рекомендуется Basic в паре с HTTPS, чтобы невозможно было перехватить пароль, поскольку хотя Digest и не пересылает пароль в открытом виде, он очень быстр для брут-форса.
Связанные статьи:
- Защита контента веб-сайта (63.5%)
- Решение пробем с ошибкой .htaccess: Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration (63.5%)
- Как в PHP 8 показать все ошибки (63.5%)
- Как сбросить пароль root для MySQL или MariaDB (56.5%)
- Решение проблемы с ошибкой Symbolic link not allowed или link target not accessible (52.3%)
- Как запустить MySQL/MariaDB с указанием другой директории data (RANDOM - 50%)