Active-Directory

如何在帶有 AD 的 Apache httpd 上使用 mod_ldap 和 mod_authnz_ldap 向許多使用者提供網頁的身份驗證和授權?

  • October 30, 2020

我試圖為我們的 Apache httpd 站點上的數百名使用者提供通過 .htaccess 限制我們的 AD 伺服器中的不同使用者和組訪問其網頁的能力。Apache 讓我可以使用 mod_ldap 和 mod_authnz_ldap 輕鬆做到這一點,而且我了解它是如何工作的。我可以使用各種“require user”和“require ldap-group”指令來限制使用者。問題在於與使用者社區共享該特權。

第一個問題是,因為我在 LDAP 中使用 AD,所以我需要綁定使用者名/密碼,該使用者名/密碼通過 AuthLDAPBindDN 和 AuthLDAPBindPassword 在 .htaccess 中提供。我真的不希望使用者在他們的 .htaccess 中使用他們自己的使用者名和密碼作為綁定使用者,因為那樣不會很安全。同時,我不知道發布通用綁定使用者/密碼有多安全。也許這不是問題?畢竟bind使用者不能登錄任何系統,而且我們的AD伺服器在部門外也不可用,每個使用者都已經可以做通用bind使用者可以做的任何事情了。話雖如此,如果有辦法在不共享綁定使用者和密碼的情況下做到這一點,我相信它最終會更好。

理想情況下,Apache httpd 會讓我為 AuthLDAPBindDN 和 AuthLDAPBindPassword 設置一個 DEFAULT,如果在所有情況下都沒有被使用者覆蓋,它將自動使用。據我所知,它不會那樣做。

另一種方法是使用別名。使用者的身份驗證別名 (AuthProviderAlias) 和組的授權別名 (AuthzProviderAlias ldap-group) 有不同的語法。

對於使用者身份驗證,我可以很好地設置預設值:

<AuthnProviderAlias my-ldap>
AuthLDAPURL ...
AuthLDAPBindDN ...
AuthLDAPBindPassword ...
</AuthnProviderAlias>

現在,當使用者在他們的 .htaccess: AuthBasicProvider my-ldap 中使用時,這些值會被繼承。這太棒了。他們可以限制對使用者的訪問。

但隨後對於按組進行的授權部分,事情就崩潰了。

首先,我有許多不同的組,我希望使用者能夠靈活地使用這些組中的任何一個,以允許對其頁面進行受限訪問。據我所知,沒有適用於系統上每個組的 AuthzProviderAlias 語法。我需要為每個組定義如下內容:

<AuthzProviderAlias ldap-group mygroup  ....>
 AuthLDAPURL
 AuthLDAPBindDN
 AuthLDAPBindPassword ...
 Require ldap-group cn=mygroup,...
</AuthzProviderAlias>

好的 - 如果有必要,我可以編寫一個腳本來生成別名文件以匹配我們系統上的所有組。不過感覺不太對。

現在,在使用者 .htaccess 中,他們可以“要求 mygroup”。但是,如果他們想要 group1 或 group2 怎麼辦?Satisfy 指令不適用於多個 require 指令。

現在看來我需要提供組合不同組的組別名——A 組和 B 組、A 組和 C 組——可能性是無窮無盡的。這感覺不對

所以我想我的問題是……如果我共享一個通用的綁定使用者名和密碼並將其發佈到Google索引和世界可以看到的頁面,這有那麼糟糕嗎?這是希望所有使用者能夠通過 Apache httpd 使用 LDAP 身份驗證的人們所做的嗎?該綁定使用者無法登錄任何系統,並且我們的 AD 伺服器無法從部門外部訪問。我不認為這使使用者能夠做任何他們無論如何都做不到的事情。

如果您在全域配置中設置以下內容,它會起作用嗎?

<Location />
 AuthLDAPURL ...
 AuthLDAPBindDN ...
 AuthLDAPBindPassword ...
</Location>

我想知道這些指令是否被其餘配置繼承。那將是一個簡單的解決方案。

我認為你的<AuthzProviderAlias>解決方案會奏效。它與創建授權提供程序別名中的範例幾乎完全相同。這將要求您為每個 LDAP 組創建一個單獨的別名,但您至少可以使用 mod_macro 自動化大部分樣板:

<Macro LdapGroupAlias $name $dn>
 <AuthzProviderAlias ldap-group $name $dn>
   AuthLDAPURL ...
   AuthLDAPBindDN ...
   AuthLDAPBindPassword ...
 </AuthzProviderAlias>
</Macro>
Use LdapGroupAlias group1 cn=group1,...
Use LdapGroupAlias group2 cn=group2,...
...

然後您的使用者可以根據需要組合組,例如:

Require group1
Require group2

等等,包括<RequireAny><RequireAll><RequireNone>以任意方式組合組。因此,您不需要為每個組組合使用新別名 - 每個組只需一個別名。

引用自:https://serverfault.com/questions/1040604