Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_auth_form

Описание: Аутентификация с помощью формы
Статус: Базовый
Идентификатор модуля: auth_form_module
Исходный файл: mod_auth_form.c
Совместимость: Доступен в Apache 2.3 и более поздних версиях

Краткое описание

Предупреждение

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

Этот модуль позволяет использовать HTML-форму входа для ограничения доступа, проверяя пользователей в указанных поставщиках. HTML-формы требуют значительно более сложной настройки, чем альтернативные варианты, однако HTML-форма входа может обеспечить гораздо более удобное взаимодействие для конечных пользователей.

Базовая аутентификация HTTP предоставляется модулем mod_auth_basic, а дайджест-аутентификация HTTP — модулем mod_auth_digest. Этот модуль следует использовать вместе как минимум с одним модулем аутентификации, например mod_authn_file, и одним модулем авторизации, например mod_authz_user.

После успешной аутентификации пользователя его учетные данные для входа будут сохранены в сеансе, предоставляемом модулем mod_session.

Базовая настройка

Чтобы защитить определенный URL с помощью mod_auth_form, необходимо решить, где будет храниться ваш сеанс, а также выбрать способ аутентификации. В этом простом примере учетные данные для входа будут храниться в сеансе на основе mod_session_cookie, а аутентификация будет выполняться по файлу с помощью mod_authn_file. Если аутентификация не пройдет успешно, пользователь будет перенаправлен на страницу входа с формой.

Базовый пример

<Location "/admin">
    AuthFormProvider file
    AuthUserFile "conf/passwd"
    AuthType form
    AuthName "/admin"
    AuthFormLoginRequiredLocation "http://example.com/login.html"

    Session On
    SessionCookieName session path=/

    Require valid-user
</Location>

Директива AuthType включает аутентификацию mod_auth_form, если ей задано значение form. Директивы AuthFormProvider и AuthUserFile указывают, что имена пользователей и пароли следует проверять по выбранному файлу.

Директивы Session и SessionCookieName задают хранение сеанса в файле cookie HTTP в браузере. Дополнительные сведения о различных вариантах настройки сеанса см. в документации к mod_session.

При необходимости можно добавить SessionCryptoPassphrase, чтобы создать зашифрованный файл cookie сеанса. Для этого необходимо загрузить дополнительный модуль mod_session_crypto.

В простом примере выше URL защищен с помощью mod_auth_form, однако у пользователя еще нет возможности ввести имя пользователя и пароль. Для этого можно предоставить отдельную страницу входа или встроить форму входа непосредственно в страницу.

Отдельная страница входа

Форму входа можно разместить на отдельной странице или встроить непосредственно в ту же страницу.

При настройке отдельной страницы для входа неудачные попытки аутентификации следует перенаправлять на созданную для этой цели форму входа с помощью директивы AuthFormLoginRequiredLocation. Обычно такая страница содержит HTML-форму, в которой пользователя просят указать имя пользователя и пароль.

Пример формы входа

<form method="POST" action="/dologin.html">
  Username: <input type="text" name="httpd_username" value="" />
  Password: <input type="password" name="httpd_password" value="" />
  <input type="submit" name="login" value="Login" />
</form>

Непосредственно вход обрабатывается обработчиком form-login-handler. В атрибуте action формы следует указать этот обработчик, который настраивается в Apache httpd следующим образом:

Пример обработчика входа через форму

<Location "/dologin.html">
    SetHandler form-login-handler
    AuthFormLoginRequiredLocation "http://example.com/login.html"
    AuthFormLoginSuccessLocation "http://example.com/admin/index.html"
    AuthFormProvider file
    AuthUserFile "conf/passwd"
    AuthType form
    AuthName /admin
    Session On
    SessionCookieName session path=/
</Location>

URL, указанные директивой AuthFormLoginRequiredLocation, обычно ведут на страницу с сообщением о неудачной попытке входа и предложением повторить попытку. Директива AuthFormLoginSuccessLocation задает URL, на который следует перенаправить пользователя после успешного входа.

