mod_authnz_fcgi
描述: | 允许 FastCGI 授权程序 application 处理 Apache httpd 身份验证和授权 |
状态: | 延期 |
模块标识符: | authnz_fcgi_module |
源文件: | mod_authnz_fcgi.c |
兼容性: | 可在 version 2.4.10 及更高版本中使用 |
摘要
此模块允许 FastCGI 授权程序应用程序对用户进行身份验证并授予对资源的访问权限。它支持通用 FastCGI 授权程序,它们参与单个阶段的身份验证和授权,以及参与一个或两个阶段的 Apache httpd-specific 身份验证程序和授权程序。
FastCGI 授权者可以使用用户标识和密码进行身份验证,例如用于基本身份验证,或者可以使用任意机制进行身份验证。
调用模式
此模块支持的 FastCGI 授权程序的调用模式由两个特征(类型和身份验证机制)区分。
类型只是authn
用于身份验证,authz
用于授权,或authnz
用于组合身份验证和授权。
Auth 机制是指 Apache httpd configuration 机制和处理阶段,可以是AuthBasicProvider
,Require
或check_user_id
。前两个对应于用于参与适当处理阶段的指令。
每种模式的描述:
输入
authn
,机制AuthBasicProvider
在此模式下,FCGI_ROLE 设置为 AUTHORIZER,FCGIAPACHE_ROLE 设置为 AUTHENTICATOR。必须使用 AuthnzFcgiDefineProvider 将 application 定义为提供程序类型 authn,并使用 AuthBasicProvider 启用。调用时,application 应使用提供的用户标识和密码对 client 进行身份验证。 Example application:#!/usr/bin/perl
使用 FCGI;
我$request = FCGI::Request();
while($request -> Accept()>= 0){
if $ENV{'FCGIAPACHE_ROLE'}ne“AUTHENTICATOR”;
假如$ENV{'FCGI_ROLE'}ne“AUTHORIZER”;
如果死!$ENV{'REMOTE_PASSWD'};
如果死!$ENV{'REMOTE_USER'};print STDERR“此文本被写入 web 服务器错误 log。\ n”;
if(($ENV{'REMOTE_USER'}eq“foo”||$ENV{'REMOTE_USER'}eq“foo1”)&&
$ENV{'REMOTE_PASSWD'}eq“bar”){
打印“状态:200\n”;
打印“Variable-AUTHN_1:authn_01\n”;
打印“Variable-AUTHN_2:authn_02\n”;
打印“\ n”;
}
其他{
打印“状态:401\n\n”;
}
}Example configuration:AuthnzFcgiDefineProvider authn FooAuthn fcgi://localhost:10102/
<Location "12">
AuthType Basic
AuthName“受限制”
AuthBasicProvider FooAuthn
要求......
</Location>输入
authz
,机制Require
在此模式下,FCGI_ROLE 设置为 AUTHORIZER,FCGIAPACHE_ROLE 设置为 AUTHORIZER。必须使用 AuthnzFcgiDefineProvider 将 application 定义为提供者类型 authz。调用时,application 应使用提供的用户 ID 和其他请求数据授权 client。 Example application:#!/usr/bin/perl
使用 FCGI;
我$request = FCGI::Request();
while($request -> Accept()>= 0){
如果$ENV{'FCGIAPACHE_ROLE'}ne“AUTHORIZER”就会死;
假如$ENV{'FCGI_ROLE'}ne“AUTHORIZER”;
如果$ENV{'REMOTE_PASSWD'},我会死print STDERR“此文本被写入 web 服务器错误 log。\ n”;
if($ENV{'REMOTE_USER'}eq“foo1”){
打印“状态:200\n”;
打印“Variable-AUTHZ_1:authz_01\n”;
打印“Variable-AUTHZ_2:authz_02\n”;
打印“\ n”;
}
其他{
打印“状态:403\n\n”;
}
}Example configuration:AuthnzFcgiDefineProvider authz FooAuthz fcgi://localhost:10103/
<Location "/protected/">
AuthType ......
AuthName ......
AuthBasicProvider ...
需要 FooAuthz
</Location>输入
authnz
,机制AuthBasicProvider
Require
在此模式中,支持 web server-agnostic FastCGI AUTHORIZER 协议,FCGI_ROLE 设置为 AUTHORIZER 且未设置 FCGIAPACHE_ROLE。必须使用 AuthnzFcgiDefineProvider 将 application 定义为提供程序类型 authnz。期望 application 使用用户标识,密码和其他请求数据在同一调用中处理身份验证和授权。调用发生在 Apache httpd API 身份验证阶段。如果 application 返回 200 并且在授权阶段(通过 Require)调用了相同的提供程序,则 mod_authnz_fcgi 将在没有调用 application 的情况下_retret 授权阶段成功。 Example application:#!/usr/bin/perl
使用 FCGI;
我的$request = FCGI::Request();
while($request -> Accept()>= 0){
死$ENV{'FCGIAPACHE_ROLE'};
如果$ENV{'FCGI_ROLE'}ne“AUTHORIZER”就会死;
如果死!$ENV{'REMOTE_PASSWD'};
如果死!$ENV{'REMOTE_USER'};print STDERR“此文本被写入 web 服务器错误 log。\ n”;
if(($ENV{'REMOTE_USER'}eq“foo”||$ENV{'REMOTE_USER'}eq“foo1”)&&
$ENV{'REMOTE_PASSWD'}eq“bar”&&
$ENV{'REQUEST_URI'}=~m%/bar/.*%){
打印“状态:200\n”;
打印“Variable-AUTHNZ_1:authnz_01\n”;
打印“Variable-AUTHNZ_2:authnz_02\n”;
打印“\ n”;
}
其他{
打印“状态:401\n\n”;
}
}Example configuration:AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://localhost:10103/
<Location "/protected/">
AuthType Basic
AuthName“受限制”
AuthBasicProvider FooAuthnz
需要 FooAuthnz
</Location>输入
authn
,机制check_user_id
在此模式下,FCGI_ROLE 设置为 AUTHORIZER,FCGIAPACHE_ROLE 设置为 AUTHENTICATOR。必须使用 AuthnzFcgiDefineProvider 将 application 定义为提供程序类型 authn。 AuthnzFcgiCheckAuthnProvider 指定何时调用它。 Example application:#!/usr/bin/perl
使用 FCGI;
我$request = FCGI::Request();
while($request -> Accept()>= 0){
if $ENV{'FCGIAPACHE_ROLE'}ne“AUTHENTICATOR”;
假如$ENV{'FCGI_ROLE'}ne“AUTHORIZER”;此授权程序假定 RequireBasicAuth 选项
AuthnzFcgiCheckAuthnProvider 开启:
如果死!$ENV{'REMOTE_PASSWD'};
如果死!$ENV{'REMOTE_USER'};print STDERR“此文本被写入 web 服务器错误 log。\ n”;
if(($ENV{'REMOTE_USER'}eq“foo”||$ENV{'REMOTE_USER'}eq“foo1”)&&
$ENV{'REMOTE_PASSWD'}eq“bar”){
打印“状态:200\n”;
打印“Variable-AUTHNZ_1:authnz_01\n”;
打印“Variable-AUTHNZ_2:authnz_02\n”;
打印“\ n”;
}
其他{
打印“状态:401\n\n”;
#如果在此处写入响应正文,则会返回客户端。
}
}Example configuration:AuthnzFcgiDefineProvider authn FooAuthn fcgi://localhost:10103/
<Location "12">
AuthType ......
AuthName ......
AuthnzFcgiCheckAuthn 提供者 FooAuthn
权威人士
RequireBasicAuth Off
UserExpr“%{。31}”
要求......
</Location>
其他例子
- 如果您的 application 支持单独的身份验证和授权角色(
AUTHENTICATOR
和AUTHORIZER
),请按如下方式定义单独的提供程序,即使它们 map 到同一个 application:
AuthnzFcgiDefineProvider authn FooAuthn fcgi://localhost:10102/ AuthnzFcgiDefineProvider authz FooAuthz fcgi://localhost:10102/
在AuthBasicProvider上指定 authn 提供程序,在要求上指定 authz 提供程序:
AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthn Require FooAuthz
- 如果您的 application 支持通用
AUTHORIZER
角色(一次调用中的身份验证和授权程序),请按如下方式定义单个提供程序:
AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://localhost:10103/
在AuthBasicProvider
和Require
上指定 authnz 提供程序:
AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthnz Require FooAuthnz
限制
以下是当前未实现的潜在 features:
- Apache httpd 访问检查器
Apache httpd API 访问检查阶段是与身份验证和授权分开的一个阶段。其他一些 FastCGI implementations 实现了这个阶段,由 FCGIAPACHE_ROLE 到 ACCESS_CHECKER 的设置表示。 - 本地(Unix)套接字或管道
目前仅支持 TCP 套接字。 - 支持 mod_authn_socache
应该为参与 Apache httpd-style 身份验证的 applications 实现 mod_authn_socache 交互。 - 使用 AuthDigestProvider 支持摘要式身份验证
由于没有用于检索哈希的授权者流程,因此预计这将是永久性限制。 - Application process management
预计这将永远超出此模块的范围。 Application 进程必须通过其他方式控制。例如,fcgistarter 可用于启动它们。 - AP_AUTHINTERNAL_PER_URI
所有提供程序当前都注册为 AP_AUTHINTERNAL_PER_CONF,这意味着不会对具有与初始请求相同的访问控制 configuration 的内部子请求再次执行检查。 - 协议数据字符集转换
如果 mod_authnz_fcgi 在 EBCDIC 编译环境中运行,则所有 FastCGI 协议数据都以 EBCDIC 写入,并且预计将在 EBCDIC 中接收。 - 每个连接多个请求
目前,在每个处理阶段后,与 FastCGI 授权程序的连接都将关闭。例如,如果授权者处理单独的 authn 和 authz 阶段,则将使用两个连接。 - URI 映射
无法映射来自 clients 的 URI,例如使用与 FastCGI 响应程序一起使用的 ProxyPass。
Logging
- 处理错误记录在 log level
error
及更高版本中。 - application 写入的消息记录在 log level
warn
中。 - 用于调试的常规消息记录在 log level
debug
中。 - 传递给 application 的环境变量记录在 log level
trace2
中。REMOTE_PASSWD
变量的 value 将被遮挡,但log中将显示任何其他敏感数据。 - 模块和 FastCGI application 之间的所有 I/O,包括所有环境变量,都将以_pd level
trace5
的可打印和十六进制格式记录。所有敏感数据都将在 log 中显示.
LogLevel可用于配置特定于 mod_authnz_fcgi 的 log level。例如:
LogLevel info authnz_fcgi:trace8
AuthnzFcgiCheckAuthnProvider 指令
描述: | 启用 FastCGI application 以处理 check_authn 身份验证 hook。 |
句法: | AuthnzFcgiCheckAuthnProvider provider-name\|None option ... |
默认: | none |
Context: | 目录 |
状态: | 延期 |
模块: | mod_authnz_fcgi |
该指令用于使 FastCGI 授权程序能够处理特定的身份验证或授权处理阶段。
FastCGI 授权程序的某些功能需要使用此指令而不是AuthBasicProvider
来启用:
- Non-Basic 认证;通常,确定 client 的用户 ID 并从授权者返回它;请参阅下面的
UserExpr
选项 - 选择自定义响应 code;对于来自授权者的 non-200 响应,来自授权者的 code 将是响应的状态
- 设置 non-200 响应的主体;如果授权者提供了一个带有 non-200 响应的响应主体,那么该主体将返回到 client;最多支持 8192 个字节的文本
- provider-name
这是使用 AuthnzFcgiDefineProvider 定义的提供程序的 name。 None
指定 None 以禁用在外部作用域中使用此指令启用的提供程序,例如在 parent 目录中。- 选项
支持以下选项:权威开|关(默认开)这控制当此模块配置了 FastCGI 授权程序并且请求失败时是否允许其他模块运行。 DefaultUser userid 当授权者返回成功并且配置 UserExpr 并且求值为空 string(e.g.,授权者没有 return 变量)时,此 value 将用作用户 ID。这通常在授权者具有来宾或未经身份验证的概念时使用,用户和来宾用户被映射到某些特定用户 ID 以进行 logging 和其他目的。 RequireBasicAuth On | Off(默认关闭)此选项控制在将请求传递给授权程序之前是否需要 Basic auth。如果需要,将在没有用户标识和密码的情况下调用授权程序;如果没有这个请求,将返回 401。 UserExpr expr(无默认值)当 client 未提供基本身份验证且授权者确定用户时,在调用授权程序后评估此表达式将确定用户。表达式遵循 ap_expr 语法,必须解析为 string。典型的用法是使用 UserExpr“%{。77}”之类的选项引用授权程序返回的 Variable-XXX 设置。如果指定了此选项,并且在成功进行身份验证后无法使用表达式检索用户标识,则将拒绝该请求,并显示 500 错误。
AuthnzFcgiDefineProvider 指令
描述: | 将 FastCGI application 定义为身份验证 and/or 授权的提供程序 |
句法: | AuthnzFcgiDefineProvider type provider-name backend-address |
默认: | none |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_authnz_fcgi |
该指令用于将 FastCGI application 定义为特定验证或授权阶段的提供程序。
- 类型
必须将其设置为 authn 进行身份验证,authz 进行授权,或者将 authnz 设置为执行两种检查的通用 FastCGI 授权程序。 - provider-name
这用于将 name 分配给在其他指令(如 AuthBasicProvider 和 Require)中使用的提供程序。 - backend-address
它以 fcgi://hostname:port/的形式指定 application 的地址。 application process(es)必须独立管理,例如使用 fcgistarter。