Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_authnz_fcgi

Описание: Позволяет приложению-авторизатору FastCGI обрабатывать аутентификацию и авторизацию Apache httpd
Статус: Расширение
Идентификатор модуля: authnz_fcgi_module
Исходный файл: mod_authnz_fcgi.c
Совместимость: Доступен начиная с версии 2.4.10

Краткое описание

Этот модуль позволяет приложениям-авторизаторам FastCGI аутентифицировать пользователей и разрешать доступ к ресурсам. Он поддерживает универсальные авторизаторы FastCGI, участвующие в одной фазе аутентификации и авторизации, а также специальные для Apache httpd средства аутентификации и авторизации, участвующие в одной или обеих фазах.

Авторизаторы FastCGI могут выполнять аутентификацию по идентификатору пользователя и паролю, например при базовой аутентификации, либо использовать произвольные механизмы.

Режимы вызова

Режимы вызова авторизаторов FastCGI, поддерживаемые этим модулем, различаются по двум характеристикам: типу и механизму аутентификации.

Тип — это просто authn для аутентификации, authz для авторизации или authnz для совмещённой аутентификации и авторизации.

Механизм аутентификации относится к механизмам конфигурации и фазам обработки Apache httpd и может быть AuthBasicProvider, Require или check_user_id. Первые два соответствуют директивам, используемым для включения участия в соответствующей фазе обработки.

Описание каждого режима:

Тип authn, механизм AuthBasicProvider
В этом режиме FCGI_ROLE устанавливается в AUTHORIZER, а FCGI_APACHE_ROLE устанавливается в AUTHENTICATOR. Приложение должно быть определено как поставщик типа authn с помощью AuthnzFcgiDefineProvider и включено с помощью AuthBasicProvider. При вызове приложение должно аутентифицировать клиента, используя переданные идентификатор пользователя и пароль. Пример приложения:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
    die if $ENV{'FCGI_APACHE_ROLE'} ne "AUTHENTICATOR";
    die if $ENV{'FCGI_ROLE'}        ne "AUTHORIZER";
    die if !$ENV{'REMOTE_PASSWD'};
    die if !$ENV{'REMOTE_USER'};

    print STDERR "This text is written to the web server error log.\n";

    if ( ($ENV{'REMOTE_USER' } eq "foo" || $ENV{'REMOTE_USER'} eq "foo1") &&
        $ENV{'REMOTE_PASSWD'} eq "bar" ) {
        print "Status: 200\n";
        print "Variable-AUTHN_1: authn_01\n";
        print "Variable-AUTHN_2: authn_02\n";
        print "\n";
    }
    else {
        print "Status: 401\n\n";
    }
}
Пример конфигурации:
AuthnzFcgiDefineProvider authn FooAuthn fcgi://localhost:10102/
<Location "/protected/">
  AuthType Basic
  AuthName "Restricted"
  AuthBasicProvider FooAuthn
  Require ...
</Location>
Тип authz, механизм Require
В этом режиме FCGI_ROLE устанавливается в AUTHORIZER, а FCGI_APACHE_ROLE устанавливается в AUTHORIZER. Приложение должно быть определено как поставщик типа authz с помощью AuthnzFcgiDefineProvider. При вызове приложение должно авторизовать клиента, используя переданный идентификатор пользователя и другие данные запроса. Пример приложения:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
    die if $ENV{'FCGI_APACHE_ROLE'} ne "AUTHORIZER";
    die if $ENV{'FCGI_ROLE'}        ne "AUTHORIZER";
    die if $ENV{'REMOTE_PASSWD'};

    print STDERR "This text is written to the web server error log.\n";

    if ($ENV{'REMOTE_USER'} eq "foo1") {
        print "Status: 200\n";
        print "Variable-AUTHZ_1: authz_01\n";
        print "Variable-AUTHZ_2: authz_02\n";
        print "\n";
    }
    else {
        print "Status: 403\n\n";
    }
}
Пример конфигурации:
AuthnzFcgiDefineProvider authz FooAuthz fcgi://localhost:10103/
<Location "/protected/">
  AuthType ...
  AuthName ...
  AuthBasicProvider ...
  Require FooAuthz
</Location>
Тип authnz, механизм AuthBasicProvider + Require
В этом режиме, поддерживающем независимый от веб-сервера протокол FastCGI AUTHORIZER, FCGI_ROLE устанавливается в AUTHORIZER, а FCGI_APACHE_ROLE не устанавливается. Приложение должно быть определено как поставщик типа authnz с помощью AuthnzFcgiDefineProvider. Приложение должно выполнять и аутентификацию, и авторизацию при одном вызове, используя идентификатор пользователя, пароль и другие данные запроса. Вызов происходит во время фазы аутентификации API Apache httpd. Если приложение возвращает 200 и тот же поставщик вызывается во время фазы авторизации (через Require), mod_authnz_fcgi вернёт успешный результат для фазы авторизации, не вызывая приложение. Пример приложения:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
    die if $ENV{'FCGI_APACHE_ROLE'};
    die if $ENV{'FCGI_ROLE'} ne "AUTHORIZER";
    die if !$ENV{'REMOTE_PASSWD'};
    die if !$ENV{'REMOTE_USER'};

    print STDERR "This text is written to the web server error log.\n";

    if ( ($ENV{'REMOTE_USER' } eq "foo" || $ENV{'REMOTE_USER'} eq "foo1") &&
        $ENV{'REMOTE_PASSWD'} eq "bar" &&
        $ENV{'REQUEST_URI'} =~ m%/bar/.*%) {
        print "Status: 200\n";
        print "Variable-AUTHNZ_1: authnz_01\n";
        print "Variable-AUTHNZ_2: authnz_02\n";
        print "\n";
    }
    else {
        print "Status: 401\n\n";
    }
}
Пример конфигурации:
AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://localhost:10103/
<Location "/protected/">
  AuthType Basic
  AuthName "Restricted"
  AuthBasicProvider FooAuthnz
  Require FooAuthnz
