Модуль 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