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