<-
Apache > HTTP 伺服器 > 文件 > 版本 2.4 > 模組

Apache 模組 mod_authnz_fcgi

語言:  英文  |  法文 

說明允許 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 組態機制和處理階段,可以是 AuthBasicProviderRequire check_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://127.0.0.1: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://127.0.0.1:10103/
<Location "/protected/">
  AuthType ...
  AuthName ...
  AuthBasicProvider ...
  Require FooAuthz
</Location>
類型 authnz機制 AuthBasicProvider + Require
在此模式中,支援與 Web 伺服器無關的 FastCGI AUTHORIZER 通訊協定,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://127.0.0.1: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://127.0.0.1:10103/
<Location "/protected/">
  AuthType ...
  AuthName ...
  AuthnzFcgiCheckAuthnProvider FooAuthn \
                               Authoritative On \
                               RequireBasicAuth Off \
                               UserExpr "%{reqenv:REMOTE_USER}"
  Require ...
</Location>
top

其他範例

  1. 如果您的應用程式支援不同的身分驗證和授權角色(AUTHENTICATORAUTHORIZER),請將不同的提供者定義如下,即使他們對應到同一個應用程式
    AuthnzFcgiDefineProvider authn  FooAuthn  fcgi://127.0.0.1:10102/
    AuthnzFcgiDefineProvider authz  FooAuthz  fcgi://127.0.0.1:10102/
    AuthBasicProvider 中指定 authn 提供者,在 Require 中指定 authz 提供者
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthn
    Require FooAuthz
  2. 如果您的應用程式支援一般性的 AUTHORIZER 角色(在一次呼叫中進行身分驗證和授權),請將單一提供者定義如下
    AuthnzFcgiDefineProvider authnz FooAuthnz fcgi://127.0.0.1:10103/
    AuthBasicProviderRequire 中,指定 authnz 提供者
    AuthType Basic
    AuthName "Restricted"
    AuthBasicProvider FooAuthnz
    Require FooAuthnz
top

限制

以下列出目前尚未實作的潛在功能

Apache httpd 存取檢查器
Apache httpd API 的存取檢查階段是與驗證和授權分開的階段。某些其他 FastCGI 實作會實作這個階段,這以將 FCGI_APACHE_ROLE 設為 ACCESS_CHECKER 來表示。
本機 (Unix) Socket 或管線
目前僅支援 TCP Socket。
支援 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 授權工具。例如,如果授權工具處理分開的驗證授權階段,就會使用兩個連線。
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 提供者名稱|None 選項 ...
預設值none
內容目錄
狀態外掛程式
模組mod_authnz_fcgi

此指令用於讓 FastCGI 授權工具處理驗證或授權的特定處理階段。

FastCGI 核准模組需要在指令中啟用一些功能,而非使用 AuthBasicProvider

provider-name
這是由 AuthnzFcgiDefineProvider 定義的提供者名稱
指定 None 來停用在此指令中於較外部範圍(例如上層目錄)啟用的提供者
option
支援下列選項
Authoritative On|Off(預設為 On)
當此模組已設定 FastCGI 核准模組並且拒絕要求時,此選項控制其他模組是否被允許執行
DefaultUser userid
當核准模組已回傳成功,並且有設定且求值的 UserExpr 為空字串(例如核准模組未回傳變數)時,此值會用作使用者 ID。此選項通常用於核准模組具有訪客或未經核准使用者概念,且訪客使用者會被對應到特定使用者 ID 以利記錄和其他用途
RequireBasicAuth On|Off(預設為 Off)
此選項控制在將請求傳送至核准模組之前是否需要基本核准。如果需要,核准模組沒有使用者 ID 和密碼就無法呼叫;不含使用者 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
後端地址
fcgi://hostname:port/ 格式指定應用程式的地址。應用程式處理序必須獨立管理,例如使用 fcgistarter 程式。

語言:  英文  |  法文 

top

留言

通知
這不是問答區段。放置在這裡的意見應指出關於改善文件或伺服器的建議,若已被實作或認為無效/離題,我們的管理員可能會將其移除。關於如何管理 Apache HTTP 伺服器應透過我們的 Libera.chat IRC 頻道 #httpd 提出,或發布給我們的郵件清單