Пункт 102. Модуль Apache mod_auth_form
Аутентификация формы зависит от 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
. Если аутентификация не удалась, пользователь будет перенаправлен на страницу входа в форму.
Базовый пример
<Расположение "/admin">
Файл AuthFormProvider
AuthUserFile "conf/passwd"
Форма AuthType
Имя авторизации "/admin"
AuthFormLoginRequiredLocation "http://example.com/login.html"
Сессия включена
Путь сеанса SessionCookieName=/
Требовать действительного пользователя
</местоположение>
Директива AuthType
включит mod_auth_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">
Имя пользователя: <input type="text" name="httpd_username" value="" />
Пароль: <input type="password" name="httpd_password" value="" />
<input type="submit" name="login" value="Login" />
</форма>
Часть, которая выполняет фактический вход в систему, обрабатывается form-login-handler . Действие формы должно указывать на этот обработчик, который настроен в Apache httpd следующим образом:
Пример обработчика входа в форму
<Местоположение "/dologin.html">
SetHandler форма-логин-обработчик
AuthFormLoginRequiredLocation "http://example.com/login.html"
AuthFormLoginSuccessLocation "http://example.com/admin/index.html"
Файл AuthFormProvider
AuthUserFile "conf/passwd"
Форма AuthType
Имя авторизации /admin
Сессия включена
Путь сеанса SessionCookieName=/
</местоположение>
URL-адреса, указанные в
AuthFormLoginRequiredLocation
директиве, обычно указывают на страницу, объясняющую пользователю, что его попытка входа в систему не удалась, и ему следует повторить попытку. Директива AuthFormLoginSuccessLocation
указывает URL-адрес, на который должен быть перенаправлен пользователь после успешного входа в систему.
Кроме того, URL-адрес для перенаправления пользователя в случае успеха может быть встроен в форму входа, как в примере ниже. В результате один и тот же обработчик формы входа в систему можно повторно использовать для разных областей веб-сайта.
Пример формы входа с указанием местоположения
<form method="POST" action="/dologin.html">
Имя пользователя: <input type="text" name="httpd_username" value="" />
Пароль: <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" />
</форма>
Встроенный вход
Предупреждение
Существует риск того, что при определенных обстоятельствах форма входа, настроенная с использованием встроенного входа, может быть отправлена более одного раза, раскрывая учетные данные для входа в приложение, работающее под ним. Администратор должен обеспечить надлежащую защиту базового приложения для предотвращения злоупотреблений. Если вы сомневаетесь, используйте автономную конфигурацию входа.
В качестве альтернативы специальной странице входа на веб-сайт можно настроить mod_auth_form
внутреннюю аутентификацию пользователей без перенаправления на другую страницу. Это позволяет сохранить состояние текущей страницы при попытке входа в систему. Это может быть полезно в ситуации, когда действует ограниченный по времени сеанс, и время сеанса истекает в середине запроса пользователя. Пользователь может пройти повторную аутентификацию на месте и продолжить с того места, на котором остановился.
Если пользователь, не прошедший проверку подлинности, пытается получить доступ к защищенной странице,
mod_auth_form
которая не настроена с помощью
AuthFormLoginRequiredLocation
директивы, в браузер возвращается код состояния HTTP_UNAUTHORIZED , указывающий пользователю, что он не авторизован для просмотра страницы.
Чтобы настроить встроенную аутентификацию, администратор заменяет документ об ошибке, возвращаемый кодом состояния HTTP_UNAUTHORIZED , на настраиваемый документ об ошибке, содержащий форму входа, следующим образом:
Основной встроенный пример
Файл AuthFormProvider
ErrorDocument 401 "/login.shtml"
AuthUserFile "conf/passwd"
Форма AuthType
Область AuthName
AuthFormLoginRequiredLocation "http://example.com/login.html"
Сессия включена
Путь сеанса SessionCookieName=/
Страница документа об ошибке должна содержать форму входа с пустым свойством действия, как в примере ниже. Это приводит к отправке формы на исходный защищенный URL-адрес, при этом странице не нужно знать, что это за URL-адрес.
Пример встроенной формы входа
<метод формы="POST" действие="" >
Имя пользователя: <input type="text" name="httpd_username" value="" />
Пароль: <input type="password" name="httpd_password" value="" />
<input type="submit" name="login" value="Login" />
</форма>
Когда конечный пользователь введет свои данные для входа, форма отправит HTTP-запрос POST на исходный защищенный паролем URL-адрес.
mod_auth_form
перехватит этот POST-запрос, и если будут обнаружены поля HTML для имени пользователя и пароля, пользователь войдет в систему, и исходный URL-адрес, защищенный паролем, будет возвращен пользователю в качестве запроса GET.
Встроенный вход с сохранением тела
Ограничение метода встроенного входа в систему, описанного выше, заключается в том, что если POST-форма HTML привела к запросу на аутентификацию или повторную аутентификацию, содержимое исходной формы, отправленной браузером, будет потеряно. В зависимости от функции веб-сайта это может представлять значительные неудобства для конечного пользователя.
mod_auth_form
решает эту проблему, позволяя встраивать метод и тело исходного запроса в форму входа. Если аутентификация прошла успешно, Apache httpd повторит исходный метод и тело, сохранив состояние исходного запроса.
Чтобы включить сохранение тела, добавьте в форму входа три дополнительных поля, как показано в примере ниже.
Пример с сохранением тела
<метод формы="POST" действие="">
Имя пользователя: <input type="text" name="httpd_username" value="" />
Пароль: <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>
То, как метод, mimetype и тело исходного запроса встроены в форму входа, будет зависеть от платформы и технологии, используемых на веб-сайте.
Один из вариантов — использовать mod_include
модуль вместе с
KeptBodySize
директивой вместе с подходящим сценарием CGI для встраивания переменных в форму.
Другой вариант — визуализировать форму входа с помощью сценария CGI или другой динамической технологии.
Пример компьютерной графики
Файл AuthFormProvider
ErrorDocument 401 "/cgi-bin/login.cgi"
...
Выход
Чтобы пользователь мог выйти из определенного сеанса, настройте страницу для обработки form -logout-handler . Любая попытка получить доступ к этому URL-адресу приведет к удалению имени пользователя и пароля из текущего сеанса, что приведет к выходу пользователя из системы.
Установив
AuthFormLogoutLocation
директиву, можно указать URL-адрес, на который будет перенаправлен браузер при успешном выходе из системы. Этот URL-адрес может объяснить пользователю, что он вышел из системы, и дать пользователю возможность снова войти в систему.
Базовый пример выхода из системы
SetHandler форма-выход-обработчик
Область AuthName
AuthFormLogoutLocation "http://example.com/loggedout.html"
Сессия включена
Путь сеанса SessionCookieName=/
Обратите внимание, что выход пользователя из системы не удаляет сеанс; он просто удаляет имя пользователя и пароль из сеанса. Если это приведет к пустому сеансу, чистым эффектом будет удаление этого сеанса, но это не гарантируется. Если вы хотите гарантировать удаление сеанса, установите для
SessionMaxAge
директивы небольшое значение, например 1 (установка директивы на ноль будет означать отсутствие ограничения по возрасту сеанса).
Пример истечения базового сеанса
SetHandler форма-выход-обработчик
AuthFormLogoutLocation "http://example.com/loggedout.html"
Сессия включена
SessionMaxAge 1
Путь сеанса SessionCookieName=/
Имена пользователей и пароли
Обратите внимание, что отправка формы включает URLEncoding данных формы: в данном случае имя пользователя и пароль. Поэтому вам следует выбирать имена пользователей и пароли, которые избегают символов, которые закодированы в URL-адресе при отправке формы, иначе вы можете получить неожиданные результаты.
Директива AuthFormAuthoritative
Описание: | Устанавливает, передаются ли авторизация и аутентификация модулям более низкого уровня |
Синтаксис: | AuthFormAuthoritative On|Off |
По умолчанию: | AuthFormAuthoritative On |
Контекст: | каталог, .htaccess |
Переопределить: | Аутконфиг |
Положение дел: | База |
Модуль: | mod_auth_form |
Обычно каждый модуль авторизации, указанный в списке, AuthFormProvider
пытается проверить пользователя, и если пользователь не найден ни у одного провайдера, доступ будет запрещен. Явная установка
AuthFormAuthoritative
директивы на Off
разрешает передачу как аутентификации, так и авторизации другим модулям, не основанным на провайдере, если нет идентификатора пользователя или правила
, соответствующего предоставленному идентификатору пользователя. Это должно быть необходимо только при объединении mod_auth_form
со сторонними модулями, которые не настроены с помощью AuthFormProvider
директивы. При использовании таких модулей порядок обработки определяется в исходном коде модулей и не настраивается.
Директива AuthFormBody
Описание: | Имя поля формы, содержащего тело запроса на попытку успешного входа в систему. |
Синтаксис: | AuthFormBody fieldname |
По умолчанию: | httpd_body |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormMethod
указывает имя поля HTML, которое, если оно присутствует, будет содержать метод запроса на отправку в случае успешного входа в систему.
Заполняя форму полями, описанными
AuthFormMethod
,
AuthFormMimetype
и
AuthFormBody
, веб-сайт может повторить запрос, который мог быть прерван экраном входа в систему или тайм-аутом сеанса.
Директива AuthFormDisableNoStore
Описание: | Отключите заголовок отсутствия хранилища CacheControl на странице входа. |
Синтаксис: | 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 |
По умолчанию: | 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
, страница, указанная в этой директиве, будет показана конечному пользователю. Например:
Пример
<Расположение "/выход">
SetHandler форма-выход-обработчик
AuthFormLogoutLocation "http://example.com/loggedout.html"
Сессия на
#...
</местоположение>
Попытка получить доступ к URI /logout/ приведет к выходу пользователя из системы и отображению страницы /loggedout.html . Убедитесь, что страница
loggedout.html не защищена паролем, иначе страница не будет отображаться.
Директива AuthFormMethod
Описание: | Имя поля формы, содержащего метод запроса на попытку успешного входа в систему. |
Синтаксис: | AuthFormMethod fieldname |
По умолчанию: | httpd_method |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormMethod
указывает имя поля HTML, которое, если оно присутствует, будет содержать метод запроса на отправку в случае успешного входа в систему.
Заполняя форму полями, описанными
AuthFormMethod
,
AuthFormMimetype
и
AuthFormBody
, веб-сайт может повторить запрос, который мог быть прерван экраном входа в систему или тайм-аутом сеанса.
Директива AuthFormMimetype
Описание: | Имя поля формы, содержащего mimetype тела запроса для попытки успешного входа в систему. |
Синтаксис: | AuthFormMimetype fieldname |
По умолчанию: | httpd_mimetype |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormMethod
указывает имя поля HTML, которое, если оно присутствует, будет содержать MIME-тип запроса на отправку в случае успешного входа в систему.
Заполняя форму полями, описанными
AuthFormMethod
,
AuthFormMimetype
и
AuthFormBody
, веб-сайт может повторить запрос, который мог быть прерван экраном входа в систему или тайм-аутом сеанса.
Директива AuthFormPassword
Описание: | Имя поля формы, содержащего логин-пароль |
Синтаксис: | AuthFormPassword fieldname |
По умолчанию: | httpd_password |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormPassword
указывает имя поля HTML, которое, если оно присутствует, будет содержать пароль, который будет использоваться для входа в систему.
Директива AuthFormProvider
Описание: | Устанавливает поставщика(ов) аутентификации для этого местоположения |
Синтаксис: | AuthFormProvider provider-name
[provider-name] ... |
По умолчанию: | AuthFormProvider file |
Контекст: | каталог, .htaccess |
Переопределить: | Аутконфиг |
Положение дел: | База |
Модуль: | mod_auth_form |
Директива AuthFormProvider
устанавливает, какой провайдер используется для аутентификации пользователей для этого местоположения. Поставщик по умолчанию file
реализуется модулем mod_authn_file
. Убедитесь, что выбранный модуль провайдера присутствует на сервере.
Пример
<Расположение "/secure">
Форма AuthType
AuthName "частная область"
AuthFormProvider БД
AuthDBMType SDBM
AuthDBMUserFile "/www/etc/dbmpasswd"
Требовать действительного пользователя
#...
</местоположение>
Провайдеры
реализованы 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 . Сам обработчик формы -логина
всегда будет запускать проверки подлинности, независимо от того, указана парольная фраза или нет.
Предупреждение
Если сеанс открыт для пользователя с помощью
mod_session_cookie
, а сеанс не защищен с помощью
mod_session_crypto
, парольная фраза открыта для потенциального раскрытия посредством атаки по словарю. Независимо от того, как настроен сеанс, убедитесь, что эта директива не используется в пространствах URL-адресов, где могут быть раскрыты личные данные пользователя или могут проводиться конфиденциальные транзакции. Используйте на свой страх и риск.
Директива AuthFormSize
Описание: | Наибольший размер формы в байтах, который будет проанализирован для получения данных для входа. |
Синтаксис: | AuthFormSize size |
По умолчанию: | 8192 |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormSize
указывает максимальный размер тела запроса, который будет проанализирован для поиска формы входа.
Если поступает запрос на вход, превышающий этот размер, весь запрос будет прерван с кодом ответа HTTP HTTP_REQUEST_TOO_LARGE
.
Если вы заполнили форму полями, описанными
AuthFormMethod
,
AuthFormMimetype
и
AuthFormBody
, вы, вероятно, захотите установить для этого поля тот же размер, что и KeptBodySize
директива.
Директива AuthFormUsername
Описание: | Имя поля формы, содержащего имя пользователя для входа |
Синтаксис: | AuthFormUsername fieldname |
По умолчанию: | httpd_username |
Контекст: | каталог |
Положение дел: | База |
Модуль: | mod_auth_form |
Совместимость: | Доступно в Apache HTTP Server 2.3.0 и более поздних версиях. |
Директива AuthFormUsername
указывает имя поля HTML, которое, если оно присутствует, будет содержать имя пользователя, которое будет использоваться для входа в систему.