Защита папки паролем на Web-сервере Apache

В жизни всякое бывает, часто приходится ограничивать доступ к разным данным. Такие данные могут быть размещены на Web-сервере и видны в Интернет. Чтобы ограничить доступ к такой информации можно придумать разные ухищрения, но самым популярным способом есть установка пароля. Всё очень просто: мы выставляем на папку в файлами пароль и чтобы в неё попасть, пользователь должен будет вводить пароль. Если пароль сообщить только нужным людям, то доступ к информации будет ограничен.

Итак, если мы используем один их самых популярных Web-серверов Apache, то мы вполне можем реализировать это. Для этого в комплекте есть специальные модули.

Базовая аутентификация через mod_auth_basic

Самый распространённый тип аутентификации, поскольку модуль mod_auth_basic установлен если не на 95%, то хотя бы на 80% серверов. А это уже немало. Суть такова. Пользователь пытается получить доступ к данным и тут оказывается, что папка защищена. Браузер спрашивает у пользователя его логин и пароль. Далее пользователь даёт свои реквизиты, после чего бразуер отправляет эти сведения серверу. Далее идёт проверка одним из модулей семейства mod_authn_ (или mod_authnz_). Если реквизиты правильные, то пользователь получает доступ к чему хотел. Если же нет, браузер спрашивает ещё раз. Он будет так делать до тех пор, пока не получить правильные реквизиты или пользователь не откажется, назав Esc или Cancel. Случае отказа сервер выдаст ошибку 401 Authorization Required.

Самым распространённым модулем проверки правильности логина и пароля есть mod_authn_file. Он предусматривает сохранение базы логинов и паролей в файле специального формата. Простейшая конфигурация для защиты папки паролем выглядит так:

AuthType Basic # указание использовать mod_auth_basic
AuthName "Restricted Area" # фраза, которая будет присутсвовать при запросе пароля
AuthBasicProvider file # указание использовать mod_authn_file
AuthUserFile /var/www/localhost/etc/.htpasswd # путь к файлу с паролями
Require valid-user # указание впускать только любые правильные реквизиты

Путь к файлу с паролями нужно указывать абсолютный, иначе будет произведён его поиск в каталоге, заданному директивой ServerRoot. Если сервер не является Вашей собственностью и Вы там не админ (ну например это какой-то хостинг), то скорее всего файл будет размещён где-то в DocumentRoot или рядом. Если абсолютный путь DocumentRoot Вам никто не сообщил, то его можно вычислить например фот таким PHP-скриптом:

<?php
echo __FILE__;

Скрипт покажет своё абсолютное расположение. Ну а далее уже несложно догадаться. Кстати явно указывать на использование mod_authn_file нет нужды, так как это предусматривается по умолчанию. Последняя строка тоже может меняться в зависимости от необходимого результата. В приведённом выше примере правильными считаются любые реквизиты, которые находяться в файле /var/www/localhost/etc/.htpasswd. Но можно проверять и немного не так. Если в этом файле находятся много реквизитов и не всем нужно дать доступ, то можно немного разнообразить это дело.

Require user alex damien

Этот пример пропустит только позователей alex и damien. Можно прописать много пользователей по аналогии, но это бывает не очень удобно, особенно если тысячи их. Данный функционал обеспечивается модулем mod_authz_user.

Групповая авторизация посредством mod_authz_groupfile

И тут на помощь может прийти разделение пользователей на группы. Это есть удобно. Для этого создадим файлик с группами, назовём его например /var/www/localhost/etc/.htgroup. Запишем нашу группу пользователей:

group1: alex damien

И так для кажой группы. Сколько груп, столько и сторок. В нашу конфигурацию добавим директиву:

AuthGroupFile /var/www/localhost/etc/.htgroup

И наконец укажем какую группу надо пропускать:

Require group group1

Можно указать и несколько, по аналогии с неколькими юзерами (т.е. через пробел).

Создание файла с паролями

Всё это конечно хорошо, но как создать файл с паролями я так и не сказал. А создать его очень просто. Для этого в комплекте с Apache HTTP-server есть программа htpasswd, предназначенная как раз для этого. Порядок работы с ней таков:

$ htpasswd /var/www/localhost/etc/.htpasswd alex

Программа запросит пароль для пользователя alex. Если файл ещё не существует, то нужно запускать программу с ключом -c:

$ htpasswd -c /var/www/localhost/etc/.htpasswd alex

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

Кстати пользоваться этой программой можно и на другом компе, а файл просто скопировать на сервер. Это может понадобится, когда к серверу нет доступа по ssh.

Дайджестная аутентификация через mod_auth_digest

У базовой атентификации есть недостаток. Логин и пароль пользователя передаются в открытом виде. Это даёт возможность перехватить сетевой пакет и вытянуть с него логин и пароль. Для избежания этого применять базовую аутентификацию не рекомендуется, если есть возможность использовать дайджестную. Браузер в этом случае вместо логина и пароля передаёт дайджест от строки:

login:realm:password

Дайджест расшифровать невозможно, поэтому и достать из него что-то быстро тоже не получится (но метод перебора никто не отменял). Но использование дайджеста не рекомендуют в связи с тем, что якобы не всё браузеры его поддерживают. Это наглая дезинформация, на сегодня всеиспользуемые браузеры её поддерживают, а если какой-то Internet Explorer что-то там не понимает, то это не наши проблемы. Более правдивым аргументом против дайджестной аутентификации есть немоддержка её сервером, тоесть отсутсвие модуля mod_auth_digest. Чтобы всё было хорошо, его необходимо установить.

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

AuthType Digest # указание использовать mod_auth_digest
AuthName "Restricted Area" # фраза, которая будет присутсвовать при запросе пароля
AuthDigestProvider file # указание использовать mod_authn_file
AuthUserFile /var/www/localhost/etc/.htdigest # путь к файлу с паролями
Require valid-user # указание впускать только любые правильные реквизиты

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

Остаётся только рассказать как создать файл с паролями. Делается это посредством программы htdigest, которая как ни странно тоже идёт в комплекте с Apache. Использовать так:

$ htdigest /var/www/localhost/etc/.htdigest "Restricted Area" alex

Программа запросит пароль для пользователя alex. То, что в командной строке написано перед логином пользователя называется realm, и должно соосветсвовать значению директивы AuthName. Таким образом можно в одном файле держать пароли для разных realm и иметь для них разные пароли. Для создания нового файла с пароля предназначен ключ -c, который как ни странно применяется так же как и для htpasswd.

Куда это прописать?

Ну и напоследок обязательно нужно упомнить куда это писать. Тут вариантов немного: конфиги httpd или .htaccess. В первом случае конфигурацию нужно заключить между парной директивы Directory с указанием нужной папки, или же Location с указаним нужного расположения. Вроде можно так же юзать LocationMatch и DirectoryMatch, но лично не проверял, не ручаюсь.

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

AllowOverride AuthConfig

или же вообще:

AllowOverride All

Вот впринципе и всё. Конечно эта статья не исчерпывает всех возможностей аутентификации средствами самого Apache. Там ещё много и много интересного. Подробнее лучше консультироваться с оффициальной документацией.