Apache-2.2

針對具有過期帳戶的多個 LDAP 伺服器對 Apache HTTPd 進行身份驗證

  • November 28, 2013

我們在 Apache 2.2.9(在 Debian 5.0、2.2.9-10+lenny7 中提供)中使用 mod_authnz_ldap 和 mod_authn_alias 來針對多個 Active Directory 域進行身份驗證,以託管 Subversion 儲存庫。我們目前的配置是:

# Turn up logging
LogLevel debug

# Define authentication providers
<AuthnProviderAlias ldap alpha>
 AuthLDAPBindDN "CN=Subversion,OU=Service Accounts,O=Alpha"
 AuthLDAPBindPassword [[REDACTED]]
 AuthLDAPURL ldap://dc01.alpha:3268/?sAMAccountName?sub?
</AuthnProviderAlias>

<AuthnProviderAlias ldap beta>
 AuthLDAPBindDN "CN=LDAPAuth,OU=Service Accounts,O=Beta"
 AuthLDAPBindPassword [[REDACTED]]
 AuthLDAPURL ldap://ldap.beta:3268/?sAMAccountName?sub?
</AuthnProviderAlias>

# Subversion Repository
<Location /svn>
 DAV svn
 SVNPath /opt/svn/repo
 AuthName "Subversion"
 AuthType Basic
 AuthBasicProvider alpha beta
 AuthzLDAPAuthoritative off
 AuthzSVNAccessFile /opt/svn/authz
 require valid-user
</Location>

我們遇到了同時擁有 Alpha 和 Beta 帳戶的使用者的問題,尤其是當他們的 Alpha 帳戶已過期時(但仍然存在;公司政策是帳戶至少可以使用 1 年)。例如,當使用者 x(在 Alpha 中具有過期帳戶,並且在 Beta 中具有有效帳戶)時,Apache 錯誤日誌報告如下:

[Tue May 11 13:42:07 2010] [debug] mod_authnz_ldap.c(377): [client 10.1.1.104] [14817] auth_ldap authenticate: using URL ldap://dc01.alpha:3268/?sAMAccountName?sub?
[Tue May 11 13:42:08 2010] [warn] [client 10.1.1.104] [14817] auth_ldap authenticate: user x authentication failed; URI /svn/ [ldap_simple_bind_s() to check user credentials failed][Invalid credentials]
[Tue May 11 13:42:08 2010] [error] [client 10.1.1.104] user x: authentication failure for "/svn/": Password Mismatch
[Tue May 11 13:42:08 2010] [debug] mod_deflate.c(615): [client 10.1.1.104] Zlib: Compressed 527 to 359 : URL /svn/

嘗試以不存在的使用者 (nobodycool) 身份進行身份驗證會導致查詢兩個 LDAP 伺服器的正確行為:

[Tue May 11 13:42:40 2010] [debug] mod_authnz_ldap.c(377): [client 10.1.1.104] [14815] auth_ldap authenticate: using URL ldap://dc01.alpha:3268/?sAMAccountName?sub?
[Tue May 11 13:42:40 2010] [warn] [client 10.1.1.104] [14815] auth_ldap authenticate: user nobodycool authentication failed; URI /svn/ [User not found][No such object]
[Tue May 11 13:42:40 2010] [debug] mod_authnz_ldap.c(377): [client 10.1.1.104] [14815] auth_ldap authenticate: using URL ldap://ldap.beta:3268/?sAMAccountName?sub?
[Tue May 11 13:42:44 2010] [warn] [client 10.1.1.104] [14815] auth_ldap authenticate: user nobodycool authentication failed; URI /svn/ [User not found][No such object]
[Tue May 11 13:42:44 2010] [error] [client 10.1.1.104] user nobodycool not found: /svn/
[Tue May 11 13:42:44 2010] [debug] mod_deflate.c(615): [client 10.1.1.104] Zlib: Compressed 527 to 359 : URL /svn/

如果在 Alpha 中遇到過期帳戶,如何配置 Apache 以正確查詢 Beta?

AuthzLDAPAuthoritative off僅當使用者無法與查詢中的 DN 匹配時,該指令才會讓身份驗證進入下一個模組。目前,即使使用者已過期,執行 LDAP 查詢時似乎仍會返回他們的帳戶。

我對 ActiveDirectory LDAP 架構了解不多,無法在這裡給出明確的答案,但如果您可以在AuthLDAPURL指令中添加一個過濾器來過濾過期帳戶,它應該會導致使用者名與查詢中的任何 DN 不匹配。這應該導致身份驗證落入下一個模組。

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