</Location>
Тип authn, механизм check_user_id
В этом режиме FCGI_ROLE устанавливается в AUTHORIZER, а FCGI_APACHE_ROLE устанавливается в AUTHENTICATOR. Приложение должно быть определено как поставщик типа authn с помощью AuthnzFcgiDefineProvider. AuthnzFcgiCheckAuthnProvider указывает, когда оно вызывается. Пример приложения:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
    die if $ENV{'FCGI_APACHE_ROLE'} ne "AUTHENTICATOR";
    die if $ENV{'FCGI_ROLE'} ne "AUTHORIZER";

    # This authorizer assumes that the RequireBasicAuth option of 
    # AuthnzFcgiCheckAuthnProvider is On:
    die if !$ENV{'REMOTE_PASSWD'};
    die if !$ENV{'REMOTE_USER'};

    print STDERR "This text is written to the web server error log.\n";

    if ( ($ENV{'REMOTE_USER' } eq "foo" || $ENV{'REMOTE_USER'} eq "foo1") &&
        $ENV{'REMOTE_PASSWD'} eq "bar" ) {
        print "Status: 200\n";
        print "Variable-AUTHNZ_1: authnz_01\n";
        print "Variable-AUTHNZ_2: authnz_02\n";
        print "\n";
    }
    else {
        print "Status: 401\n\n";
        # If a response body is written here, it will be returned to
        # the client.
    }
}
Пример конфигурации:
AuthnzFcgiDefineProvider authn FooAuthn fcgi://localhost:10103/
<Location "/protected/">
  AuthType ...
  AuthName ...
  AuthnzFcgiCheckAuthnProvider FooAuthn \
                               Authoritative On \
                               RequireBasicAuth Off \
                               UserExpr "%{reqenv:REMOTE_USER}"
  Require ...
</Location>

Дополнительные примеры

  1. Если приложение поддерживает отдельные роли аутентификации и авторизации (AUTHENTICATOR и AUTHORIZER), определите отдельных поставщиков следующим образом, даже если они соответствуют одному и тому же приложению:
    AuthnzFcgiDefineProvider authn  FooAuthn  fcgi://localhost:10102/
    AuthnzFcgiDefineProvider authz  FooAuthz  fcgi://localhost:10102/
    Укажите поставщика authn в AuthBasicProvider, а поставщика authz — в Require:
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthn
    Require FooAuthz
  2. Если приложение поддерживает универсальную роль AUTHORIZER (аутентификация и авторизация при одном вызове), определите одного поставщика следующим образом:
    AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://localhost:10103/
    Укажите поставщика authnz и в AuthBasicProvider, и в Require:
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthnz
    Require FooAuthnz

Ограничения

Ниже перечислены потенциальные возможности, которые в настоящее время не реализованы:

Проверка доступа Apache httpd
Фаза проверки доступа API Apache httpd является отдельной фазой, не совпадающей с аутентификацией и авторизацией. Некоторые другие реализации FastCGI реализуют эту фазу, которая обозначается установкой FCGI_APACHE_ROLE в ACCESS_CHECKER.
Локальные сокеты (Unix) или каналы
В настоящее время поддерживаются только TCP-сокеты.
Поддержка mod_authn_socache
Следует реализовать взаимодействие с mod_authn_socache для приложений, участвующих в аутентификации в стиле Apache httpd.
Поддержка дайджест-аутентификации с использованием AuthDigestProvider
Это ограничение, вероятно, останется постоянным, поскольку для получения хеша не предусмотрен поток авторизации.
Управление процессами приложения
Эта возможность, вероятно, навсегда останется за рамками данного модуля. Процессами приложения необходимо управлять другими средствами. Например, для их запуска можно использовать fcgistarter.
AP_AUTH_INTERNAL_PER_URI
Все поставщики в настоящее время регистрируются как AP_AUTH_INTERNAL_PER_CONF, что означает, что проверки не выполняются повторно для внутренних подзапросов с той же конфигурацией управления доступом, что и у исходного запроса.
Преобразование кодировки данных протокола
Если mod_authnz_fcgi работает в среде компиляции EBCDIC, все данные протокола FastCGI записываются в EBCDIC и ожидается, что они будут получены в EBCDIC.
Несколько запросов на одно соединение
В настоящее время соединение с авторизатором FastCGI закрывается после каждой фазы обработки. Например, если авторизатор обрабатывает отдельные фазы authn и authz, будут использованы два соединения.
Сопоставление URI
URI клиентов не могут быть сопоставлены, например с помощью ProxyPass, используемого с обработчиками FastCGI.

