<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_authnz_fcgi

可用语言:  en  |  fr 

描述允许 FastCGI 授权应用程序处理 Apache httpd 身份验证和授权
状态扩展
模块标识符authnz_fcgi_module
源文件mod_authnz_fcgi.c
兼容性在版本 2.4.10 及更高版本中可用

摘要

此模块允许 FastCGI 授权应用程序对用户进行身份验证并授权访问资源。它支持通用 FastCGI 授权程序,这些授权程序参与身份验证和授权的单一阶段,以及 Apache httpd 特定的身份验证程序和授权程序,这些程序参与一个或两个阶段。

FastCGI 授权程序可以使用用户 ID 和密码进行身份验证,例如用于基本身份验证,或者可以使用任意机制进行身份验证。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

调用模式

此模块支持的 FastCGI 授权程序的调用模式由两个特征区分,类型和身份验证机制

类型只是用于身份验证的authn,用于授权的authz,或者用于组合身份验证和授权的authnz

身份验证机制是指 Apache httpd 配置机制和处理阶段,可以是AuthBasicProviderRequirecheck_user_id。前两个对应于用于启用参与相应处理阶段的指令。

每种模式的描述

类型authn机制AuthBasicProvider
在此模式下,FCGI_ROLE 设置为AUTHORIZERFCGI_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://localhost:10102/
<Location "/protected/">
  AuthType Basic
  AuthName "Restricted"
  AuthBasicProvider FooAuthn
  Require ...
</Location>
类型authz机制Require
在此模式下,FCGI_ROLE 设置为AUTHORIZERFCGI_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://localhost:10103/
<Location "/protected/">
  AuthType ...
  AuthName ...
  AuthBasicProvider ...
  Require FooAuthz
</Location>
类型authnz机制AuthBasicProvider + Require
在此模式下,支持与 Web 服务器无关的 FastCGI AUTHORIZER 协议,FCGI_ROLE 设置为AUTHORIZERFCGI_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://localhost:10103/
<Location "/protected/">
  AuthType Basic
  AuthName "Restricted"
  AuthBasicProvider FooAuthnz
  Require FooAuthnz
</Location>
类型authn机制check_user_id
在此模式下,FCGI_ROLE 设置为AUTHORIZERFCGI_APACHE_ROLE 设置为AUTHENTICATOR。应用程序必须使用AuthnzFcgiDefineProvider 定义为提供程序类型authnAuthnzFcgiCheckAuthnProvider 指定何时调用它。示例应用程序
#!/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>
top

其他示例

  1. 如果您的应用程序支持单独的身份验证和授权角色(AUTHENTICATORAUTHORIZER),请定义单独的提供程序,如下所示,即使它们映射到同一个应用程序
    AuthnzFcgiDefineProvider authn  FooAuthn  fcgi://localhost:10102/
    AuthnzFcgiDefineProvider authz  FooAuthz  fcgi://localhost:10102/
    AuthBasicProvider 上指定 authn 提供程序,在Require 上指定 authz 提供程序
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthn
    Require FooAuthz
  2. 如果您的应用程序支持通用AUTHORIZER 角色(在一个调用中进行身份验证和授权),请定义一个提供程序,如下所示
    AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://localhost:10103/
    AuthBasicProviderRequire 上都指定 authnz 提供程序
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthnz
    Require FooAuthnz
top

限制

以下是目前未实现的潜在功能

Apache httpd 访问检查器
Apache httpd API 访问检查阶段与身份验证和授权是独立的阶段。一些其他 FastCGI 实现实现了此阶段,这由将FCGI_APACHE_ROLE 设置为ACCESS_CHECKER 来表示。
本地(Unix)套接字或管道
目前仅支持 TCP 套接字。
对 mod_authn_socache 的支持
应为参与 Apache httpd 风格身份验证的应用程序实现 mod_authn_socache 交互。
使用 AuthDigestProvider 支持摘要身份验证
预计这将是一个永久性限制,因为没有用于检索哈希的授权程序流程。
应用程序进程管理
预计这将永远超出此模块的范围。应用程序进程必须通过其他方式控制。例如,可以使用fcgistarter 启动它们。
AP_AUTH_INTERNAL_PER_URI
所有提供程序目前都注册为 AP_AUTH_INTERNAL_PER_CONF,这意味着不会对具有与初始请求相同的访问控制配置的内部子请求再次执行检查。
协议数据字符集转换
如果 mod_authnz_fcgi 在 EBCDIC 编译环境中运行,所有 FastCGI 协议数据都将以 EBCDIC 格式写入,并预期以 EBCDIC 格式接收。
每个连接的多个请求
目前,在处理的每个阶段之后都会关闭与 FastCGI 授权程序的连接。例如,如果授权程序处理单独的authnauthz 阶段,则将使用两个连接。
URI 映射
来自客户端的 URI 无法映射,例如使用与 FastCGI 响应程序一起使用的ProxyPass
top

