autenticación Apache – LDAP


Esta es la receta para tener funcionando un servidor web Apache, que valide usuarios de Ldap para acceder a determinados recursos. Necesitamos un servidor Debian, y un LDAP que será un Active Directory de MS.

Apache - LDAP

  1. apt-geteamos apache y el módulo auth_ldap
  2. creamos un grupo en el ldap (le añadimos un par de usuarios) y añadimos un usuario de servicio.
  3. editamos la configuración de apache

<VirtualHost *:80>
ServerName server.domain.com
RedirectPermanent / https://server.domain.com
ErrorLog /var/log/apache2/server/error.log
CustomLog /var/log/apache2/server/access.log combined
LogLevel warn
ServerSignature Off
</VirtualHost>

<VirtualHost *:443>
ServerName server.domain.com
DocumentRoot /var/www/server
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.pem

<Directory />
AuthType Basic
AuthName "Server"
require group CN=GRP-server,OU=..,OU=...,DC=domain,DC=com
AuthLDAPGroupAttribute memberOf
AuthLDAPGroupAttribute member
AuthLDAPBindDN CN=SRVuser,DC=domain,DC=com
AuthLDAPBindPassword testpasswd
AuthLDAPURL ldap://ldap.domain.com:389/OU=Users,DC=domain,DC=com?sAMAccountName?sub?(objectClass=user)
AuthLDAPGroupAttributeIsDN On
Options Indexes FollowSymLinks MultiViews
Options FollowSymLinks
AllowOverride None
</Directory>
......

En el primer bloque, la directiva RedirectPermanent es para asegurar que los usuarios que acceden por HTTP, pasen por la página HTTPS. Las directivas del segundo bloque SSL* son la configuración del certificado SSL. Y finalmente “require group” es para permitir el acceso a los usuarios que pertenezcan a ese grupo. El atributo que define la relación de pertenencia entre un usuario y un grupo de member o memberOf.

Apache se conecta al LDAP usando el usuario y password defiinidos en las directivas AuthLDAPBind*, y la URL del servidor LDAP contra el que hay que validar. Esta URL es para Active Directory, pero la equivalente para OpenLDAP es muy parecida:

AD:
ldap://ldap.domain.com:389/OU=Users,DC=domain,DC=com?sAMAccountName?sub?(objectClass=user)

OpenLDAP:
ldap://ldap.domain.com:389/OU=Users,DC=domain,DC=com?uid?sub?(objectClass=inetOrgPerson)

En el caso de OpenLDAP la directiva puede cambiar en función de qué esquemas tengamos cargados. Por defecto el atributo que corresponde al login es “uid” y la clase de los objetos es inetOrgPerson o posixAccount. En cambio en Active Directory el login siempre es el atributo sAMAccountName, y la clase user engloba a usuario y workstations. Quizá en el caso de un AD convenga pulir un poco el filtro para excluir los objetos que no son usuarios.

El formato en general es:
ldap://host:puerto/ + DN donde buscar los usuarios + atributo que corresponde al login + scope de la búsqueda (bajar subniveles o sólo los objetos a este nivel?) + filtro de búsqueda.

Despues de reiniciar el servicio, sólo los usuarios que pertenecen a ese grupo podrán entrar al virtual host, y de paso aseguramos que cuando el usuario pasa el user/password a apache, al menos lo hace por https.

Un par de temas que me he encontrado son:

  • Si la búsqueda se hace desde dc=domain,dc=com, se provoca un error de unreferenced results como si aun quedaran resultados por procesar (?). Esto sólo me lo he encontrado cuando se usa AD como servidor LDAP, y nunca con OpenLDAP. Como workarround se puede hacer la búsqueda desde alguna OU que esté en dc=domain,dc=com y que contenga todos los usuarios
    El error en este caso tiene una pinta más o menos así:
    timestamp http-80-Processor23 ERROR [user.provider.ldap.LDAPCredentialsProvider] Connected but encountered error checking if LDAP had more results. For Unprocessed Continuation References, try adding
    follow to the LDAPCredentialsProvider config.
    javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name 'DC=domain,DC=com'
  • En el caso de que el usuario pertenece a grp1, el grupo de autorización es grp2 y el grupo grp1 pertenece a grp2 (el usuario no pertenece directamente a grp2). No autoriza al usuario. Digamos que solo tiene en cuenta los miembros del grupo, pero no resuelve sus miembros hasta tener sólo usuarios. Creo que esto tiene que ver con un flag referrals, pero es algo que no tengo solucionado aún.

4 Responses to “autenticación Apache – LDAP”

  1. Gracias por la informacion

    Me ha servido de gran ayuda

    Saludos

  2. quimicefa Says:

    Me alegro!

  3. Hola,
    gracias por la info.

    Estoy intentando configurar el ldap en el archivo httpd.conf.
    Lo que no tengo claro es la línea : AuthLDAPURL.
    He puesto set en una ventana cmd para ver el domain pero no sé muy bien cuál es.

    Mi finalidad es poder ‘capturar’ el usuario de active directory que esta visitando la web de la intranet que corre en apache y que apache lo guarde en su fichero de log para generar estadísticas después.

    • Hola,

      Lo primero que deberías tener en cuenta es que no es lo mismo el dominio en el que está tu servidor HTTP y el servidor LDAP. Está relacionado, pero no es exactamente lo mismo. Podría estar en un dominio, pero que se diera el caso de que te interesa consultar datos de otro dominio.

      Dependiendo de la versión de Apache (y de mod_authX_ldap), la directiva que menciona AuthLDAPURL puede ser AuthzLDAPURL, creo que en apache 2.2 es uno, y en apache 2.0 es otro, pero no recuerdo bien.

      Te recomiendo que primero te bajes algun programilla para navegar por el directorio LDAP para que veas la estructura que tiene, y qué atributo será el que te interesa usar como username. Puedes probar SoftTerra LDAP Browser, no es la hostia, pero no está mal.

      Lo de los logs, si no recuerdo mal en cuanto le pasas el ussername al apache, éste lo incluye en los logs. Mientras la conexión sea anónima no lo guarda, pero creo que no has de tocar nada para que logue el username.

      Saludos

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: