Модуль Apache mod_auth_form
| Описание: | Аутентификация по форме |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | auth_form_module |
| Файл исходного кода: | mod_auth_form.c |
| Совместимость: | Доступен в Apache 2.3 и более поздних версиях |
Резюме
Предупреждение
Аутентификация по форме зависит от модулей mod_session, и эти модули используют HTTP-куки. В связи с этим они могут стать уязвимыми к атакам типа Cross Site Scripting или раскрыть потенциально конфиденциальную информацию клиентам. Пожалуйста, убедитесь, что соответствующие риски учтены перед включением функциональности сессий на вашем сервере.
Этот модуль позволяет использовать HTML-форму входа для ограничения доступа, выполняя поиск пользователей в указанных поставщиках. HTML-формы требуют значительно большего конфигурирования, чем альтернативы, однако HTML-форма входа может обеспечить более удобный пользовательский опыт.
Основная аутентификация HTTP предоставляется модулем mod_auth_basic, а аутентификация HTTP Digest — модулем mod_auth_digest. Этот модуль следует сочетать как минимум с одним модулем аутентификации, например, mod_authn_file, и одним модулем авторизации, например, mod_authz_user.
После успешной аутентификации пользователя данные входа пользователя будут сохранены в сессии, предоставляемой модулем mod_session.
Базовая конфигурация
Для защиты определенного URL с использованием mod_auth_form, необходимо определить место хранения сессии session и выбрать метод аутентификации. В этом простом примере данные входа будут храниться в сессии на основе 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 хранят сессию в HTTP-cookie в браузере. Для получения дополнительной информации о различных вариантах конфигурации сессии, обратитесь к документации по mod_session.
Можно дополнительно добавить SessionCryptoPassphrase для создания зашифрованного куки сессии. Это требует загрузки дополнительного модуля 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. Действие формы должно быть направлено на этот обработчик, который настроен в 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 AuthFormLoginRequiredLocation "http://example.com/login.html" Session On SessionCookieName session path=/
Страница документа ошибки должна содержать форму входа со свойством действия, установленным как пустое, как показано в примере ниже. Это позволяет отправить форму на исходный защищенный 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.
Встроенный вход с сохранением содержимого тела
Ограничением техники встроенного входа, описанной выше, является то, что в случае, если POST-запрос HTML-формы привел к запросу на аутентификацию или повторную аутентификацию, содержимое исходной формы, отправленной браузером, будет потеряно. В зависимости от функции веб-сайта это может доставить значительные неудобства пользователю.
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, на который браузер будет перенаправлен после успешного выхода. Этот URL может объяснить пользователю, что он вышел из системы, и предоставить возможность повторного входа.
Базовый пример выхода
SetHandler form-logout-handler AuthName realm AuthFormLogoutLocation "http://example.com/loggedout.html" Session On SessionCookieName session path=/
Обратите внимание, что выход из системы не удаляет сессию; он просто удаляет имя пользователя и пароль из сессии. Если это приводит к пустой сессии, то в итоге будет удалена эта сессия, но это не гарантируется. Если вы хотите гарантировать удаление сессии, установите директиву SessionMaxAge на малое значение, например, 1 (установка значения 0 означала бы отсутствие ограничения возраста сессии).
Пример истечения срока действия сессии
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 |
| Контекст: | каталог, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
Обычно каждый модуль авторизации, перечисленный в AuthFormProvider, пытается проверить пользователя, и если пользователь не найден ни в одном поставщике, доступ будет запрещён. Явное установление директивы AuthFormAuthoritative в значение Off позволяет передать как аутентификацию, так и авторизацию другим модулям, не связанным с поставщиками, если нет userID или правила, соответствующего предоставленному userID. Это необходимо только при сочетании mod_auth_form с модулями сторонних разработчиков, которые не настраиваются с директивой AuthFormProvider. При использовании таких модулей порядок обработки определяется в исходном коде модулей и не настраивается.
Директива AuthFormBody
| Описание: | Имя поля формы, содержащего тело запроса для отправки при успешном входе в систему |
|---|---|
| Синтаксис: | AuthFormBody fieldname |
| Значение по умолчанию: | AuthFormBody httpd_body |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Директива AuthFormBody указывает имя HTML-поля, которое, если оно присутствует, будет содержать тело запроса для отправки при успешном входе в систему.
Заполняя форму полями, описанными в AuthFormMethod, AuthFormMimetype и AuthFormBody, веб-сайт может повторно отправить запрос, который мог быть прерван экраном входа в систему или истечением срока действия сеанса.
Директива AuthFormDisableNoStore
| Описание: | Отключить заголовок CacheControl no-store на странице входа в систему |
|---|---|
| Синтаксис: | AuthFormDisableNoStore On|Off |
| Значение по умолчанию: | AuthFormDisableNoStore Off |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Флаг AuthFormDisableNoStore отключает отправку заголовка Cache-Control no-store с ошибкой 401, возвращаемой, когда пользователь еще не авторизован. Цель этого заголовка — затруднить для приложения ecmascript попытку повторной отправки формы входа в систему и раскрыть имя пользователя и пароль приложению на стороне сервера. Отключайте с осторожностью.
Директива AuthFormFakeBasicAuth
| Описание: | Имитировать заголовок Basic Authentication |
|---|---|
| Синтаксис: | AuthFormFakeBasicAuth On|Off |
| Значение по умолчанию: | AuthFormFakeBasicAuth Off |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Флаг AuthFormFakeBasicAuth определяет, будет ли добавлен заголовок Basic Authentication в заголовки запроса. Это может быть использовано для раскрытия имени пользователя и пароля приложению на стороне сервера, без необходимости приложения знать, как был выполнен вход в систему.
Директива AuthFormLocation
| Описание: | Имя поля формы, содержащего URL для перенаправления при успешном входе в систему |
|---|---|
| Синтаксис: | AuthFormLocation fieldname |
| Значение по умолчанию: | AuthFormLocation httpd_location |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Директива AuthFormLocation указывает имя HTML-поля, которое, если оно присутствует, будет содержать URL для перенаправления браузера при успешном входе в систему.
Директива AuthFormLoginRequiredLocation
| Описание: | URL страницы, на которую будет перенаправлен пользователь, если вход в систему необходим |
|---|---|
| Синтаксис: | AuthFormLoginRequiredLocation url |
| Значение по умолчанию: | none |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. Использование парсера выражений добавлено в версии 2.4.4. |
Директива AuthFormLoginRequiredLocation указывает URL для перенаправления, если пользователю не разрешено просматривать страницу. Значение анализируется с помощью парсера ap_expr перед отправкой клиенту. По умолчанию, если пользователю не разрешено просматривать страницу, возвращается код HTTP-ответа HTTP_UNAUTHORIZED со страницей, указанной директивой ErrorDocument. Данная директива переопределяет это значение по умолчанию.
Используйте эту директиву, если у вас есть отдельная страница входа в систему для перенаправления пользователей.
Директива AuthFormLoginSuccessLocation
| Описание: | URL страницы, на которую будет перенаправлен пользователь при успешном входе в систему |
|---|---|
| Синтаксис: | AuthFormLoginSuccessLocation url |
| Значение по умолчанию: | none |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. Использование парсера выражений добавлено в версии 2.4.4. |
Директива AuthFormLoginSuccessLocation указывает URL для перенаправления, если пользователь успешно вошел в систему. Значение анализируется с помощью парсера ap_expr перед отправкой клиенту. Эта директива может быть переопределена, если в форме определено поле с другим URL с помощью директивы AuthFormLocation.
Используйте эту директиву, если у вас есть выделенный URL входа в систему и вы не включили целевую страницу в форму входа.
Директива AuthFormLogoutLocation
| Описание: | URL для перенаправления после выхода пользователя из системы |
|---|---|
| Синтаксис: | AuthFormLogoutLocation uri |
| По умолчанию: | none |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | 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 |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Директива AuthFormMethod указывает имя поля HTML, которое, если оно присутствует, будет содержать метод запроса для отправки после успешного входа в систему.
Заполняя форму полями, описанными AuthFormMethod, AuthFormMimetype и AuthFormBody, сайт может повторно отправить запрос, который мог быть прерван экраном входа в систему или истечением срока действия сеанса.
Директива AuthFormMimetype
| Описание: | Имя поля формы, содержащего тип MIME тела запроса для попытки успешного входа |
|---|---|
| Синтаксис: | AuthFormMimetype fieldname |
| По умолчанию: | AuthFormMimetype httpd_mimetype |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Директива AuthFormMimetype указывает имя поля HTML, которое, если оно присутствует, будет содержать тип MIME запроса для отправки после успешного входа в систему.
Заполняя форму полями, описанными AuthFormMethod, AuthFormMimetype и AuthFormBody, сайт может повторно отправить запрос, который мог быть прерван экраном входа в систему или истечением срока действия сеанса.
Директива AuthFormPassword
| Описание: | Имя поля формы, содержащего пароль для входа |
|---|---|
| Синтаксис: | AuthFormPassword fieldname |
| По умолчанию: | AuthFormPassword httpd_password |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | mod_auth_form |
| Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях |
Директива AuthFormPassword указывает имя поля HTML, которое, если оно присутствует, будет содержать пароль для входа.
Директива AuthFormProvider
| Описание: | Устанавливает поставщика(ов) аутентификации для данного расположения |
|---|---|
| Синтаксис: | AuthFormProvider provider-name [provider-name] ... |
| По умолчанию: | AuthFormProvider file |
| Контекст: | каталог, .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 |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | 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 |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | 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 |
| Контекст: | каталог |
| Статус: | Базовый |
| Модуль: | 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