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 habilitar 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 habilita ejecutando el siguiente comando:

// Habilitar módulo de autentificación de apache con ldap
sudo a2enmod authnz_ldap

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.

Posteriormente introducimos en /etc/apache2/sites-available/default 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 usuarios especificados
// Carpeta privada. Añadir en /etc/apache2/sites-available/default
<Directory "/var/www/webprivada/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
AuthType basic
AuthBasicProvider ldap
AuthName "Identificacion LDAP ieslapaloma.com"
AuthLDAPUrl ldap://127.0.0.1:389/dc=ieslapaloma,dc=com?uid
AuthLDAPBindDN "cn=admin,dc=ieslapaloma,dc=com"
AuthLDAPBindPassword ldapadmin
AuthLDAPGroupAttributeIsDN off
AuthLDAPGroupAttribute memberUid
require user miguel javier carlos
</Directory>

En el parámetro AuthLDAPUrl sustituiremos 127.0.0.1 por la dirección IP o el nombre del servidor LDAP si fuera otro servidor distinto al servidor apache y en el parámetro "AuthLDAPBindPassword" la cadena "ldapadmin" 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 esta 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.

El parámetro 'require user' seguido de una lista de usuarios permitidos, ejemplo 'require user miguel joaquin jessica' solo permite el acceso a esos usuarios. Para permitir a cualquier usuario que exista en el servidor LDAP, podemos usar 'requiere valid-user'.

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

// Reiniciar apache
sudo /etc/init.d/apache2 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 los usuarios permitidos.

Nota: editar /etc/hosts y añadir la línea 127.0.0.1 www.ieslapaloma.com para que resuelva correctamente el nombre www.ieslapaloma.com (o el que hayamos utilizado)


Petición de autenticación

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

Se muestra 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 archivo /etc/apache2/sites-available/default e incluir la siguiente entrada en el apartado correspondiente a los directorios:

// Carpeta privada de javier. Añadir en /etc/apache2/sites-available/default
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
AuthBasicProvider ldap
AuthName "Identificacion LDAP ieslapaloma.com"
AuthLDAPUrl ldap://127.0.0.1:389/dc=ieslapaloma,dc=com?uid
AuthLDAPBindDN "cn=admin,dc=ieslapaloma,dc=com"
AuthLDAPBindPassword ldapadmin
require user javier
</Directory>

Igual que antes, sustituiremos las cadenas '127.0.0.1' y "ldapadmin" 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-p/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'.

Pregunta Verdadero-Falso



Si el servidor LDAP está 'caído' ¿podré acceder a la carpeta privada?

Verdadero Falso