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

Apache 模組 mod_authz_core

可用的語言:  en  |  fr 

說明主要認證
狀態基本
模組識別碼authz_core_module
原始檔mod_authz_core.c
相容性可在 Apache HTTPD 2.3 及後續版本中使用

摘要

此模組提供主要認證功能,讓認證過的使用者可以存取或拒絕存取網站的部分內容。 mod_authz_core 提供註冊各種認證提供程式的功能。通常會與驗證提供程式模組(例如 mod_authn_file)和認證模組(例如 mod_authz_user)搭配使用。模組也會允許在認證處理中套用進階邏輯。

Support Apache!

主題

指令

錯誤修正檢查清單

請參閱

top

認證容器

認證容器指令 <RequireAll><RequireAny><RequireNone> 可相互結合,並與 Require 指令一起使用,表達複雜的認證邏輯。

下方的範例表示以下的認證邏輯。若要存取資源,使用者必須是 superadmin 使用者,或同時屬於 admins 群組以及 LDAP 群組 Administrators,並同時屬於 sales 群組或具有 LDAP dept 屬性 sales。此外,若要存取資源,使用者不得同時屬於 temps 群組或 LDAP 群組 Temporary Employees

<Directory "/www/mydocs">
    <RequireAll>
        <RequireAny>
            Require user superadmin
            <RequireAll>
                Require group admins
                Require ldap-group "cn=Administrators,o=Airius"
                <RequireAny>
                    Require group sales
                    Require ldap-attribute dept="sales"
                </RequireAny>
            </RequireAll>
        </RequireAny>
        <RequireNone>
            Require group temps
            Require ldap-group "cn=Temporary Employees,o=Airius"
        </RequireNone>
    </RequireAll>
</Directory>
top

Require 指令

mod_authz_core 提供一些一般性的授權提供者,可與 Require 指令搭配使用。

Require env

env 提供者允許根據 環境變數 的存在與否來控管對伺服器的存取。當指定 Require env env-variable 時,則如果環境變數 env-variable 存在,此要求即可存取。伺服器提供彈性方式設定環境變數,方式是根據用戶端要求的特徵使用 mod_setenvif 提供的指令。因此,此指令可用來根據客戶端 User-Agent(瀏覽器類型)、Referer 或其他 HTTP 要求標頭欄位等因素允許存取。

SetEnvIf User-Agent "^KnockKnock/2\.0" let_me_in
<Directory "/docroot">
    Require env let_me_in
</Directory>

在這種情況下,使用者代理字串以 KnockKnock/2.0 開頭的瀏覽器將被允許存取,而所有其他瀏覽器都將遭到拒絕。

當伺服器透過內部 子要求 查詢路徑,例如尋找 DirectoryIndex 或使用 mod_autoindex 產生目錄清單時,逐項要求的環境變數不會繼承到子要求中。此外,SetEnvIf 指令不會在子要求中個別評估,因為 API 階段 mod_setenvif 會執行動作。

Require all

all 提供者模擬先前由「允許來自所有」和「拒絕來自所有」指令所提供的功能。此提供者可採用「允許」或「拒絕」這兩個引數之一。以下範例將允許或拒絕所有要求。

Require all granted
Require all denied

Require method

method 提供者允許在授權決策中使用 HTTP 方法。GET 和 HEAD 方法視為相等。TRACE 方法對此提供者不可用,請改用 TraceEnable

以下範例只允許 GET、HEAD、POST 和 OPTIONS 要求

Require method GET POST OPTIONS

以下範例將允許在不驗證的情況下進行 GET、HEAD、POST 和 OPTIONS 要求,並且對所有其他方法要求有效的使用者

<RequireAny>
     Require method GET POST OPTIONS
     Require valid-user
</RequireAny>

Require expr

expr 提供者允許根據武斷的表達式建立授權決策。

