Apache HTTP Server 版本 2.4

| 描述 | 允许 FastCGI 授权应用程序处理 Apache httpd 身份验证和授权 |
|---|---|
| 状态 | 扩展 |
| 模块标识符 | authnz_fcgi_module |
| 源文件 | mod_authnz_fcgi.c |
| 兼容性 | 在版本 2.4.10 及更高版本中可用 |
此模块允许 FastCGI 授权应用程序对用户进行身份验证并授权访问资源。它支持通用 FastCGI 授权程序,这些授权程序参与身份验证和授权的单一阶段,以及 Apache httpd 特定的身份验证程序和授权程序,这些程序参与一个或两个阶段。
FastCGI 授权程序可以使用用户 ID 和密码进行身份验证,例如用于基本身份验证,或者可以使用任意机制进行身份验证。
此模块支持的 FastCGI 授权程序的调用模式由两个特征区分,类型和身份验证机制。
类型只是用于身份验证的authn,用于授权的authz,或者用于组合身份验证和授权的authnz。
身份验证机制是指 Apache httpd 配置机制和处理阶段,可以是AuthBasicProvider、Require 或check_user_id。前两个对应于用于启用参与相应处理阶段的指令。
每种模式的描述
authn,机制AuthBasicProviderFCGI_ROLE 设置为AUTHORIZER,FCGI_APACHE_ROLE 设置为AUTHENTICATOR。应用程序必须使用AuthnzFcgiDefineProvider 定义为提供程序类型authn,并使用AuthBasicProvider 启用。调用时,应用程序应使用提供的用户 ID 和密码对客户端进行身份验证。示例应用程序#!/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://:10102/ <Location "/protected/"> AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthn Require ... </Location>
authz,机制RequireFCGI_ROLE 设置为AUTHORIZER,FCGI_APACHE_ROLE 设置为AUTHORIZER。应用程序必须使用AuthnzFcgiDefineProvider 定义为提供程序类型authz。调用时,应用程序应使用提供的用户 ID 和其他请求数据对客户端进行授权。示例应用程序#!/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://:10103/ <Location "/protected/"> AuthType ... AuthName ... AuthBasicProvider ... Require FooAuthz </Location>
authnz,机制AuthBasicProvider + RequireAUTHORIZER 协议,FCGI_ROLE 设置为AUTHORIZER,FCGI_APACHE_ROLE 未设置。应用程序必须使用AuthnzFcgiDefineProvider 定义为提供程序类型authnz。应用程序应在同一调用中使用用户 ID、密码和其他请求数据处理身份验证和授权。调用发生在 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://:10103/ <Location "/protected/"> AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthnz Require FooAuthnz </Location>
authn,机制check_user_idFCGI_ROLE 设置为AUTHORIZER,FCGI_APACHE_ROLE 设置为AUTHENTICATOR。应用程序必须使用AuthnzFcgiDefineProvider 定义为提供程序类型authn。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://:10103/
<Location "/protected/">
AuthType ...
AuthName ...
AuthnzFcgiCheckAuthnProvider FooAuthn \
Authoritative On \
RequireBasicAuth Off \
UserExpr "%{reqenv:REMOTE_USER}"
Require ...
</Location>
AUTHENTICATOR 和AUTHORIZER),请定义单独的提供程序,如下所示,即使它们映射到同一个应用程序AuthnzFcgiDefineProvider authn FooAuthn fcgi://:10102/ AuthnzFcgiDefineProvider authz FooAuthz fcgi://:10102/在
AuthBasicProvider 上指定 authn 提供程序,在Require 上指定 authz 提供程序AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthn Require FooAuthz
AUTHORIZER 角色(在一个调用中进行身份验证和授权),请定义一个提供程序,如下所示AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://:10103/在
AuthBasicProvider 和Require 上都指定 authnz 提供程序AuthType Basic AuthName "Restricted" AuthBasicProvider FooAuthnz Require FooAuthnz
以下是目前未实现的潜在功能
FCGI_APACHE_ROLE 设置为ACCESS_CHECKER 来表示。fcgistarter 启动它们。ProxyPass。error 及更高级别。warn。debug。trace2。REMOTE_PASSWD 变量的值将被隐藏,但任何其他敏感数据都将在日志中可见。trace5。所有敏感数据都将在日志中可见。LogLevel 可用于配置特定于 mod_authnz_fcgi 的日志级别。例如
LogLevel info authnz_fcgi:trace8
| 描述 | 启用 FastCGI 应用程序处理 check_authn 身份验证钩子。 |
|---|---|
| 语法 | AuthnzFcgiCheckAuthnProvider provider-name| |
| 默认值 | none |
| 上下文 | directory |
| 状态 | 扩展 |
| 模块 | mod_authnz_fcgi |
此指令用于启用 FastCGI 授权程序以处理身份验证或授权的特定处理阶段。
FastCGI 授权程序的一些功能需要使用此指令而不是AuthBasicProvider 来启用
UserExpr 选项AuthnzFcgiDefineProvider 定义的提供程序的名称。NoneNone 以禁用在外部范围(例如在父目录中)使用此指令启用的提供程序。UserExpr 已配置并评估为空字符串(例如,授权程序未返回变量)时,此值将用作用户 ID。这通常用于授权程序具有访客或未经身份验证的用户的概念,并且访客用户映射到某些特定用户 ID 以用于日志记录和其他目的。UserExpr "%{reqenv:XXX}" 的选项引用授权程序返回的Variable-XXX 设置。如果指定了此选项,并且在成功身份验证后无法使用表达式检索用户 ID,则请求将被拒绝,并返回 500 错误。| 描述 | 将 FastCGI 应用程序定义为身份验证和/或授权的提供程序 |
|---|---|
| 语法 | AuthnzFcgiDefineProvider type provider-name backend-address |
| 默认值 | none |
| 上下文 | 服务器配置 |
| 状态 | 扩展 |
| 模块 | mod_authnz_fcgi |
此指令用于将 FastCGI 应用程序定义为特定身份验证或授权阶段的提供程序。
AuthBasicProvider 和Require)中使用。fcgistarter。