Введение
Сначала, давай, вспомним, что же подразумевается под понятиями
"аутентификация" и
"авторизация".
"Аутентификацией" называется процесс проверки подлинности пользователя, т.е. пользователь Вася Иванов, каким-то способом подтверждает, что за компьютером в настоящий момент находится действительно он, а не кто-нибудь другой. Для этого чаще всего используется пара логин-пароль, но для реально секретных ресурсов могут применяться и более надёжные способы, например, сканирование отпечатка пальца или сетчатки глаза.
"Авторизация" происходит после успешного входа пользователя в систему и определяет к каким именно ресурсам может получить доступ данный пользователь. Так, например, Вася Иванов может, иметь доступ к модерированию раздела
"Статьи" на сайте
www.example.com, но доступ к модерированию раздела
"Вопрос-Ответ" для него будет закрыт.
Apache поддерживает 2 вида аутентификации:
Basic-аутентификацию (Базовая аутентификация) и
Digest-аутентификацию (Дайджест аутентификация). Подробно механизмы аутентификации описаны в
RFC 2617, здесь будет дано только краткое описание.
Настраивается аутентификация либо в файле
httpd.conf, либо в файле
.htaccess. При настройке посредством
.htaccess, необходимо сначала убедиться, что директива
AllowOverride в файле
httpd.conf разрешает получение настроек из файла
.htaccess. Директива
AllowOverride может принимать следующие значения:
AllowOverride None - файлы
.htaccess игнорируются веб-сервером. Данное значение оказывает положительное влияние на быстродействие веб-сервера.
AllowOverride All - обрабатываются все без исключения директивы из файлов .htaccess.
AllowOverride AuthConfig - разрешены директивы аутентификации-авторизации, такие как
AuthName,
AuthType,
AuthUserFile,
AuthGroupFile,
Require и т.д.
Так же, директива
AllowOverride может принимать ряд других значений, но к аутентификации-авторизации они отношения не имеют.
1. Basic-аутентификация
Basic-аутентификация работает так - клиент шлёт запрос на доступ к защищённой области
Код:
GET /site/private HTTP/1.0
Сервер присылает ответ:
Код:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="private"
После получения ответа, клиентский браузер отображает окно, примерно такого вида
куда нужно ввести логин и пароль. После ввода логина и пароля на сервер отправляется такой запрос
Код:
GET /site/private HTTP/1.0
Authorization: Basic YWRtaW46MTIzNDU=
В зависимости от правильности введённых данных сервер, либо разрешит доступ к защищаемому ресурсу, либо запретит.
Главным минусом Basic-аутентификации является то, что все данные пересылаются через сеть в открытом виде, т.е. любой желающий из твоей локалки может отснифать эти данные и поиметь доступ к тем же ресурсам, что и ты. Во избежание подобных казусов рекомендуется дополнительно использовать SSL-шифрование. Если ты внимательно посмотришь на последний пример, то заметишь, что строчка
, есть ни что иное как
, закодированное при помощи
Base64 алгоритма.
Теперь, попробуем замутить такую аутентификацию на практике. Для этого потребуется:
+ Создать файл с паролями.
+ Прописать защищаемый ресурс в конфигурацию Apache (в файле httpd.conf или в файле .htaccess).
+ Создать файл для работы с группами и настроить групповой доступ (этот пункт не является обязательным).
+Создаём файл с паролями.
Для этой цели используется утилита
htpasswd, входящая в стандартную поставку сервера Apache. Запускается она так:
Код:
htpasswd -c [путь к файлу с паролями] [имя пользователя]
Ключ
-с используется при первом запуске
htpasswd и указывает на то, что нужно создать новый файл. Если файл с таким именем уже существует - он будет затёрт.
Пример:
Код:
htpasswd -c /var/www/html/secret/.htpasswd adm
Результат:
После запуска команды, будет дважды запрошен пароль для пользователя adm, после чего будет создан файл
/var/www/html/secret/.htpasswd содержащий такую строчку
Рассмотрим, остальные ключи
htpasswd:
-n Результат работы
htpasswd (имя пользователя:хеш пароля) будет выведен на экран, а не в файл.
-p Пароль хранится в виде обычного текста безо всякого шифрования. Данный формат поддерживается только в операционных системах Windows, Netware и BEOS.
Пример: -d Хеш пароля вычисляется с использованием стандартной Unix-функции
CRYPT. Это алгоритм шифрования по умолчанию. Используется только на *nix серверах.
Пример: John The Ripper определил хеш как Standard DES [24/32 4K]
-m Хеш пароля вычисляется по алгоритму MD5.
Пример:
Код:
adm:$apr1$kCYEN/..$Ii.SRRJ77C.bB2.nOSZHI1
-s Хеш пароля вычисляется по алгоритму SHA1.
Пример:
Код:
adm:{SHA}jLIjfQZ5yojbZGTqxg2pY0VROWQ=
-D Заданный пользователь удаляется из файла с паролями.
+Прописываем защищаемый ресурс в конфигурацию Apache (файл httpd.conf).
Теперь нужно прописать защищаемый ресурс в конфигурацию сервера Apache. Делается это при помощи следующих директив:
AuthType - тип аутентификации
Basic/Digest.
AuthName - название для области, требующей авторизации. Это название появится в диалоговом окне ввода логина и пароля.
AuthUserFile - местонахождение файла с паролями.
AuthGroupFile - местонахождение файла групп.
Require - требования, необходимые для доступа к защищённой области. Так, значение
valid-user позволит произвести авторизацию для любого пользователя, прописанного в файле
.htpasswd.
Следующий код позволит нам защитить область
http://www.example.com/secret от несанкционированного доступа.
Пример:
Код:
<Directory "/var/www/html/secret">
AuthType Basic
AuthName "Private Area"
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
</Directory>
После внесения изменений в файл
httpd.conf необходимо перезапустить демон
httpd.
+Прописываем защищаемый ресурс в конфигурацию Apache (файл .htaccess).
Настройка конфигурации Apache через файл
.htaccess проводится аналогично предыдущему способу c тем отличием, что изменения вносятся "на лету" и
httpd-демон перезапускать не придётся, так как Apache заново считывает содержимое файла
.htaccess при каждом обращении к защищённой области.
Пример:
Код:
AuthType Basic
AuthName "Private Area"
AuthUserFile /var/www/html/secret/.htpasswd
Require user ivanov petrov
Пример похож на предыдущий, но есть одно отличие. Доступ к секретной области сайта будет разрешён не для всех пользователей из файла
.htpasswd, а только для пользователей
ivanov и
petrov.
+Настраиваем групповой доступ
Для большей гибкости в Apache был введён механизм групп, т.е. авторизация производится не на уровне отдельных пользователей, а на уровне групп пользователей. Для работы с группами создадим файл
.htgroup такого вида
Код:
admins: ivanov petrov
users: sidorov vasechkin svistunov
т.е. у нас есть две группы пользователей
admins и
users. Членами группы
admins являются пользователи
ivanov и
petrov, а членами группы
users являются пользователи
sidorov,
vasechkin и
svistunov.
Пример:
Код:
AuthType Basic
AuthName "Private Area"
AuthUserFile /var/www/html/secret/.htpasswd
AuthGroupFile /var/www/html/secret/.htgroup
Require group admins
В приведённом примере доступ к секретной области сайта имеют только члены группы
admins.
2. Digest-аутентификация.
Digest-аутентификация представляет собой более продвинутый и сложный вид аутентификации, чем Basic-аутентификация. Главным отличием здесь является то, что логин-пароль пользователя пересылаются через сеть не в открытом виде, а шифруются по алгоритму MD5. Настройка Digest-аутентификации похожа на настройку Basic-аутентификации. Основные шаги остаются прежними:
+ Создать файл с паролями.
+ Прописать защищаемый ресурс в конфигурацию Apache (в файле httpd.conf или в файле .htaccess).
+ Создать файл для работы с группами и настроить групповой доступ (этот пункт не является обязательным).
+Создаём файл с паролями.
Файл паролей создаётся при помощи стандартной утилиты
htdigest
Код:
htdigest -c [путь к файлу с паролями] [название секретной области] [имя пользователя]
Ключ
-c указывается при необходимости создать новый файл, а обязательный аргумент
[название секретной области] - это наименование секретной области, которое позже будет указано в директиве
AuthName.
Пример:
Код:
htdigest -c /var/www/html/secretplace/.htpasswd private adm
После запуска команды нужно будет ввести пароль и его подтверждение. В результате, мы получим файл
/var/www/html/secretplace/.htpasswd похожего содержания
Код:
adm:private:58b799bb9a734fc5948ebb6cf5c25f3e
Хеш считается по алгоритму MD5.
+Прописываем защищаемый ресурс в конфигурацию Apache (файл .htaccess).
Пример:
Код:
AuthType Digest
AuthName private
AuthUserFile /var/www/html/secretplace/.htpasswd
Require user adm
Результат:
Доступ к ресурсу
http://www.example.com/secretplace будет иметь только пользователь
adm.
+Настраиваем групповой доступ
Создаем файл
.htgroups следующего содержания
Код:
admins: ivanov petrov
users: sidorov vasechkin svistunov
Пример:
Код:
AuthType Digest
AuthName private
AuthUserFile /var/www/html/secretplace/.htpasswd
AuthGroupFile /var/www/html/secretplace/.htgroup
Require group admins
Результат:
Доступ к ресурсу
http://www.example.com/secretplace смогут получить только члены группы
admins, т.е. пользователи
ivanov и
petrov.