日志记录

  1. 处理错误将记录在日志级别error 及更高级别。
  2. 应用程序写入的消息将记录在日志级别warn
  3. 用于调试的通用消息将记录在日志级别debug
  4. 传递给应用程序的环境变量将记录在日志级别trace2REMOTE_PASSWD 变量的值将被隐藏,但任何其他敏感数据都将在日志中可见
  5. 模块和 FastCGI 应用程序之间的所有 I/O,包括所有环境变量,都将以可打印和十六进制格式记录在日志级别trace5所有敏感数据都将在日志中可见。

LogLevel 可用于配置特定于 mod_authnz_fcgi 的日志级别。例如

LogLevel info authnz_fcgi:trace8
top

AuthnzFcgiCheckAuthnProvider 指令

描述启用 FastCGI 应用程序处理 check_authn 身份验证钩子。
语法AuthnzFcgiCheckAuthnProvider provider-name|None option ...
默认值none
上下文directory
状态扩展
模块mod_authnz_fcgi

此指令用于启用 FastCGI 授权程序以处理身份验证或授权的特定处理阶段。

FastCGI 授权程序的一些功能需要使用此指令而不是AuthBasicProvider 来启用

provider-name
这是使用AuthnzFcgiDefineProvider 定义的提供程序的名称。
None
指定None 以禁用在外部范围(例如在父目录中)使用此指令启用的提供程序。
option
支持以下选项
Authoritative On|Off(默认值为 On)
这控制了当此模块具有已配置的 FastCGI 授权程序并且它使请求失败时,是否允许其他模块运行。
DefaultUser userid
当授权程序返回成功且UserExpr 已配置并评估为空字符串(例如,授权程序未返回变量)时,此值将用作用户 ID。这通常用于授权程序具有访客或未经身份验证的用户的概念,并且访客用户映射到某些特定用户 ID 以用于日志记录和其他目的。
RequireBasicAuth On|Off(默认值为 Off)
这控制了在将请求传递给授权程序之前是否需要基本身份验证。如果需要,授权程序将不会在没有用户 ID 和密码的情况下被调用;对于没有该信息的请求,将返回 401。
UserExpr expr(无默认值)
当客户端未提供基本身份验证且授权程序确定用户时,此表达式将在调用授权程序后进行评估,以确定用户。该表达式遵循ap_expr 语法,并且必须解析为字符串。一个典型的用法是使用类似UserExpr "%{reqenv:XXX}" 的选项引用授权程序返回的Variable-XXX 设置。如果指定了此选项,并且在成功身份验证后无法使用表达式检索用户 ID,则请求将被拒绝,并返回 500 错误。
top

AuthnzFcgiDefineProvider 指令

描述将 FastCGI 应用程序定义为身份验证和/或授权的提供程序
语法AuthnzFcgiDefineProvider type provider-name backend-address
默认值none
上下文服务器配置
状态扩展
模块mod_authnz_fcgi

此指令用于将 FastCGI 应用程序定义为特定身份验证或授权阶段的提供程序。

type
这必须设置为用于身份验证的authn,用于授权的authz,或者用于执行两种检查的通用 FastCGI 授权程序的authnz
provider-name
这用于为提供程序分配一个名称,该名称在其他指令(如AuthBasicProviderRequire)中使用。
backend-address
此项指定应用程序的地址,格式为fcgi://hostname:port/。应用程序进程必须独立管理,例如使用fcgistarter

可用语言:  en  |  fr 

top

评论

注意
这不是问答区。此处放置的评论应指向有关改进文档或服务器的建议,如果这些建议已被实施或被认为无效/偏离主题,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应直接发送到我们的 IRC 频道 #httpd(位于 Libera.chat)或发送到我们的邮件列表