Ведение журнала

  1. Ошибки обработки записываются в журнал на уровне error и выше.
  2. Сообщения, записанные приложением, заносятся в журнал на уровне warn.
  3. Общие отладочные сообщения заносятся в журнал на уровне debug.
  4. Переменные среды, передаваемые приложению, заносятся в журнал на уровне trace2. Значение переменной REMOTE_PASSWD будет скрыто, но любые другие конфиденциальные данные будут видны в журнале.
  5. Весь ввод-вывод между модулем и приложением FastCGI, включая все переменные среды, будет записан в печатном и шестнадцатеричном форматах на уровне trace5. Все конфиденциальные данные будут видны в журнале.

Для настройки уровня журнала, применяемого только к mod_authnz_fcgi, можно использовать LogLevel. Например:

LogLevel info authnz_fcgi:trace8

Директива AuthnzFcgiCheckAuthnProvider

Описание: Позволяет приложению FastCGI обрабатывать хук аутентификации check_authn.
Синтаксис:
AuthnzFcgiCheckAuthnProvider provider-name|None option ...
По умолчанию: none
Контекст: каталог
Статус: Расширение
Модуль: mod_authnz_fcgi

Эта директива используется, чтобы разрешить авторизатору FastCGI обрабатывать определённую фазу обработки аутентификации или авторизации.

Для включения некоторых возможностей авторизаторов FastCGI требуется использовать эту директиву вместо AuthBasicProvider:

  • Аутентификация, отличная от базовой; обычно — определение идентификатора пользователя клиента и возврат его авторизатором; см. параметр UserExpr ниже
  • Выбор пользовательского кода ответа; для ответа авторизатора, отличного от 200, код авторизатора будет использоваться в качестве кода состояния ответа
  • Указание тела ответа с кодом, отличным от 200; если авторизатор предоставляет тело ответа вместе с ответом, отличным от 200, это тело будет возвращено клиенту; поддерживается текст размером до 8192 байт
имя-поставщика
Это имя поставщика, определённого с помощью AuthnzFcgiDefineProvider.
None
Укажите None, чтобы отключить поставщика, включённого этой директивой во внешней области действия, например в родительском каталоге.
параметр
Поддерживаются следующие параметры:
Authoritative On|Off (по умолчанию On)
Этот параметр определяет, разрешено ли другим модулям запускаться, если для данного модуля настроен авторизатор FastCGI и он отклоняет запрос.
DefaultUser идентификатор-пользователя
Если авторизатор возвращает успешный результат, а UserExpr настроен и принимает значение пустой строки (например, авторизатор не вернул переменную), в качестве идентификатора пользователя будет использовано это значение. Обычно оно применяется, когда авторизатор поддерживает понятие гостевых или неаутентифицированных пользователей и сопоставляет их с определённым идентификатором пользователя для ведения журнала и других целей.
RequireBasicAuth On|Off (по умолчанию Off)
Этот параметр определяет, требуется ли базовая аутентификация до передачи запроса авторизатору. Если она обязательна, авторизатор не будет вызван без идентификатора пользователя и пароля; для запроса без них будет возвращён ответ 401.
UserExpr выражение (значение по умолчанию отсутствует)
Если клиент не предоставляет данные базовой аутентификации, а авторизатор определяет пользователя, это выражение, вычисляемое после вызова авторизатора, определяет пользователя. Выражение соответствует синтаксису ap_expr и должно возвращать строку. Обычно в нём используется ссылка на значение Variable-XXX, возвращённое авторизатором с помощью такого параметра, как UserExpr "%{reqenv:XXX}". Если этот параметр задан, но после успешной аутентификации не удаётся получить идентификатор пользователя с помощью выражения, запрос будет отклонён с ошибкой 500.

Директива AuthnzFcgiDefineProvider

Описание: Определяет приложение FastCGI как поставщика аутентификации и/или авторизации
Синтаксис:
AuthnzFcgiDefineProvider type provider-name backend-address
По умолчанию: none
Контекст: конфигурация сервера
Статус: Расширение
Модуль: mod_authnz_fcgi

Эта директива используется для определения приложения FastCGI как поставщика для конкретной фазы аутентификации или авторизации.

тип
Для аутентификации необходимо указать authn, для авторизации — authz, а для универсального авторизатора FastCGI, выполняющего обе проверки, — authnz.
имя-поставщика
Используется для присвоения поставщику имени, которое применяется в других директивах, таких как AuthBasicProvider и Require.
адрес-сервера
Задаёт адрес приложения в формате fcgi://hostname:port/. Процессами приложения необходимо управлять отдельно, например с помощью fcgistarter.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_authnz_fcgi.html

Spec-Zone.ru

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