Кроме того, URL для перенаправления после успешного входа можно указать непосредственно в форме входа, как показано в примере ниже. В результате один и тот же обработчик form-login-handler можно использовать повторно для разных разделов сайта.

Пример формы входа с указанием адреса

<form method="POST" action="/dologin.html">
  Username: <input type="text" name="httpd_username" value="" />
  Password: <input type="password" name="httpd_password" value="" />
  <input type="submit" name="login" value="Login" />
  <input type="hidden" name="httpd_location" value="http://example.com/success.html" />
</form>

Встроенная форма входа

Предупреждение

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

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

Если не прошедший аутентификацию пользователь попытается открыть страницу, защищенную с помощью mod_auth_form и не настроенную с директивой AuthFormLoginRequiredLocation, браузеру будет возвращен код состояния HTTP_UNAUTHORIZED, сообщающий пользователю, что у него нет разрешения на просмотр страницы.

Чтобы настроить встроенную аутентификацию, администратор переопределяет документ ошибки, возвращаемый для кода состояния HTTP_UNAUTHORIZED, и указывает собственный документ ошибки, содержащий форму входа:

Базовый пример встроенной формы

AuthFormProvider file
ErrorDocument 401 "/login.shtml"
AuthUserFile "conf/passwd"
AuthType form
AuthName realm
Session On
SessionCookieName session path=/

Страница документа ошибки должна содержать форму входа с пустым свойством action, как в примере ниже. В результате форма будет отправлена на исходный защищенный URL без необходимости указывать этот URL на странице.

Пример встроенной формы входа

<form method="POST" action="">
  Username: <input type="text" name="httpd_username" value="" />
  Password: <input type="password" name="httpd_password" value="" />
  <input type="submit" name="login" value="Login" />
</form>

Когда конечный пользователь введет свои учетные данные, форма отправит запрос HTTP POST на исходный URL, защищенный паролем. mod_auth_form перехватит этот запрос POST и, если будут обнаружены поля HTML для имени пользователя и пароля, выполнит вход пользователя и вернет ему исходный URL, защищенный паролем, в виде запроса GET.

Встроенная форма входа с сохранением тела запроса

Ограничение описанного выше способа со встроенной формой входа состоит в том, что при отправке HTML-формы методом POST, вызвавшей необходимость аутентификации или повторной аутентификации, содержимое исходной формы, отправленной браузером, будет потеряно. В зависимости от назначения сайта это может создать значительные неудобства для конечного пользователя.

mod_auth_form решает эту проблему, позволяя встроить метод и тело исходного запроса в форму входа. Если аутентификация пройдет успешно, Apache httpd повторит исходный запрос с теми же методом и телом, сохранив состояние исходного запроса.

Чтобы включить сохранение тела запроса, добавьте в форму три дополнительных поля, как показано в примере ниже.

Пример с сохранением тела запроса

<form method="POST" action="">
  Username: <input type="text" name="httpd_username" value="" />
  Password: <input type="password" name="httpd_password" value="" />
  <input type="submit" name="login" value="Login" />
  
<input type="hidden" name="httpd_method" value="POST" /> <input type="hidden" name="httpd_mimetype" value="application/x-www-form-urlencoded" /> <input type="hidden" name="httpd_body" value="name1=value1&name2=value2" />
</form>

Способ встраивания метода, типа MIME и тела исходного запроса в форму входа зависит от платформы и технологий, используемых на сайте.

Один из вариантов — использовать модуль mod_include вместе с директивой KeptBodySize и подходящим сценарием CGI для встраивания переменных в форму.

Другой вариант — формировать форму входа с помощью сценария CGI или другой динамической технологии.

Пример CGI

AuthFormProvider file
ErrorDocument 401 "/cgi-bin/login.cgi"
...

Выход из системы

