<-
Apache HTTP 服务器 2.4 > Apache模块mod_authnz_fcgi

Apache模块mod_authnz_fcgi

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

摘要

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

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

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

调用方式

此模块支持的FastCGI授权者的调用模式通过两个特征(类型和身份验证机制)来区分。

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

验证机构是指在Apache httpd配置机制和处理阶段,并且可以是 AuthBasicProviderRequire,或 check_user_id。其中的前两个对应于用于参与适当处理阶段的指令。

每种模式的说明:

类型 authn机制 AuthBasicProvider
在此模式下, FCGI_ROLE设置为AUTHORIZERFCGI_APACHE_ROLE并且设置为AUTHENTICATOR。应用程序必须被定义为供应商类型authn 使用 AuthnzFcgiDefineProvider,并启用 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。该应用程序必须被定义为提供者类型AuthZ的使用 AuthnzFcgiDefineProvider。调用时,应用程序应使用提供的用户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
在这种模式下,它支持在网络服务器无关的FastCGI AUTHORIZER协议,FCGI_ROLE被设定为 AUTHORIZERFCGI_APACHE_ROLE没有被设置。该应用程序必须被定义为提供者类型authnz 使用 AuthnzFcgiDefineProvider。该应用程序应使用用户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。该应用程序必须被定义为提供者类型authn使用 AuthnzFcgiDefineProviderAuthnzFcgiCheckAuthnProvider 指定何时调用。示例应用程序:
#!/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>
最佳

其他例子

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

局限性

以下是当前尚未实现的潜在功能:

Apache httpd访问检查器
Apache httpd API 访问检查阶段是与身份验证和授权分开的阶段。其他一些FastCGI实现也实现了此阶段,用FCGI_APACHE_ROLEto 的设置表示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,例如 ProxyPass与FastCGI响应器一起使用时。
最佳

记录中

  1. 处理错误记录在日志级别error 或更高级别。
  2. 应用程序编写的消息在日志级别记录warn
  3. 用于调试的常规消息记录在日志级别 debug
  4. 传递给应用程序的环境变量在日志级别记录trace2REMOTE_PASSWD变量的值 将被遮盖,但其他敏感数据将在日志中可见
  5. 模块和FastCGI应用程序之间的所有I / O(包括所有环境变量)将在日志级别以可打印和十六进制格式记录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

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

AuthnzFcgiDefineProvider 指令

描述:将FastCGI应用程序定义为身份验证和/或授权的提供者
句法:AuthnzFcgiDefineProvider type provider-name backend-address
默认:none
内容:服务器配置
状态:延期
模块:mod_authnz_fcgi

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

类型
必须将其设置为authn进行身份验证,将 authz进行授权,或将authnz设置为执行两次检查的通用FastCGI授权方。
提供者名称
这用于为提供程序分配名称,该名称用于其他指令(例如 AuthBasicProvider 和)中 Require
后端地址
它以fcgi:// hostname:port /的形式指定应用程序的地址 。申请流程必须独立管理,例如使用 fcgistarter

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。