Require expr "%{TIME_HOUR} -ge 9 && %{TIME_HOUR} -le 17"
<RequireAll>
    Require expr "!(%{QUERY_STRING} =~ /secret/)"
    Require expr "%{REQUEST_URI} in { '/example.cgi', '/other.cgi' }"
</RequireAll>
Require expr "!(%{QUERY_STRING} =~ /secret/) && %{REQUEST_URI} in { '/example.cgi', '/other.cgi' }"

語法在 ap_expr 文件中說明。在 httpd 2.4.16 之前,必須省略周圍的雙引號。

通常,表達式在驗證之前評估。但是,如果表達式傳回 false 並參照變數 %{REMOTE_USER},則會執行驗證且會重新評估表達式。

top

建立授權提供者別名

可以在設定檔中建立延伸驗證提供者,並指定一個別名。別名提供者可以用與基礎驗證提供者相同的方式透過 Require 指令進行參考。除了建立和指定延伸提供者的別名,它還允許多個位置參考同一個延伸驗證提供者。

範例

以下範例基於 ldap-group 驗證提供者,建立兩個不同 ldap 驗證提供者別名。此範例允許單一驗證位置檢查多個 ldap 主機中的群組成員資格

<AuthzProviderAlias ldap-group ldap-group-alias1 "cn=my-group,o=ctx">
    AuthLDAPBindDN "cn=youruser,o=ctx"
    AuthLDAPBindPassword yourpassword
    AuthLDAPUrl "ldap://ldap.host/o=ctx"
</AuthzProviderAlias>

<AuthzProviderAlias ldap-group ldap-group-alias2 "cn=my-other-group,o=dev">
    AuthLDAPBindDN "cn=yourotheruser,o=dev"
    AuthLDAPBindPassword yourotherpassword
    AuthLDAPUrl "ldap://other.ldap.host/o=dev?cn"
</AuthzProviderAlias>

Alias "/secure" "/webpages/secure"
<Directory "/webpages/secure">
    Require all granted

    AuthBasicProvider file

    AuthType Basic
    AuthName LDAP_Protected_Place

    #implied OR operation
    Require ldap-group-alias1
    Require ldap-group-alias2
</Directory>
top

AuthMerging 指令

說明控制每個組態區段驗證邏輯的方式,搭配先前的組態區段邏輯結合。
語法AuthMerging Off | And | Or
預設值AuthMerging Off
內容目錄,.htaccess
覆寫AuthConfig
狀態基本
模組mod_authz_core

當驗證已啟用,通常會由每個後續 組態區段繼承,除非指定不同的驗證指令。這是預設動作,對於顯示設定 AuthMerging Off 的行為一致。

然而,可能會出現某些情境,讓組態區段的驗證 желательно與前一個組態區段的驗證結合,同時這些組態區段正在合併中。對於此狀況,有兩個選項可用,AndOr

當組態區段包含 AuthMerging AndAuthMerging Or,它的驗證邏輯會與最近的前一個區段結合(根據組態區段的整體順序),且這個前一個區段也包含驗證邏輯,就好像兩個區段一起都包含在 <RequireAll><RequireAny> 指令中。

AuthMerging 的設定不繼承到顯示它之前的所有組態區段。在以下範例,只有屬於群組 alpha 的使用者可以存取 /www/docs。屬於群組 alphabeta 的使用者可以存取 /www/docs/ab。不過,預設 AuthMerging 設定「關閉」套用至 /www/docs/ab/gamma<Directory> 組態區段,因此該區段的驗證指令會覆寫前一個區段的設定。因此只有屬於群組 gamma 的使用者可以存取 /www/docs/ab/gamma
<Directory "/www/docs">
    AuthType Basic
    AuthName Documents
    AuthBasicProvider file
    AuthUserFile "/usr/local/apache/passwd/passwords"
    Require group alpha
</Directory>

<Directory "/www/docs/ab">
    AuthMerging Or
    Require group beta
</Directory>

<Directory "/www/docs/ab/gamma">
    Require group gamma
