Модуль Apache mod_authz_core
| Описание: | Основные средства авторизации |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | authz_core_module |
| Исходный файл: | mod_authz_core.c |
| Совместимость: | Доступен в Apache HTTPD 2.3 и более поздних версиях |
Краткое описание
Этот модуль предоставляет основные возможности авторизации, позволяя разрешать или запрещать аутентифицированным пользователям доступ к разделам веб-сайта. mod_authz_core предоставляет функциональность для регистрации различных поставщиков авторизации. Обычно он используется совместно с модулем поставщика аутентификации, таким как mod_authn_file, и модулем авторизации, например mod_authz_user. Он также позволяет применять сложную логику при обработке авторизации.
Контейнеры авторизации
Директивы-контейнеры авторизации <RequireAll>, <RequireAny> и <RequireNone> можно комбинировать друг с другом и с директивой Require для выражения сложной логики авторизации.
Пример ниже выражает следующую логику авторизации. Чтобы получить доступ к ресурсу, пользователь должен быть либо пользователем superadmin, либо одновременно входить в группу admins и группу LDAP Administrators, а также либо входить в группу sales, либо иметь атрибут LDAP dept со значением sales. Кроме того, для доступа к ресурсу пользователь не должен входить ни в группу temps, ни в группу LDAP Temporary Employees.
<Directory "/www/mydocs">
<RequireAll>
<RequireAny>
Require user superadmin
<RequireAll>
Require group admins
Require ldap-group "cn=Administrators,o=Airius"
<RequireAny>
Require group sales
Require ldap-attribute dept="sales"
</RequireAny>
</RequireAll>
</RequireAny>
<RequireNone>
Require group temps
Require ldap-group "cn=Temporary Employees,o=Airius"
</RequireNone>
</RequireAll>
</Directory> Директивы Require
mod_authz_core предоставляет несколько универсальных поставщиков авторизации, которые можно использовать с директивой Require.
Require env
Поставщик env позволяет управлять доступом к серверу на основе наличия переменной окружения. Если указана директива Require env env-variable, запросу разрешается доступ, если существует переменная окружения env-variable. Сервер позволяет гибко задавать переменные окружения на основе характеристик клиентского запроса с помощью директив, предоставляемых mod_setenvif. Поэтому эту директиву можно использовать для разрешения доступа на основе таких факторов, как User-Agent клиента (тип браузера), Referer или другие поля заголовка HTTP-запроса.
SetEnvIf User-Agent "^KnockKnock/2\.0" let_me_in
<Directory "/docroot">
Require env let_me_in
</Directory> В этом случае браузерам, строка user-agent которых начинается с KnockKnock/2.0, будет разрешён доступ, а всем остальным будет отказано.
Когда сервер ищет путь с помощью внутреннего подзапроса, например при поиске DirectoryIndex или создании списка каталогов с помощью mod_autoindex, переменные окружения, относящиеся к запросу, в подзапрос не наследуются. Кроме того, директивы SetEnvIf не обрабатываются отдельно в подзапросе из-за фаз API, в которых действует mod_setenvif.
Require all
Поставщик all имитирует функциональность, ранее предоставлявшуюся директивами 'Allow from all' и 'Deny from all'. Этот поставщик принимает один из двух аргументов: 'granted' или 'denied'. В следующих примерах доступ будет разрешён или запрещён для всех запросов.
Require all granted
Require all denied
Require method
Поставщик method позволяет учитывать метод HTTP при принятии решений об авторизации. Методы GET и HEAD считаются эквивалентными. Метод TRACE недоступен для этого поставщика; вместо него используйте TraceEnable.
Следующий пример разрешает только запросы GET, HEAD, POST и OPTIONS:
Require method GET POST OPTIONS
Следующий пример разрешает запросы GET, HEAD, POST и OPTIONS без аутентификации, а для всех остальных методов требует указать действительного пользователя:
<RequireAny>
Require method GET POST OPTIONS
Require valid-user
</RequireAny> Require expr
Поставщик expr позволяет принимать решения об авторизации на основе произвольных выражений.
Require expr "%{TIME_HOUR} -ge 9 && %{TIME_HOUR} -le 17" <RequireAll>
Require expr "!(%{QUERY_STRING} =~ /secret/)"
Require expr "%{REQUEST_URI} in { '/example.cgi', '/other.cgi' }"
</RequireAll> Require expr "!(%{QUERY_STRING} =~ /secret/) && %{REQUEST_URI} in { '/example.cgi', '/other.cgi' }" Синтаксис описан в документации по ap_expr. До httpd 2.4.16 окружающие двойные кавычки MUST быть опущены.
Обычно выражение вычисляется до аутентификации. Однако если выражение возвращает false и содержит ссылку на переменную %{REMOTE_USER}, будет выполнена аутентификация, после чего выражение будет вычислено повторно.
Создание псевдонимов поставщиков авторизации
В конфигурационном файле можно создавать расширенные поставщики авторизации и присваивать им псевдонимы. Затем на эти псевдонимы можно ссылаться с помощью директивы Require так же, как и на базовый поставщик авторизации. Помимо возможности создавать псевдонимы для расширенных поставщиков, это позволяет ссылаться на один и тот же расширенный поставщик авторизации из нескольких мест.
Пример
В приведённом ниже примере создаются два разных псевдонима поставщика авторизации ldap на основе поставщика авторизации ldap-group. Этот пример позволяет одной области авторизации проверять членство в группах на нескольких узлах ldap:
<AuthzProviderAlias ldap-group ldap-group-alias1 "cn=my-group,o=ctx">
AuthLDAPBindDN "cn=youruser,o=ctx"
AuthLDAPBindPassword yourpassword
AuthLDAPUrl "ldap://ldap.host/o=ctx"
</AuthzProviderAlias>
<AuthzProviderAlias ldap-group ldap-group-alias2 "cn=my-other-group,o=dev">
AuthLDAPBindDN "cn=yourotheruser,o=dev"
AuthLDAPBindPassword yourotherpassword
AuthLDAPUrl "ldap://other.ldap.host/o=dev?cn"
</AuthzProviderAlias>
Alias "/secure" "/webpages/secure"
<Directory "/webpages/secure">
Require all granted
AuthBasicProvider file
AuthType Basic
AuthName LDAP_Protected_Place
#implied OR operation
Require ldap-group-alias1
Require ldap-group-alias2
</Directory> Директива AuthMerging
| Описание: | Управляет способом объединения логики авторизации каждого раздела конфигурации с логикой предшествующих разделов конфигурации. |
|---|---|
| Синтаксис: | AuthMerging Off | And | Or |
| Значение по умолчанию: | AuthMerging Off |
| Контекст: | directory, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
Если авторизация включена, обычно она наследуется каждым последующим разделом конфигурации, если только в нём не указан другой набор директив авторизации. Это действие используется по умолчанию и соответствует явной настройке AuthMerging Off.
Однако в некоторых случаях желательно при объединении разделов конфигурации объединить авторизацию одного раздела с авторизацией предшествующего ему раздела. Для этого доступны два варианта: And и Or.
Если раздел конфигурации содержит AuthMerging And или AuthMerging Or, его логика авторизации объединяется с логикой ближайшего предшествующего раздела (в соответствии с общим порядком разделов конфигурации), который также содержит логику авторизации, как если бы оба раздела совместно находились соответственно внутри директивы <RequireAll> или <RequireAny>.
AuthMerging не наследуется за пределами раздела конфигурации, в котором она указана. В следующем примере доступ к /www/docs могут получить только пользователи, входящие в группу alpha. Пользователи, входящие в группу alpha или beta, могут получить доступ к /www/docs/ab. Однако для раздела конфигурации <Directory> для /www/docs/ab/gamma применяется настройка Off по умолчанию — AuthMerging, поэтому директивы авторизации этого раздела переопределяют директивы предшествующих разделов. Таким образом, доступ к /www/docs/ab/gamma могут получить только пользователи, входящие в группу gamma.<Directory "/www/docs">
AuthType Basic
AuthName Documents
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
Require group alpha
</Directory>
<Directory "/www/docs/ab">
AuthMerging Or
Require group beta
</Directory>
<Directory "/www/docs/ab/gamma">
Require group gamma
</Directory> Директива <AuthzProviderAlias>
| Описание: | Заключает группу директив, представляющих расширение базового поставщика авторизации и доступных по указанному псевдониму |
|---|---|
| Синтаксис: | <AuthzProviderAlias baseProvider Alias Require-Parameters> ... </AuthzProviderAlias> |
| Контекст: | конфигурация сервера |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<AuthzProviderAlias> и </AuthzProviderAlias> используются для заключения группы директив авторизации, на которую можно ссылаться по имени псевдонима с помощью директивы Require.
Если в Require-Parameters требуется несколько параметров, их необходимо заключить в кавычки. В противном случае будет учтён только первый параметр.
# In this example, for both addresses to be taken into account, they MUST be enclosed
# between quotation marks
<AuthzProviderAlias ip reject-ips "XXX.XXX.XXX.XXX YYY.YYY.YYY.YYY">
</AuthzProviderAlias>
<Directory "/path/to/dir">
<RequireAll>
Require not reject-ips
Require all granted
</RequireAll>
</Directory> Директива AuthzSendForbiddenOnFailure
| Описание: | Отправляет '403 FORBIDDEN' вместо '401 UNAUTHORIZED', если аутентификация прошла успешно, но авторизация завершилась неудачей |
|---|---|
| Синтаксис: | AuthzSendForbiddenOnFailure On|Off |
| Значение по умолчанию: | AuthzSendForbiddenOnFailure Off |
| Контекст: | directory, .htaccess |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
| Совместимость: | Доступна в Apache HTTPD 2.3.11 и более поздних версиях |
Если аутентификация проходит успешно, но авторизация завершается неудачей, Apache HTTPD по умолчанию отвечает кодом HTTP '401 UNAUTHORIZED'. Обычно это заставляет браузеры снова отображать пользователю диалоговое окно ввода пароля, что не всегда желательно. AuthzSendForbiddenOnFailure позволяет изменить код ответа на '403 FORBIDDEN'.
Предупреждение безопасности
Изменение ответа в случае отсутствия авторизации ослабляет защиту пароля, поскольку раскрывает потенциальному злоумышленнику, что угаданный им пароль верен.
Директива Require
| Описание: | Проверяет, имеет ли аутентифицированный пользователь разрешение от поставщика авторизации. |
|---|---|
| Синтаксис: | Require [not] entity-name [entity-name] ... |
| Контекст: | directory, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
Эта директива проверяет, имеет ли аутентифицированный пользователь разрешение согласно определённому поставщику авторизации и указанным ограничениям. mod_authz_core предоставляет следующие универсальные поставщики авторизации:
Require all granted- Доступ разрешён безусловно.
Require all denied- Доступ безусловно запрещён.
Require env env-var [env-var] ...- Доступ разрешён, только если задана одна из указанных переменных окружения.
Require method http-method [http-method] ...- Доступ разрешён только для указанных методов HTTP.
Require expr expression- Доступ разрешён, если expression принимает значение true.
Ниже приведены некоторые допустимые варианты синтаксиса, предоставляемые mod_authz_user, mod_authz_host и mod_authz_groupfile:
Require user userid [userid] ...- Доступ к ресурсу могут получить только указанные пользователи.
Require group group-name [group-name] ...- Доступ к ресурсу могут получить только пользователи из указанных групп.
Require valid-user- Доступ к ресурсу могут получить все действительные пользователи.
Require ip 10 172.20 192.168.2- Доступ к ресурсу могут получить клиенты из указанных диапазонов IP-адресов.
Require forward-dns dynamic.example.org- Доступ будет разрешён клиенту, IP-адрес которого определяется по имени dynamic.example.org.
К другим модулям авторизации, реализующим параметры require, относятся mod_authnz_ldap, mod_authz_dbm, mod_authz_dbd, mod_authz_owner и mod_ssl.
В большинстве случаев для корректной работы полной конфигурации аутентификации и авторизации директива Require должна сопровождаться директивами AuthName, AuthType и AuthBasicProvider или AuthDigestProvider, а также такими директивами, как AuthUserFile и AuthGroupFile (для определения пользователей и групп). Пример:
AuthType Basic AuthName "Restricted Resource" AuthBasicProvider file AuthUserFile "/web/users" AuthGroupFile "/web/groups" Require group admin
Применённые таким образом средства контроля доступа действуют для всех методов. Обычно требуется именно такое поведение. Если необходимо применять средства контроля доступа только к определённым методам, оставляя остальные методы незащищёнными, поместите директиву Require в раздел <Limit>.
Результат директивы Require можно инвертировать с помощью параметра not. Как и другая инвертированная директива авторизации <RequireNone>, при инвертировании директива Require может только завершиться неудачей или вернуть нейтральный результат и поэтому никогда не может самостоятельно разрешить запрос.
В следующем примере разрешение получают все пользователи из групп alpha и beta, кроме тех, кто также входит в группу reject.
<Directory "/www/docs">
<RequireAll>
Require group alpha beta
Require not group reject
</RequireAll>
</Directory> Если в одном разделе конфигурации используется несколько директив Require, не заключённых в другую директиву авторизации, например <RequireAll>, они неявно заключаются в директиву <RequireAny>. Таким образом, первая директива, разрешившая доступ пользователю, разрешает весь запрос, а последующие директивы Require игнорируются.
Предупреждение безопасности
Будьте осторожны при настройке директив авторизации в разделах Location, которые пересекаются с содержимым, предоставляемым из файловой системы. По умолчанию эти разделы конфигурации переопределяют конфигурацию авторизации в разделах Directory и Files.
Директиву AuthMerging можно использовать для управления объединением разделов конфигурации авторизации.
См. также
Директива <RequireAll>
| Описание: | Заключает группу директив авторизации, ни одна из которых не должна завершиться неудачей и хотя бы одна должна завершиться успешно, чтобы заключающая директива завершилась успешно. |
|---|---|
| Синтаксис: | <RequireAll> ... </RequireAll> |
| Контекст: | directory, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<RequireAll> и </RequireAll> используются для заключения группы директив авторизации, ни одна из которых не должна завершиться неудачей и хотя бы одна должна завершиться успешно, чтобы директива <RequireAll> завершилась успешно.
Если ни одна из директив внутри директивы <RequireAll> не завершилась неудачей и хотя бы одна завершилась успешно, директива <RequireAll> завершается успешно. Если ни одна директива не завершилась ни успешно, ни неудачно, возвращается нейтральный результат. Во всех остальных случаях директива завершается неудачей.
См. также
Директива <RequireAny>
| Описание: | Заключает группу директив авторизации, хотя бы одна из которых должна завершиться успешно, чтобы заключающая директива завершилась успешно. |
|---|---|
| Синтаксис: | <RequireAny> ... </RequireAny> |
| Контекст: | directory, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<RequireAny> и </RequireAny> используются для заключения группы директив авторизации, хотя бы одна из которых должна завершиться успешно, чтобы директива <RequireAny> завершилась успешно.
Если одна или несколько директив внутри директивы <RequireAny> завершаются успешно, директива <RequireAny> завершается успешно. Если ни одна директива не завершилась ни успешно, ни неудачно, возвращается нейтральный результат. Во всех остальных случаях директива завершается неудачей.
<RequireAny>. (В лучшем случае они могут привести к неудачному результату директивы, если сами завершились неудачей, а все остальные директивы вернули нейтральное значение.) Поэтому инвертированные директивы авторизации не допускаются внутри директивы <RequireAny>.См. также
Директива <RequireNone>
| Описание: | Заключает группу директив авторизации, ни одна из которых не должна завершиться успешно, чтобы заключающая директива не завершилась неудачей. |
|---|---|
| Синтаксис: | <RequireNone> ... </RequireNone> |
| Контекст: | directory, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<RequireNone> и </RequireNone> используются для заключения группы директив авторизации, ни одна из которых не должна завершиться успешно, чтобы директива <RequireNone> не завершилась неудачей.
Если одна или несколько директив внутри директивы <RequireNone> завершаются успешно, директива <RequireNone> завершается неудачей. Во всех остальных случаях возвращается нейтральный результат. Поэтому, как и другая инвертированная директива авторизации Require not, она никогда не может самостоятельно разрешить запрос, поскольку не может вернуть успешный результат. Однако её можно использовать для ограничения множества пользователей, которым разрешён доступ к ресурсу.
<RequireNone>. Поэтому инвертированные директивы авторизации не допускаются внутри директивы <RequireNone>.См. также
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_authz_core.html