Apache HTTP 伺服器版本 2.4
說明 | 主要認證 |
---|---|
狀態 | 基本 |
模組識別碼 | authz_core_module |
原始檔 | mod_authz_core.c |
相容性 | 可在 Apache HTTPD 2.3 及後續版本中使用 |
此模組提供主要認證功能,讓認證過的使用者可以存取或拒絕存取網站的部分內容。 mod_authz_core
提供註冊各種認證提供程式的功能。通常會與驗證提供程式模組(例如 mod_authn_file
)和認證模組(例如 mod_authz_user
)搭配使用。模組也會允許在認證處理中套用進階邏輯。
認證容器指令 <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>
mod_authz_core
提供一些一般性的授權提供者,可與 Require
指令搭配使用。
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
會執行動作。
all
提供者模擬先前由「允許來自所有」和「拒絕來自所有」指令所提供的功能。此提供者可採用「允許」或「拒絕」這兩個引數之一。以下範例將允許或拒絕所有要求。
Require all granted
Require all denied
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>
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}
,則會執行驗證且會重新評估表達式。
可以在設定檔中建立延伸驗證提供者,並指定一個別名。別名提供者可以用與基礎驗證提供者相同的方式透過 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>
說明 | 控制每個組態區段驗證邏輯的方式,搭配先前的組態區段邏輯結合。 |
---|---|
語法 | AuthMerging Off | And | Or |
預設值 | AuthMerging Off |
內容 | 目錄,.htaccess |
覆寫 | AuthConfig |
狀態 | 基本 |
模組 | mod_authz_core |
當驗證已啟用,通常會由每個後續 組態區段繼承,除非指定不同的驗證指令。這是預設動作,對於顯示設定 AuthMerging Off
的行為一致。
然而,可能會出現某些情境,讓組態區段的驗證 желательно與前一個組態區段的驗證結合,同時這些組態區段正在合併中。對於此狀況,有兩個選項可用,And
和 Or
。
當組態區段包含 AuthMerging And
或 AuthMerging Or
,它的驗證邏輯會與最近的前一個區段結合(根據組態區段的整體順序),且這個前一個區段也包含驗證邏輯,就好像兩個區段一起都包含在 <RequireAll>
或 <RequireAny>
指令中。
AuthMerging
的設定不繼承到顯示它之前的所有組態區段。在以下範例,只有屬於群組 alpha
的使用者可以存取 /www/docs
。屬於群組 alpha
或 beta
的使用者可以存取 /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>
說明 | 包圍代表基礎驗證提供者延伸且由指定別名參考的一群指令 |
---|---|
語法 | <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>
說明 | 如果驗證成功但授權失敗,傳送「403 禁止存取」而非「401 未授權」 |
---|---|
語法 | AuthzSendForbiddenOnFailure 開啟|關閉 |
預設值 | AuthzSendForbiddenOnFailure 關閉 |
內容 | 目錄,.htaccess |
狀態 | 基本 |
模組 | mod_authz_core |
相容性 | 提供於 Apache HTTPD 2.3.11 及後續版本 |
如果驗證成功但授權失敗,Apache HTTPD 預設會透過 HTTP 回應傳送回應代碼「401 未授權」。瀏覽器通常會再次顯示密碼對話框給使用者,這並非在所有情況下都是想要的結果。AuthzSendForbiddenOnFailure
可以將回應代碼變更為「403 禁止存取」。
於未授權情況下修改回應會讓密碼的安全性降低,因為它會讓潛在攻擊者知道他猜測的密碼是正確的。
說明 | 測試已驗證使用者是否已獲授權提供者授權。 |
---|---|
語法 | 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] ...
Require expr expression
由 mod_authz_user
、mod_authz_host
和 mod_authz_groupfile
提供的一些允許語法是
Require user userid [userid] ...
Require group group-name [group-name] ...
Require valid-user
Require ip 10 172.20 192.168.2
Require forward-dns dynamic.example.org
mod_authnz_ldap
、mod_authz_dbm
、mod_authz_dbd
、mod_authz_owner
和 mod_ssl
等其他實施選項的授權模組包含中。
在大部分情況中,完整的驗證和授權組態,Require
必須附帶 AuthName
、AuthType
和 AuthBasicProvider
或 AuthDigestProvider
指令,以及 AuthUserFile
和 AuthGroupFile
(用於定義使用者和群組)等指令才能正常運作。範例
AuthType Basic AuthName "Restricted Resource" AuthBasicProvider file AuthUserFile "/web/users" AuthGroupFile "/web/groups" Require group admin
以這種方式套用的存取控制在所有方法中都很有效。這通常是所希望的結果。如果您只想要套用存取控制至特定方法,同時不保護其他方法,請將 Require
陳述放入 <Limit>
部分。
可用 not
選項否決 Require
指令的結果。與其他否決授權指令 <RequireNone>
一樣,當 Require
指令被否決時,它只能失敗或傳回中性結果,因此永遠無法獨立授權請求。
在以下範例中,除了同時在 reject
群組的使用者之外,alpha
和 beta
群組中的所有使用者都已授權。
<Directory "/www/docs"> <RequireAll> Require group alpha beta Require not group reject </RequireAll> </Directory>
當多個 Require
指令用於單一 組態部分 中,而且不包含在其他授權指令(例如 <RequireAll>
)中時,它們會被隱含包含在 <RequireAny>
指令中。因此,第一個授權使用者的指令會授權整個請求,而後續的 Require
指令會被忽略。
在設定 Location
部分中的授權指令時,請小心處理與文件系統中的外送內容有重疊的情況。預設情況下,這些 組態部分 會覆寫 Directory
和 Files
部分中的授權組態。
可使用 AuthMerging
指令控制合併授權組態部分的方式。
說明 | 包含一群授權指令,其中任一條都不得失敗,且至少一條必須成功,才能讓封裝指令成功。 |
---|---|
語法 | <RequireAll> ... </RequireAll> |
內容 | 目錄,.htaccess |
覆寫 | AuthConfig |
狀態 | 基本 |
模組 | mod_authz_core |
<RequireAll>
及 </RequireAll>
用於封裝一組身分驗證指令,不得任一失敗,至少一項成功使 <RequireAll>
指令才能成功。
如果在 <RequireAll>
指令中包含的所有指令均未失敗且至少一項成功,則 <RequireAll>
指令成功。若無成功且無失敗,則傳回中性結果。其他所有情況皆失敗。
說明 | 封裝一組身分驗證指令,其中一項必須成功才能使封裝指令成功。 |
---|---|
語法 | <RequireAny> ... </RequireAny> |
內容 | 目錄,.htaccess |
覆寫 | AuthConfig |
狀態 | 基本 |
模組 | mod_authz_core |
<RequireAny>
及 </RequireAny>
用於封裝一組身分驗證指令,其中一項必須成功才能使 <RequireAny>
指令成功。
如果在 <RequireAny>
指令中包含的所有指令中有一項或多項成功,則 <RequireAny>
指令成功。若無成功且無失敗,則傳回中性結果。其他所有情況皆失敗。
<RequireAny>
指令的結果。(最多只能在失敗、所有其他指令傳回中性值的情況下造成指令失敗。) 因此,否定身分驗證指令不允許在 <RequireAny>
指令中使用。說明 | 封裝一組身分驗證指令,其中不得任一成功,封裝指令才不會失敗。 |
---|---|
語法 | <RequireNone> ... </RequireNone> |
內容 | 目錄,.htaccess |
覆寫 | AuthConfig |
狀態 | 基本 |
模組 | mod_authz_core |
<RequireNone>
及 </RequireNone>
用於封裝一組身分驗證指令,其中不得任一成功才能使 <RequireNone>
指令不失敗。
如果在 <RequireNone>
指令中包含的所有指令中有一項或多項成功,則 <RequireNone>
指令失敗。其他所有情況皆傳回中性結果。因此,與另一個否定身分驗證指令 Require not
類似,它永遠無法獨立授權請求,因為它永遠無法傳回成功結果。然而,它可以用於限制有權存取資源的使用者組。
<RequireNone>
指令的結果。因此,否定身分驗證指令不允許在 <RequireNone>
指令中使用。