Чтобы разрешить пользователю завершить определенный сеанс, настройте страницу, которую будет обрабатывать обработчик form-logout-handler. Любая попытка открыть этот URL приведет к удалению имени пользователя и пароля из текущего сеанса, то есть пользователь выйдет из системы.

С помощью директивы AuthFormLogoutLocation можно указать URL, на который браузер будет перенаправлен после успешного выхода. На этой странице можно сообщить пользователю, что он вышел из системы, и предложить ему войти снова.

Базовый пример выхода из системы

SetHandler form-logout-handler
AuthName realm
AuthFormLogoutLocation "http://example.com/loggedout.html"
Session On
SessionCookieName session path=/

Обратите внимание, что выход пользователя из системы не удаляет сеанс, а лишь удаляет из него имя пользователя и пароль. Если после этого сеанс окажется пустым, он будет удален, однако это не гарантируется. Чтобы гарантировать удаление сеанса, задайте для директивы SessionMaxAge небольшое значение, например 1 (если задать для директивы нулевое значение, ограничение времени жизни сеанса отсутствует).

Базовый пример истечения срока действия сеанса

SetHandler form-logout-handler
AuthFormLogoutLocation "http://example.com/loggedout.html"
Session On
SessionMaxAge 1
SessionCookieName session path=/

Имена пользователей и пароли

Обратите внимание, что при отправке формы данные кодируются в формате URL, включая имя пользователя и пароль. Поэтому выбирайте имена пользователей и пароли, не содержащие символов, которые кодируются в URL при отправке формы, иначе возможны непредвиденные результаты.

Директива AuthFormAuthoritative

Описание: Определяет, передаются ли аутентификация и авторизация модулям более низкого уровня
Синтаксис:
AuthFormAuthoritative On|Off
Значение по умолчанию:
AuthFormAuthoritative On
Контекст: directory, .htaccess
Переопределение: AuthConfig
Статус: Базовый
Модуль: mod_auth_form

Обычно каждый модуль авторизации, указанный в AuthFormProvider, пытается проверить пользователя, и если пользователь не найден ни в одном поставщике, доступ запрещается. Явная установка для директивы AuthFormAuthoritative значения Off позволяет передавать аутентификацию и авторизацию другим модулям, не основанным на поставщиках, если идентификатор пользователя или правило, соответствующие указанному идентификатору пользователя, не найдены. Это необходимо только при совместном использовании mod_auth_form со сторонними модулями, которые не настроены с помощью директивы AuthFormProvider. При использовании таких модулей порядок обработки определяется исходным кодом модулей и не может быть настроен.

Директива AuthFormBody

Описание: Имя поля формы, содержащего тело запроса, который следует выполнить после успешного входа
Синтаксис:
AuthFormBody fieldname
Значение по умолчанию:
AuthFormBody httpd_body
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormBody задает имя поля HTML, которое, если оно присутствует, будет содержать тело запроса, отправляемого после успешного входа.

Добавив в форму поля, описанные директивами AuthFormMethod, AuthFormMimetype и AuthFormBody, сайт может повторить запрос, обработка которого была прервана страницей входа или истечением срока действия сеанса.

Директива AuthFormDisableNoStore

Описание: Отключает заголовок CacheControl no-store на странице входа
Синтаксис:
AuthFormDisableNoStore On|Off
Значение по умолчанию:
AuthFormDisableNoStore Off
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Флаг AuthFormDisableNoStore отключает отправку заголовка Cache-Control no-store вместе со страницей ошибки 401, возвращаемой, когда пользователь еще не вошел в систему. Этот заголовок затрудняет попытки приложения ecmascript повторно отправить форму входа и раскрыть имя пользователя и пароль серверному приложению. Отключайте его на свой страх и риск.

Директива AuthFormFakeBasicAuth

Описание: Имитирует заголовок базовой аутентификации
Синтаксис:
AuthFormFakeBasicAuth On|Off
Значение по умолчанию:
AuthFormFakeBasicAuth Off
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Флаг AuthFormFakeBasicAuth определяет, будет ли к заголовкам запроса добавлен заголовок Basic Authentication. Это позволяет передать имя пользователя и пароль нижележащему приложению, которому при этом не нужно знать, каким способом был выполнен вход.

