Spec-Zone.ru › Apache HTTP Server

Модуль 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 можно использовать для управления объединением разделов конфигурации авторизации.

См. также

  • Руководство по управлению доступом
  • Контейнеры авторизации
  • mod_authn_core
  • mod_authz_host

Директива <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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API