Autenticando o Apache HTTPd em vários servidores LDAP com contas expiradas

8

Estamos usando mod_authnz_ldap e mod_authn_alias no Apache 2.2.9 (como fornecido no Debian 5.0, 2.2.9-10 + lenny7) para autenticar em vários domínios do Active Directory para hospedar um repositório Subversion. Nossa configuração atual é:

# 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>

Estamos enfrentando problemas com usuários que têm contas em Alpha e Beta, especialmente quando suas contas em Alpha expiram (mas ainda estão presentes; a política da empresa é que as contas permaneçam no mínimo por 1 ano). Por exemplo, quando o usuário x (que possui uma conta expirada em Alpha e uma conta válida em Beta), o log de erros do Apache relata o seguinte:

[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/

Tentar se autenticar como usuário inexistente (nobodycool) resulta no comportamento correto da consulta dos dois servidores 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/

Como faço para configurar o Apache para consultar corretamente o Beta se ele encontrar uma conta expirada no Alpha?

Brian Bassett
fonte

Respostas:

4

A AuthzLDAPAuthoritative offdiretiva permitirá que a autenticação passe para o próximo módulo apenas se o usuário não puder corresponder a um DN na consulta. Atualmente, mesmo que o usuário tenha expirado, parece que sua conta ainda será retornada como resultado quando a consulta LDAP for executada.

Não sei o suficiente sobre o esquema LDAP do ActiveDirectory para fornecer uma resposta definitiva aqui, mas se você puder adicionar à sua AuthLDAPURLdiretiva um filtro que filtre contas expiradas, o nome de usuário não corresponderá a nenhum DN na consulta. Isso deve resultar na autenticação passando para o próximo módulo.

Kamil Kisiel
fonte
1
Adicionando um filtro funcionou. A TI teve a gentileza de inserir uma sequência consistente no campo de descrição dos usuários que foram movidos de Alpha para Beta (é por isso que as contas expiraram). O seguinte URL funciona corretamente: AuthLDAPURL ldap: //dc01.alpha: 3268 /? SAMAccountName? Sub? (& (ObjectClass = user) (! (Description = * movido para Beta *)))
Brian Bassett