Директива AuthFormLocation

Описание: Имя поля формы, содержащего URL для перенаправления после успешного входа
Синтаксис:
AuthFormLocation fieldname
Значение по умолчанию:
AuthFormLocation httpd_location
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormLocation задает имя поля HTML, которое, если оно присутствует, будет содержать URL, на который следует перенаправить браузер после успешного входа.

Директива AuthFormLoginRequiredLocation

Описание: URL страницы, на которую следует перенаправить пользователя, если требуется вход
Синтаксис:
AuthFormLoginRequiredLocation url
Значение по умолчанию: none
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях. Поддержка анализатора выражений добавлена в версии 2.4.4.

Директива AuthFormLoginRequiredLocation задает URL для перенаправления пользователя, которому не разрешен просмотр страницы. Перед отправкой клиенту значение обрабатывается анализатором ap_expr. По умолчанию, если пользователю не разрешен просмотр страницы, вместе со страницей, указанной директивой ErrorDocument, возвращается код ответа HTTP HTTP_UNAUTHORIZED. Эта директива переопределяет поведение по умолчанию.

Используйте эту директиву, если у вас есть отдельная страница входа, на которую нужно перенаправлять пользователей.

Директива AuthFormLoginSuccessLocation

Описание: URL страницы, на которую следует перенаправить пользователя после успешного входа
Синтаксис:
AuthFormLoginSuccessLocation url
Значение по умолчанию: none
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях. Поддержка анализатора выражений добавлена в версии 2.4.4.

Директива AuthFormLoginSuccessLocation задает URL для перенаправления пользователя после успешного входа. Перед отправкой клиенту значение обрабатывается анализатором ap_expr. Эту директиву можно переопределить, если с помощью директивы AuthFormLocation задано поле формы, содержащее другой URL.

Используйте эту директиву, если у вас есть отдельный URL для входа и адрес целевой страницы не встроен в форму входа.

Директива AuthFormLogoutLocation

Описание: URL для перенаправления пользователя после выхода из системы
Синтаксис:
AuthFormLogoutLocation uri
Значение по умолчанию: none
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях. Поддержка анализатора выражений добавлена в версии 2.4.4.

Директива AuthFormLogoutLocation задает URL страницы на сервере, на которую следует перенаправить пользователя при попытке выхода из системы. Перед отправкой клиенту значение обрабатывается анализатором ap_expr.

При обращении к URI, обслуживаемому обработчиком form-logout-handler, конечному пользователю будет показана страница, указанная этой директивой. Например:

Пример

<Location "/logout">
    SetHandler form-logout-handler
    AuthFormLogoutLocation "http://example.com/loggedout.html"
    Session on
    #...
</Location>

При попытке открыть URI /logout/ пользователь выйдет из системы, а ему будет показана страница /loggedout.html. Убедитесь, что страница loggedout.html не защищена паролем, иначе она не будет отображена.

Директива AuthFormMethod

Описание: Имя поля формы, содержащего метод запроса, который следует выполнить после успешного входа
Синтаксис:
AuthFormMethod fieldname
Значение по умолчанию:
AuthFormMethod httpd_method
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormMethod задает имя поля HTML, которое, если оно присутствует, будет содержать метод запроса, отправляемого после успешного входа.

Добавив в форму поля, описанные директивами AuthFormMethod, AuthFormMimetype и AuthFormBody, сайт может повторить запрос, обработка которого была прервана страницей входа или истечением срока действия сеанса.

Директива AuthFormMimetype

Описание: Имя поля формы, содержащего тип MIME тела запроса, который следует выполнить после успешного входа
Синтаксис:
AuthFormMimetype fieldname
Значение по умолчанию:
AuthFormMimetype httpd_mimetype
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormMimetype задает имя поля HTML, которое, если оно присутствует, будет содержать тип MIME запроса, отправляемого после успешного входа.

