Autenticación en Apache mediante mod_authnz_ldap (soporte OpenLDAP)

Hola,

Aunque hay maneras más simples (.htaccess, por ejemplo), proteger los accesos a un servidor Web puede resultar bastante útil a la hora de clasificar información. En este ejemplo, vamos a ver cómo forzar a que Apache solicite credenciales válidas de usuario almacenadas en un servidor LDAP para articular la autenticación.

Este artículo asume que dispones de:

  1. Un servidor LDAP en funcionamiento. En mi caso, tengo una instalación OpenLDAP.

    nas# ps -awux | grep slapd
    ldap 808 0.0 1.5 35100 6536 ?? Is Sat02PM 0:00.16 /usr/local/libexec/slapd -u ldap -g ldap

  2. Una base de datos poblada, con al menos una defición de root. Os recomiendo encarecidamente que empleéis un backend Berkeley DB, aunque se pueden emplear otras opciones (por ejemplo, MySQL, eso sí, extremando las precauciones que pueden derivarse de la existencia de versiones distintas de openldap-client, léase Samba)

    nas# cat /usr/local/etc/openldap/slapd.conf | grep root
    rootdn «cn=Manager,dc=localhost»
    rootpw secreto

  3. Una definición de usuario que usaremos para autenticar en Apache y otro que nos servirá para binding (consultas a LDAP). En nuestro caso, ejecutamos ldapsearch -x -b ‘dc=localhost’ ‘(objectclass=*)’ y verificamos que disponemos de ambos:
  4. # shernando, usuarios, localhost
    dn: uid=shernando,ou=usuarios,dc=localhost
    uid: shernando
    cn: Sergio Hernando
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    loginShell: /bin/sh
    uidNumber: 1001
    gidNumber: 1001
    homeDirectory: /home/shernando
    gecos: Sergio Hernando
    userPassword:: secreto

    # shernando2, usuarios, localhost
    dn: uid=shernando2,ou=usuarios,dc=localhost
    uid: shernando2
    cn: Sergio Hernando
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    loginShell: /bin/sh
    uidNumber: 1002
    gidNumber: 1002
    homeDirectory: /home/shernando2
    gecos: Sergio Hernando (Binding)
    userPassword:: secretobinding

    Recordad que para modificar la clave de los usuarios (caso de no recordarla), emplearemos el comando ldappasswd. Así por ejemplo, en esta definición anterior, para cambiar la clave de shernando2 se debe ejecutar:

    ldappasswd -xv -D «cn=Manager,dc=localhost» -W -S «uid=shernando2,ou=usuarios,dc=localhost»

    Lo que nos requerirá, además de la clave nueva del usuario, autenticarnos como root de OpenLDAP.

  5. Conocimiento suficiente para adaptar lo que aquí se escribe (FreeBSD 7.2-RELEASE) a tu distribución UNIX favorita. No todos los sabores son iguales, y puede haber una gran variabilidad en cuanto a la ejecución técnica, si bien, la teoría es la misma.

1. Instalación del Servidor Apache

1.1 Rama 1.3.x

En esta rama, el soporte para autenticar mediante OpenLDAP no es nativo. Tendréis que compilaros el módulo y hacer que el servidor Web lo cargue en httpd.conf. Todo el proceso (advierto, puede ser engorroso) está descrito en http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html

1.2 Rama 2.x

Aprovecharemos la existencia de mod_authnz_ldap (disponible a partir de la versión 2.1) para compilar el servidor con soporte LDAP y autenticación mediante mod_authnz_ldap.

Para ello basta con ejecutar un make y su posterior make install clean desde el árbol de ports de FreeBSD. Es importante asegurarnos que el fichero /usr/ports/www/apache22/Makefile.options contiene directrices para compilar el servidor con soporte LDAP y para poder autenticar a los usuarios con mod_authnz_ldap.

nas# cat /usr/ports/www/apache22/Makefile.options | grep LDAP
LDAP «Enable mod_ldap» ON \
AUTHNZ_LDAP «Enable mod_authnz_ldap» ON \

Os aconsejo también que cuando hagáis el make no seleccionéis funcionalidades y módulos que desconozcáis, ya que al compilar, las dependencias pueden hacer que el proceso se detenga sin éxito, y a mayor número de funcionalidades, menor es la probabilidad de encontrar el error.

2. Verificaciones de la instalación

Una buena señal de que el soporte LDAP está preparado para ser usado es revisar la librería de módulos y determinar si la compilación los ha dejado allí disponibles:

nas# ls -la /usr/local/libexec/apache22 | grep ldap
-rwxr-xr-x 1 root wheel 28587 Jun 7 12:39 mod_authnz_ldap.so
-rwxr-xr-x 1 root wheel 49061 Jun 7 12:39 mod_ldap.so

Arrancamos el servidor, y comprobamos su disponibilidad.

nas# /usr/local/sbin/apachectl start

nas# ps -awux | grep httpd
root 14108 0.0 1.1 10112 5036 ?? Ss 12:19AM 0:00.26 /usr/local/sbin/httpd -k start
www 14109 0.0 1.1 10112 5120 ?? I 12:19AM 0:00.01 /usr/local/sbin/httpd -k start
www 14110 0.0 1.1 10112 5052 ?? I 12:19AM 0:00.00 /usr/local/sbin/httpd -k start
www 14111 0.0 1.1 10112 5052 ?? I 12:19AM 0:00.00 /usr/local/sbin/httpd -k start
www 14112 0.0 1.1 10112 5052 ?? I 12:19AM 0:00.00 /usr/local/sbin/httpd -k start
www 14113 0.0 1.1 10112 5052 ?? I 12:19AM 0:00.00 /usr/local/sbin/httpd -k start
www 14114 0.0 1.1 10112 5060 ?? I 12:19AM 0:00.00 /usr/local/sbin/httpd -k start

3. Modificaciones en httpd.conf

Editamos el fichero de configuración de Apache (/usr/local/etc/apache22/httpd.conf) e introducimos los siguientes cambios

3.1 Carga de módulos

LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so
LoadModule ldap_module libexec/apache22/mod_ldap.so

3.2 Directivas de restricción


        AuthType Basic
        AuthBasicProvider ldap
        AuthName "Autenticacion OpenLDAP NAS"
        AuthzLDAPAuthoritative off
        AuthLDAPURL "ldap://localhost/ou=usuarios,dc=localhost?uid"
        AuthLDAPBindDN uid=shernando2,ou=usuarios,dc=localhost
        AuthLDAPBindPassword secretobinding
        Require valid-user


Nótese que secretobinding es la clave del usuario que hemos seleccionado para efectuar las consultas.

3.3 Reiniciamos el servidor

nas# /usr/local/sbin/apachectl restart

Y voilá …

Ya tenemos una autenticación para el árbol completo de www (/usr/local/www/apache22/data) basada en OpenLDAP.

autenticacion openldap

Un saludo, y buena semana para todos :)

Un pensamiento en “Autenticación en Apache mediante mod_authnz_ldap (soporte OpenLDAP)

  1. Que tal amigo de casualidad sabes hacer lo mismo para active directory de windows server
    Es decir que se auntentifique usuarios de AD de windwows

Comentarios cerrados.