Модуль 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 окружающие двойные кавычки НЕЛЬЗЯ опускать.
Обычно выражение оценивается до аутентификации. Однако, если выражение возвращает 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 |
| Контекст: | директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
Когда авторизация включена, она обычно наследуется каждым последующим разделом конфигурации, если не указано иное множество директив авторизации. Это действие по умолчанию, соответствующее явным указанием AuthMerging Off.
Однако, могут возникнуть ситуации, когда желательно объединить авторизацию раздела конфигурации с авторизацией предшественника при объединении разделов конфигурации. Для этого доступны два варианта: And и Or.
Когда раздел конфигурации содержит AuthMerging And или AuthMerging Or, его логика авторизации объединяется с логикой ближайшего предшественника (согласно общему порядку разделов конфигурации), который также содержит логику авторизации, как если бы эти два раздела находились совместно внутри директивы <RequireAll> или <RequireAny> соответственно.
AuthMerging не наследуется за пределами раздела конфигурации, в котором она появляется. В следующем примере, только пользователи, принадлежащие к группе alpha могут получить доступ к /www/docs. Пользователи, принадлежащие к группам alpha или beta могут получить доступ к /www/docs/ab. Однако, значение по умолчанию Off AuthMerging применяется к разделу конфигурации <Directory> для /www/docs/ab/gamma, поэтому директивы авторизации этого раздела переопределяют директивы предыдущих разделов. Таким образом, только пользователи, принадлежащие к группе gamma могут получить доступ к /www/docs/ab/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 ЗАПРЕЩЕНО' вместо '401 НЕАВТОРИЗОВАНО', если аутентификация прошла успешно, но авторизация не удалась. |
|---|---|
| Синтаксис: | AuthzSendForbiddenOnFailure On|Off |
| Значение по умолчанию: | AuthzSendForbiddenOnFailure Off |
| Контекст: | директория, .htaccess |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
| Совместимость: | Доступно в Apache HTTPD 2.3.11 и более поздних версиях |
Если аутентификация прошла успешно, но авторизация не удалась, Apache HTTPD по умолчанию ответит с кодом HTTP '401 НЕАВТОРИЗОВАНО'. Это обычно приводит к тому, что браузеры снова отображают диалог пароля пользователю, что нежелательно во всех ситуациях. AuthzSendForbiddenOnFailure позволяет изменить код ответа на '403 ЗАПРЕЩЕНО'.
Предупреждение о безопасности
Изменение ответа в случае отсутствия авторизации ослабляет безопасность пароля, поскольку это раскрывает потенциальному злоумышленнику, что его введённый пароль был верным.
Директива Require
| Описание: | Проверяет, авторизован ли аутентифицированный пользователь поставщиком авторизации. |
|---|---|
| Синтаксис: | Require [not] entity-name [entity-name] ... |
| Контекст: | каталог, .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- Доступ разрешен, если выражение вычисляется в значение 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> |
| Контекст: | каталог, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<RequireAll> и </RequireAll> используются для оборачивания группы директив авторизации, ни одна из которых не должна завершаться неудачей, и по крайней мере одна из которых должна иметь успех, чтобы директива <RequireAll> имела успех.
Если ни одна из директив, содержащихся в директиве <RequireAll>, не завершается неудачей, и по крайней мере одна завершается успешно, то директива <RequireAll> завершается успешно. Если ни одна не имеет успеха и ни одна не завершается неудачей, то она возвращает нейтральный результат. Во всех остальных случаях она завершается неудачей.
См. также
<RequireAny> Директива
| Описание: | Оборачивает группу директив авторизации, одна из которых должна иметь успех для успеха содержащей директивы. |
|---|---|
| Синтаксис: | <RequireAny> ... </RequireAny> |
| Контекст: | каталог, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Базовый |
| Модуль: | mod_authz_core |
<RequireAny> и </RequireAny> используются для оборачивания группы директив авторизации, одна из которых должна иметь успех, чтобы директива <RequireAny> имела успех.
Если одна или несколько директив, содержащихся в директиве <RequireAny>, завершаются успешно, то директива <RequireAny> завершается успешно. Если ни одна не имеет успеха и ни одна не завершается неудачей, то она возвращает нейтральный результат. Во всех остальных случаях она завершается неудачей.
<RequireAny>. (В худшем случае они могут привести к тому, что директива завершится неудачей, если они завершатся неудачей, а все остальные директивы вернут нейтральное значение). Поэтому отменённые директивы авторизации не допускаются в директиве <RequireAny>.См. также
<RequireNone> Директива
| Описание: | Оборачивает группу директив авторизации, ни одна из которых не должна иметь успех для того, чтобы содержащая директива не завершилась неудачей. |
|---|---|
| Синтаксис: | <RequireNone> ... </RequireNone> |
| Контекст: | каталог, .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