• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 机制和处理阶段,可以是AuthBasicProviderRequirecheck_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,机制AuthBasicProviderRequire
      在此模式中,支持 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 支持单独的身份验证和授权角色(AUTHENTICATORAUTHORIZER),请按如下方式定义单独的提供程序,即使它们 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/
    

    AuthBasicProviderRequire上指定 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。