</Directory>
top

<AuthzProviderAlias> 指令

說明包圍代表基礎驗證提供者延伸且由指定別名參考的一群指令
語法<AuthzProviderAlias baseProvider Alias Require-Parameters> ... </AuthzProviderAlias>
內容伺服器組態
狀態基本
模組mod_authz_core

<AuthzProviderAlias></AuthzProviderAlias> 用於封裝一組驗證指令,可以使用指令 Require 透過別名名稱來參照。

如果 Require-Parameters 中需要多個參數,必須用引號引起來。否則,只會考量第一個參數。

# In this example, for both addresses to be taken into account, they MUST be enclosed
# between quotation marks
<AuthzProviderAlias ip reject-ips "XXX.XXX.XXX.XXX YYY.YYY.YYY.YYY">
</AuthzProviderAlias>

<Directory "/path/to/dir">
    <RequireAll>
        Require not reject-ips
        Require all granted
    </RequireAll>
</Directory>
top

AuthzSendForbiddenOnFailure 指令

說明如果驗證成功但授權失敗,傳送「403 禁止存取」而非「401 未授權」
語法AuthzSendForbiddenOnFailure 開啟|關閉
預設值AuthzSendForbiddenOnFailure 關閉
內容目錄,.htaccess
狀態基本
模組mod_authz_core
相容性提供於 Apache HTTPD 2.3.11 及後續版本

如果驗證成功但授權失敗,Apache HTTPD 預設會透過 HTTP 回應傳送回應代碼「401 未授權」。瀏覽器通常會再次顯示密碼對話框給使用者,這並非在所有情況下都是想要的結果。AuthzSendForbiddenOnFailure 可以將回應代碼變更為「403 禁止存取」。

安全性警告

於未授權情況下修改回應會讓密碼的安全性降低,因為它會讓潛在攻擊者知道他猜測的密碼是正確的。

top

Require 指令

說明測試已驗證使用者是否已獲授權提供者授權。
語法Require [not] entity-name [entity-name] ...
內容目錄,.htaccess
覆寫AuthConfig
狀態基本
模組mod_authz_core

此指令會根據特定授權提供者和指定限制來測試已驗證使用者是否已獲得授權。mod_authz_core提供下列一般性授權提供者

Require all granted
無條件地允許存取。
Require all denied
無條件地拒絕存取。
Require env env-var [env-var] ...
只有在設定其中一個指定的環境變數時,才會允許存取。
Require method http-method [http-method] ...
只允許存取指定的 HTTP 方法。
Require expr expression
如果 expression 評估為 true,則允許存取。

mod_authz_usermod_authz_hostmod_authz_groupfile 提供的一些允許語法是

Require user userid [userid] ...
只有指定的名稱使用者可以存取資源。
Require group group-name [group-name] ...
只有指定群組中的使用者可以存取資源。
Require valid-user
所有有效的使用者都可以存取資源。
Require ip 10 172.20 192.168.2
在指定 IP 位址範圍內的用戶端可以存取資源。
Require forward-dns dynamic.example.org
將來自名稱 dynamic.example.org 解析出來的 IP 的用戶端會被允許存取。

mod_authnz_ldapmod_authz_dbmmod_authz_dbdmod_authz_ownermod_ssl 等其他實施選項的授權模組包含中。

在大部分情況中,完整的驗證和授權組態,Require 必須附帶 AuthNameAuthTypeAuthBasicProviderAuthDigestProvider 指令,以及 AuthUserFileAuthGroupFile(用於定義使用者和群組)等指令才能正常運作。範例

AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile "/web/users"
AuthGroupFile "/web/groups"
Require group admin

以這種方式套用的存取控制在所有方法中都很有效。這通常是所希望的結果。如果您只想要套用存取控制至特定方法,同時不保護其他方法,請將 Require 陳述放入 <Limit> 部分。

