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 могут выполнять аутентификацию с помощью идентификатора пользователя и пароля, например, для аутентификации Basic, или могут использовать произвольные механизмы.

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

Режимы вызова авторизаторов 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. Приложение должно обрабатывать как аутентификацию, так и авторизацию в одном вызове, используя идентификатор пользователя, пароль и другие данные запроса. Вызов происходит во время фазы аутентификации Apache httpd API. Если приложение возвращает 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
Фаза проверки доступа Apache httpd API — это отдельная фаза от аутентификации и авторизации. Некоторые другие реализации FastCGI реализуют эту фазу, что обозначается установкой FCGI_APACHE_ROLE в ACCESS_CHECKER.
Локальные сокеты (Unix) или каналы
В настоящее время поддерживаются только TCP-сокеты.
Поддержка mod_authn_socache
Взаимодействие mod_authn_socache должно быть реализовано для приложений, участвующих в аутентификации по стилю Apache httpd.
Поддержка аутентификации Digest с использованием 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. Все конфиденциальные данные будут видны в журнале.

LogLevel может быть использован для настройки уровня журнала, специфичного для mod_authnz_fcgi. Например:

LogLevel info authnz_fcgi:trace8

Директива AuthnzFcgiCheckAuthnProvider

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

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

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

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

Директива AuthnzFcgiDefineProvider

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

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

type
Это должно быть установлено на authn для проверки подлинности, authz для авторизации или authnz для универсального FastCGI-авторизатора, выполняющего обе проверки.
provider-name
Это используется для присвоения имени поставщику, которое используется в других директивах, таких как AuthBasicProvider и Require.
backend-address
Это указывает адрес приложения в формате 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