Статьи Настройка средств аутентификации и авторизации в веб-сервере Apache

Discussion in 'Статьи' started by otmorozok428, 26 Aug 2008.

  1. otmorozok428

    otmorozok428 Banned

    Joined:
    19 Oct 2007
    Messages:
    127
    Likes Received:
    88
    Reputations:
    17
    Введение

    Сначала, давай, вспомним, что же подразумевается под понятиями "аутентификация" и "авторизация".

    "Аутентификацией" называется процесс проверки подлинности пользователя, т.е. пользователь Вася Иванов, каким-то способом подтверждает, что за компьютером в настоящий момент находится действительно он, а не кто-нибудь другой. Для этого чаще всего используется пара логин-пароль, но для реально секретных ресурсов могут применяться и более надёжные способы, например, сканирование отпечатка пальца или сетчатки глаза.

    "Авторизация" происходит после успешного входа пользователя в систему и определяет к каким именно ресурсам может получить доступ данный пользователь. Так, например, Вася Иванов может, иметь доступ к модерированию раздела "Статьи" на сайте 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-аутентификация работает так - клиент шлёт запрос на доступ к защищённой области
    Code:
    GET /site/private HTTP/1.0
    Сервер присылает ответ:
    Code:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Basic realm="private"
    После получения ответа, клиентский браузер отображает окно, примерно такого вида

    [​IMG]

    куда нужно ввести логин и пароль. После ввода логина и пароля на сервер отправляется такой запрос
    Code:
    GET /site/private HTTP/1.0
    Authorization: Basic YWRtaW46MTIzNDU=
    В зависимости от правильности введённых данных сервер, либо разрешит доступ к защищаемому ресурсу, либо запретит.

    Главным минусом Basic-аутентификации является то, что все данные пересылаются через сеть в открытом виде, т.е. любой желающий из твоей локалки может отснифать эти данные и поиметь доступ к тем же ресурсам, что и ты. Во избежание подобных казусов рекомендуется дополнительно использовать SSL-шифрование. Если ты внимательно посмотришь на последний пример, то заметишь, что строчка
    Code:
    YWRtaW46MTIzNDU=
    , есть ни что иное как
    Code:
    admin:12345
    , закодированное при помощи Base64 алгоритма.

    Теперь, попробуем замутить такую аутентификацию на практике. Для этого потребуется:

    + Создать файл с паролями.
    + Прописать защищаемый ресурс в конфигурацию Apache (в файле httpd.conf или в файле .htaccess).
    + Создать файл для работы с группами и настроить групповой доступ (этот пункт не является обязательным).


    +Создаём файл с паролями.

    Для этой цели используется утилита htpasswd, входящая в стандартную поставку сервера Apache. Запускается она так:
    Code:
    htpasswd -c [путь к файлу с паролями] [имя пользователя]
    Ключ используется при первом запуске htpasswd и указывает на то, что нужно создать новый файл. Если файл с таким именем уже существует - он будет затёрт.

    Пример:
    Code:
    htpasswd -c /var/www/html/secret/.htpasswd adm
    Результат:

    После запуска команды, будет дважды запрошен пароль для пользователя adm, после чего будет создан файл /var/www/html/secret/.htpasswd содержащий такую строчку
    Code:
    adm:хеш пароля
    Рассмотрим, остальные ключи htpasswd:

    -n Результат работы htpasswd (имя пользователя:хеш пароля) будет выведен на экран, а не в файл.

    -p Пароль хранится в виде обычного текста безо всякого шифрования. Данный формат поддерживается только в операционных системах Windows, Netware и BEOS.

    Пример:
    Code:
    adm:12345
    -d Хеш пароля вычисляется с использованием стандартной Unix-функции CRYPT. Это алгоритм шифрования по умолчанию. Используется только на *nix серверах.

    Пример:
    Code:
    adm:sCRPeQ4DXDQqg
    John The Ripper определил хеш как Standard DES [24/32 4K]

    -m Хеш пароля вычисляется по алгоритму MD5.

    Пример:
    Code:
    adm:$apr1$kCYEN/..$Ii.SRRJ77C.bB2.nOSZHI1
    -s Хеш пароля вычисляется по алгоритму SHA1.

    Пример:
    Code:
    adm:{SHA}jLIjfQZ5yojbZGTqxg2pY0VROWQ=
    -D Заданный пользователь удаляется из файла с паролями.

    +Прописываем защищаемый ресурс в конфигурацию Apache (файл httpd.conf).

    Теперь нужно прописать защищаемый ресурс в конфигурацию сервера Apache. Делается это при помощи следующих директив:

    AuthType - тип аутентификации Basic/Digest.

    AuthName - название для области, требующей авторизации. Это название появится в диалоговом окне ввода логина и пароля.

    AuthUserFile - местонахождение файла с паролями.

    AuthGroupFile - местонахождение файла групп.

    Require - требования, необходимые для доступа к защищённой области. Так, значение valid-user позволит произвести авторизацию для любого пользователя, прописанного в файле .htpasswd.

    Следующий код позволит нам защитить область http://www.example.com/secret от несанкционированного доступа.

    Пример:
    Code:
    <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 при каждом обращении к защищённой области.

    Пример:
    Code:
    AuthType Basic
    AuthName "Private Area"
    AuthUserFile /var/www/html/secret/.htpasswd
    Require user ivanov petrov
    Пример похож на предыдущий, но есть одно отличие. Доступ к секретной области сайта будет разрешён не для всех пользователей из файла .htpasswd, а только для пользователей ivanov и petrov.

    +Настраиваем групповой доступ

    Для большей гибкости в Apache был введён механизм групп, т.е. авторизация производится не на уровне отдельных пользователей, а на уровне групп пользователей. Для работы с группами создадим файл .htgroup такого вида
    Code:
    admins: ivanov petrov
    users: sidorov vasechkin svistunov
    т.е. у нас есть две группы пользователей admins и users. Членами группы admins являются пользователи ivanov и petrov, а членами группы users являются пользователи sidorov, vasechkin и svistunov.

    Пример:
    Code:
    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
    Code:
    htdigest -c [путь к файлу с паролями] [название секретной области] [имя пользователя]
    Ключ -c указывается при необходимости создать новый файл, а обязательный аргумент [название секретной области] - это наименование секретной области, которое позже будет указано в директиве AuthName.

    Пример:
    Code:
    htdigest -c /var/www/html/secretplace/.htpasswd private adm
    После запуска команды нужно будет ввести пароль и его подтверждение. В результате, мы получим файл /var/www/html/secretplace/.htpasswd похожего содержания
    Code:
    adm:private:58b799bb9a734fc5948ebb6cf5c25f3e
    Хеш считается по алгоритму MD5.

    +Прописываем защищаемый ресурс в конфигурацию Apache (файл .htaccess).

    Пример:
    Code:
    AuthType Digest
    AuthName private
    AuthUserFile /var/www/html/secretplace/.htpasswd
    Require user adm
    Результат:

    Доступ к ресурсу http://www.example.com/secretplace будет иметь только пользователь adm.

    +Настраиваем групповой доступ

    Создаем файл .htgroups следующего содержания
    Code:
    admins: ivanov petrov
    users: sidorov vasechkin svistunov
    Пример:
    Code:
    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.
     
    5 people like this.