可用 not 選項否決 Require 指令的結果。與其他否決授權指令 <RequireNone> 一樣,當 Require 指令被否決時,它只能失敗或傳回中性結果,因此永遠無法獨立授權請求。

在以下範例中,除了同時在 reject 群組的使用者之外,alphabeta 群組中的所有使用者都已授權。

<Directory "/www/docs">
    <RequireAll>
        Require group alpha beta
        Require not group reject
    </RequireAll>
</Directory>

當多個 Require 指令用於單一 組態部分 中,而且不包含在其他授權指令(例如 <RequireAll>)中時,它們會被隱含包含在 <RequireAny> 指令中。因此,第一個授權使用者的指令會授權整個請求,而後續的 Require 指令會被忽略。

安全性警告

在設定 Location 部分中的授權指令時,請小心處理與文件系統中的外送內容有重疊的情況。預設情況下,這些 組態部分 會覆寫 DirectoryFiles 部分中的授權組態。

可使用 AuthMerging 指令控制合併授權組態部分的方式。

請參閱

top

<RequireAll> 指令

說明包含一群授權指令,其中任一條都不得失敗,且至少一條必須成功,才能讓封裝指令成功。
語法<RequireAll> ... </RequireAll>
內容目錄,.htaccess
覆寫AuthConfig
狀態基本
模組mod_authz_core

<RequireAll></RequireAll> 用於封裝一組身分驗證指令,不得任一失敗,至少一項成功使 <RequireAll> 指令才能成功。

如果在 <RequireAll> 指令中包含的所有指令均未失敗且至少一項成功,則 <RequireAll> 指令成功。若無成功且無失敗,則傳回中性結果。其他所有情況皆失敗。

請參閱

top

<RequireAny> 指令

說明封裝一組身分驗證指令,其中一項必須成功才能使封裝指令成功。
語法<RequireAny> ... </RequireAny>
內容目錄,.htaccess
覆寫AuthConfig
狀態基本
模組mod_authz_core

<RequireAny></RequireAny> 用於封裝一組身分驗證指令,其中一項必須成功才能使 <RequireAny> 指令成功。

如果在 <RequireAny> 指令中包含的所有指令中有一項或多項成功,則 <RequireAny> 指令成功。若無成功且無失敗,則傳回中性結果。其他所有情況皆失敗。

由於否定身分驗證指令無法傳回成功結果,因此無法顯著影響 <RequireAny> 指令的結果。(最多只能在失敗、所有其他指令傳回中性值的情況下造成指令失敗。) 因此,否定身分驗證指令不允許在 <RequireAny> 指令中使用。

請參閱

top

<RequireNone> 指令

說明封裝一組身分驗證指令,其中不得任一成功,封裝指令才不會失敗。
語法<RequireNone> ... </RequireNone>
內容目錄,.htaccess
覆寫AuthConfig
狀態基本
模組mod_authz_core

<RequireNone></RequireNone> 用於封裝一組身分驗證指令,其中不得任一成功才能使 <RequireNone> 指令不失敗。

如果在 <RequireNone> 指令中包含的所有指令中有一項或多項成功,則 <RequireNone> 指令失敗。其他所有情況皆傳回中性結果。因此,與另一個否定身分驗證指令 Require not 類似,它永遠無法獨立授權請求,因為它永遠無法傳回成功結果。然而,它可以用於限制有權存取資源的使用者組。

由於否定身分驗證指令無法傳回成功結果,因此無法顯著影響 <RequireNone> 指令的結果。因此,否定身分驗證指令不允許在 <RequireNone> 指令中使用。

請參閱

可用的語言:  en  |  fr 

top

意見

注意
這不是問答區。放置於此處的意見應指向改善文件或伺服器的建議,如果已被執行或被視為無效/離題,可能會被我們的管理員移除。有關如何管理 Apache HTTP Server 的問題應直接寄送至 Libera.chat 上的 IRC 頻道 #httpd,或發送至我們的郵寄清單