Acceso a carpetas privadas con autentificación por LDAP

Otra posibilidad muy interesante es que los profesores e incluso el sitio web de la Intranet de nuestro centro, puedan disponer de carpetas privadas accesibles mediante el navegador pero no por cualquier usuario; por ejemplo los profesores podrían disponer de una carpeta donde almacenar información confidencial accesible desde la web -notas, por ejemplo-. Así mismo puede ocurrir que queremos tener en el servidor web de nuestra intranet páginas a las que sólo puedan tener acceso de lectura los profesores del centro. Vamos a ver cómo conseguir todo esto.

Lo primero que hemos de tener en cuenta es que para que podamos autenticar a los usuarios en apache mediante LDAP, hemos de instalar un módulo especial en nuestro servidor web para que apache pueda validar el acceso a las carpetas deseadas a través de la base de usuarios del servidor LDAP. Dicho módulo se instala con el paquete libapache-auth-ldap:

// Instalación de libapache-auth-ldap
# apt-get install libapache-auth-ldap


Si nuestra versión de apache es la versión 1.3, las consultas al servidor LDAP se harán utilizando LDAP v2, por lo tanto, debemos añadir la siguiente línea en nuestro archivo de configuración de ldap:

Añadir en /etc/ldap/slapd.conf
allow bind_v2


El siguiente paso es crear una carpeta de nombre "privada" colgando de "/var/www", lugar donde ubicaremos las páginas privadas de nuestro servidor web. Dicha carpeta tendrá como grupo propietario el grupo profesores.

Tras ello debemos editar de nuevo el archivo "/etc/apache/modules.conf" (el cual es referenciado por el archivo httpd.conf mediante la orden include) e incluir las siguientes entradas en los correspondientes apartados "LoadModule" y "AddModule":

Antes de modificar archivos de configuración conviene hacer copia de seguridad de los mismos. En caso de que se produzcan errores en el reinicio de apache, se puede recurrir a los archivos de log dentro de la carpeta /var/log/apache para analizar la causa.

Añadir en /etc/apache/modules.conf
LoadModule auth_ldap_module /usr/lib/apache/1.3/auth_ldap.so AddModule auth_ldap.c

Posteriormente introducimos en /etc/apache/httpd.conf textualmente las siguientes líneas, mediante las cuales logramos definir la carpeta "privada" como aquella a partir de la cual el contenido allí contenido será privado y sólo accesible por los profesores de nuestro centro y por el administrador.

// Carpeta privada con acceso a profesores. Añadir en /etc/apache/httpd.conf
Alias privada "/var/www/webprivada/" <Directory "/var/www/webprivada"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all AuthType basic AuthName "Identificacion LDAP ieslapaloma.com" AuthLDAPUrl ldap://ip-servidor-ldap:389/dc=ieslapaloma,dc=com?uid AuthLDAPBindDN "cn=admin,dc=ieslapaloma,dc=com" AuthLDAPBindPassword xxxxxx AuthLDAPGroupAttributeIsDN off AuthLDAPGroupAttribute memberUid require group cn=profesores,ou=groups,dc=ieslapaloma,dc=com </Directory>

En el parámetro AuthLDAPUrl sustituiremos la cadena 'ip-servidor-ldap' por la dirección IP o el nombre del servidor LDAP y en el parámetro "AuthLDAPBindPassword" la cadena "xxxxxx" por la contraseña que hayamos asignado al usuario "administrador (admin) " del servidor LDAP.

En el parámetro AuthLDAPUrl vemos que al final termina con '?uid'. Significa que lo que debe de introducir el usuario es su uid (login del usuario). Podemos filtrar la entrada del usuario y poner condiciones si terminamos la url con '?uid??(atributo=valor)'. De ésta forma solamente serían válidos aquellos usuarios que tengan un atributo con un valor determinado, ejemplo '?uid??(gidNumber=1001)' solo admitiría usuarios cuyo grupo primario sea 1001.

El parámetro AuthLDAPGroupAttributeIsDN debe estar a off para que no utilice el cn (nombre común) del usuario sino el uid a la hora de comprobar la pertenencia a un grupo.

En el parámetro AuthLDAPGroupAttribute debemos indicar el campo que se analizará para comprobar la pertenencia a un grupo.

En el parámetro 'require', exigimos que pertenezca a un grupo. Otras opciones son 'require user' seguido de una lista de usuarios permitidos, ejemplo 'require user miguel joaquin jessica'. Para permitir a cualquier usuario que exista en el servidor LDAP, podemos usar 'requiere valid-user'.

Más información en: http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html

Guardamos los cambios realizados y para completar el proceso reiniciaremos el servidor "apache"

// Reiniciar apache
# /etc/init.d/apache restart

Si ubicamos un fichero de nombre "prueba.html" en dicha carpeta ("/var/www/privada"), podremos acceder a ella mediante la URL "http://www.ieslapaloma.com/privada/prueba.html", mostrándose la siguiente pantalla en la cual se nos pedirá autenticación, y en la cual serán válidas las credenciales de algún profesor.

Una vez validado adecuadamente algún usuario con permisos de acceso a los contenidos privados se mostrará la página solicitada.

Además podemos crear una carpeta privada para cada profesor, de modo que el contenido allí existente sólo fuera accesible por él mismo previa autenticación; para ello crearemos una carpeta de nombre 'privada' colgando de la carpeta personal de cada profesor (por ejemplo en el caso del profesor Javier, en '/home/javier/public-html/'). Además de la creación de dicha carpeta 'privada' en la ruta correspondiente, hemos de editar el fichero 'httpd.conf' e incluir la siguiente entrada en el apartado correspondiente a los directorios:

// Carpeta privada de javier. Añadir en /etc/apache/httpd.conf
Alias javier-p "/home/javier/public_html/privada" <Directory "/home/javier/public_html/privada"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all AuthType basic AuthName "Identificacion LDAP ieslapaloma.com" AuthLDAPUrl ldap://ip-servidor-ldap:389/dc=ieslapaloma,dc=com?uid AuthLDAPBindDN "cn=admin,dc=ieslapaloma,dc=com" AuthLDAPBindPassword xxxxxx require user javier </Directory>

Igual que antes, sustituiremos las cadenas 'ip-servidor-ldap' y "xxxxxx" por sus valores correctos. Además hemos de introducir esta entrada para cada uno de los profesores del centro, sustituyendo en las rutas de las dos primeras líneas el valor "javier" por el del profesor que deseamos que tenga el acceso seguro, así como dicho valor también en la penúltima línea.

Tras almacenar los cambios en el fichero de configuración y reiniciar el servicio apache, para acceder a un fichero de nombre "prueba.html" ubicado en la carpeta privada del profesor Javier teclearemos la URL: 'http://www.ieslapaloma.com/~javier/privada/prueba.html'

Es posible hacer, y de hecho es recomendable, que las carpetas privadas sean además seguras, es decir, utilicen un canal SSL, con lo cual el acceso a las carpetas seguras sería 'https' en el puerto '443', el resto de las rutas de las URL de acceso se mantendrían estables. Para lograrlo hemos de introducir en cada una de las entradas '<Directory>' la instrucción 'SSLRequireSSL'.