Модуль 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>
Дополнительные примеры
- Если ваше приложение поддерживает отдельные роли аутентификации и авторизации (
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
- Если ваше приложение поддерживает универсальную роль
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-отправителями.
Ведение журнала
- Ошибки обработки регистрируются на уровне журнала
errorи выше. - Сообщения, написанные приложением, регистрируются на уровне журнала
warn. - Общие сообщения для отладки регистрируются на уровне журнала
debug. - Переменные среды, передаваемые приложению, регистрируются на уровне журнала
trace2. Значение переменнойREMOTE_PASSWDбудет скрыто, но любые другие конфиденциальные данные будут видны в журнале. - Весь ввод/вывод между модулем и приложением 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