使用过期帐户针对多个 LDAP 服务器对 Apache HTTPd 进行身份验证

使用过期帐户针对多个 LDAP 服务器对 Apache HTTPd 进行身份验证

我们在 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/

如果 Apache 在 Alpha 中遇到过期帐户,我该如何配置它才能正确查询 Beta?

答案1

仅当用户无法与查询中的 DN 匹配时,该AuthzLDAPAuthoritative off指令才会让身份验证进入下一个模块。目前,即使用户已过期,执行 LDAP 查询时似乎仍会返回其帐户。

我对 ActiveDirectory LDAP 架构了解不够多,无法在这里给出明确的答案,但如果您可以在指令中添加一个过滤器来AuthLDAPURL过滤掉过期的帐户,它应该会导致用户名与查询中的任何 DN 不匹配。这应该会导致身份验证进入下一个模块。

相关内容