Добавив в форму поля, описанные директивами AuthFormMethod, AuthFormMimetype и AuthFormBody, сайт может повторить запрос, обработка которого была прервана страницей входа или истечением срока действия сеанса.

Директива AuthFormPassword

Описание: Имя поля формы, содержащего пароль для входа
Синтаксис:
AuthFormPassword fieldname
Значение по умолчанию:
AuthFormPassword httpd_password
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormPassword задает имя поля HTML, которое, если оно присутствует, будет содержать пароль для входа.

Директива AuthFormProvider

Описание: Задает поставщика аутентификации для этого расположения
Синтаксис:
AuthFormProvider provider-name [provider-name] ...
Значение по умолчанию:
AuthFormProvider file
Контекст: directory, .htaccess
Переопределение: AuthConfig
Статус: Базовый
Модуль: mod_auth_form

Директива AuthFormProvider задает поставщика, используемого для аутентификации пользователей в этом расположении. Поставщик file по умолчанию реализован модулем mod_authn_file. Убедитесь, что выбранный модуль поставщика присутствует на сервере.

Пример

<Location "/secure">
    AuthType form
    AuthName "private area"
    AuthFormProvider  dbm
    AuthDBMType        SDBM
    AuthDBMUserFile    "/www/etc/dbmpasswd"
    Require            valid-user
    #...
</Location>

Поставщики реализованы модулями mod_authn_dbm, mod_authn_file, mod_authn_dbd, mod_authnz_ldap и mod_authn_socache.

Директива AuthFormSitePassphrase

Описание: Пропускает проверки аутентификации на сайтах с высокой посещаемостью
Синтаксис:
AuthFormSitePassphrase secret
Значение по умолчанию: none
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormSitePassphrase задает парольную фразу, наличие которой в сеансе пользователя заставляет Apache httpd пропускать проверки аутентификации для указанного URL. Ее можно использовать на сайтах с высокой посещаемостью, чтобы снизить нагрузку на инфраструктуру аутентификации.

Парольную фразу можно добавить в сеанс пользователя, включив эту директиву в настройку обработчика form-login-handler. Сам обработчик form-login-handler всегда выполняет проверки аутентификации независимо от того, задана ли парольная фраза.

Предупреждение

Если сеанс доступен пользователю через mod_session_cookie и не защищен с помощью mod_session_crypto, парольная фраза может быть раскрыта в результате словарной атаки. Независимо от конфигурации сеанса, не используйте эту директиву в пространствах URL, где могут быть раскрыты личные данные пользователей или выполнены конфиденциальные транзакции. Используйте на свой страх и риск.

Директива AuthFormSize

Описание: Максимальный размер формы в байтах, анализируемой для извлечения учетных данных
Синтаксис:
AuthFormSize size
Значение по умолчанию:
AuthFormSize 8192
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormSize задает максимальный размер тела запроса, анализируемого для поиска формы входа.

Если поступивший запрос на вход превышает этот размер, весь запрос будет прерван с кодом ответа HTTP HTTP_REQUEST_TOO_LARGE.

Если в форму добавлены поля, описанные директивами AuthFormMethod, AuthFormMimetype и AuthFormBody, вероятно, следует задать для этого параметра размер, близкий к значению директивы KeptBodySize.

Директива AuthFormUsername

Описание: Имя поля формы, содержащего имя пользователя для входа
Синтаксис:
AuthFormUsername fieldname
Значение по умолчанию:
AuthFormUsername httpd_username
Контекст: directory
Статус: Базовый
Модуль: mod_auth_form
Совместимость: Доступна в Apache HTTP Server 2.3.0 и более поздних версиях

Директива AuthFormUsername задает имя поля HTML, которое, если оно присутствует, будет содержать имя пользователя для входа.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_auth_form.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API