3. Especificaci´ on y Dise˜ no
4.2. Protocolos situados en la capa de aplicaci´on
4.2.1. Servidor LDAP de cuentas de usuario
Un punto muy importante en cualquier sistema que se precie, es la gesti´on de los usuarios en red. Teniendo en cuenta que se trata de un sistema que va a soportar un n´umero muy elevado de usuarios en l´ınea, son muchos los factores a tener en cuenta.
La implementaci´on del servicio de cuentas de usuario se llevar´a a cabo mediante la gesti´on de un directorio de tipo LDAP, tal y como estudiamos en el cap´ıtulo Introducci´on, donde realizamos una comparativa de las diferentes tecnolog´ıas para llevar a cabo una implementaci´on de cuentas de usuario en red.
Instalaci´on del servicio LDAP
Una vez comentadas las motivaciones principales que nos convencieron a proceder al cambio de los protocolos NIS a LDAP, vamos a proceder a meternos en harina detallando cuales son los pasos necesarios para poder implementar un entorno de autenticaci´on segura basado en el protocolo LDAP. En primer lugar, necesitamos por supuesto uno o m´as servidores LDAP. Cabe rese˜nar en cuanto a la nomenclatura usada, que el t´ermino LDAP hace referencia al protocolo, descrito por la RFC13
correspondiente14
; mientras que existen aplicaciones con diferentes licencias que implementan el citado protocolo. Una de las m´as usadas hoy en d´ıa en la mayor´ıa de servidores Unix y Linux (adem´as de otros Sistemas Operativos de la familia Unix) es OpenLDAP, un software que proporciona un servidor basado en el protocolo LDAP. En nuestro caso, ser´a el que usemos.
Como comentamos en el cap´ıtulo de dise˜no, en los servidores del entorno se usar´a la distribuci´on Debian GNU/Linux, en versi´on estable (actualmente, la 4.0 con c´odigo Etch). La instalaci´on de la aplicaci´on OpenLDAP en una distribuci´on Debian es realmente sencilla, y se basa en una llamada muy simple a su herramienta de instalaci´on de Software, como queda reflejado en el listado 4.22.
Listado 4.22: Instalaci´on del paquete slapd a trav´es de apt-get
$ apt - get install slapd
En Debian, y en la mayor´ıa de distribuciones Linux, la aplicaci´on OpenLDAP se provee a trav´es del paquete slapd. La instalaci´on del paquete resolver´a aquellas dependencias que se consideren oportunas para que el servidor pueda funcionar adecuadamente.
En el proceso de instalaci´on del paquete, es necesario responder a algunas preguntas relativas a la configuraci´on del paquete en el entorno en el que va a ser instalado. Algunas de ellas son cu´al
13
RFC son las siglas de Request for comments, documentos que describen detalladamente el comportamiento de un protocolo.
14
CAP´ITULO 4. IMPLANTACI ´ON
ser´a la ra´ız del directorio LDAP, la contrase˜na del administrador, la elecci´on del sistema gestor de base de datos que almacenar´a los datos del directorio y poco m´as. En nuestro caso, hemos decidido que:
La ra´ız del ´arbol LDAP se identifique mediante
la cadena siguiente: dc=zipi,dc=escet,dc=urjc,dc=es. Este nombre se debe a la notaci´on de los nombres de las m´aquinas usado en la Universidad.
El tipo de base de datos que almacenar´an los datos del directorio ser´a DBD.
La contrase˜na de administrador de LDAP es un dato que queda privado de cara al administrador del sistema.
Una vez que hemos decidido estos par´ametros, el servidor queda instalado, y se inicia en el puerto est´andar de LDAP: el puerto 389. Este puerto recibir´a las peticiones de los clientes sobre consultas al directorio LDAP: en texto claro. Cualquier usuario que tenga acceso a la red podr´a escuchar estas peticiones y averiguar datos sensibles (muy sensibles, como la contrase˜na de su cuenta, por ejemplo) de los usuarios. Es por tanto, que nuestra primera tarea avanzada ser´a securizar el servidor de cara a crear conexiones seguras entre los clientes y el servidor LDAP. El protocolo LDAP: conceptos b´asicos
Hasta el momento hemos detallado como se lleva a cabo la instalaci´on b´asica de un servidor LDAP. Sin embargo, no sabemos hasta el momento como funciona realmente este protocolo. Vamos a realizar una descripci´on t´ecnica muy breve de c´omo se organizan los datos en un servidor LDAP y c´omo funciona ´este realmente (a grandes rasgos). Sin duda, estas explicaciones son fundamentales de cara a mejorar la funcionalidad del servidor, poder agrupar los datos en organizaciones o sub´arboles, y dotar al servidor de aspectos avanzados como son la replicaci´on y el reparto de carga.
Como hemos dicho, LDAP proporciona servicios de directorio: una base de datos centralizada de informaci´on esencial sobre personas, usuarios, grupos de usuarios, etc´etera. Puesto que cada organizaci´on se estructura de una forma y su definici´on de informaci´on esencial puede ser muy distinta, un servicio de directorio debe ser muy flexible y personalizable.
El eje fundamental de un servicio de directorio es proporcionar un mapa de distribuci´on de una compa˜n´ıa, en este caso, de una organizaci´on de los usuarios de una Universidad. Una de las caracter´ısticas m´as visibles de una estructura de base de datos LDAP es la convenci´on en los nombres que se usa: es fundamental llevar a cabo una convenci´on de nombres que identifique la estructura organizativa de la empresa u organizaci´on que se quiere representar antes de configurar el servidor. Este sistema, puede resultar muy parecido y similar al Sistema de Resoluci´on de nombres DNS, en el que cada compa˜n´ıa debe encajar en un ´unico nombre de dominio de primer nivel, pudiendo crear por debajo multitud de nombres dependiendo de la estructura de servicios de la empresa. En este sentido la organizaci´on de los nombres en una base de datos LDAP es muy similar.
En una base de datos LDAP, la organizaci´on se estructura en forma de ´arbol, en el que existe una ra´ız o elemento superior que se crea en el momento de la instalaci´on (este par´ametro se corresponde cuando la configuraci´on del servidor nos preguntaba acerca de la ra´ız del ´arbol). Por debajo, se encuentran los elementos de informaci´on llamados nodos, los cuales deben pertenecer a un tipo concreto. Este tipo, es llamado el elemento estructural del nodo, que en principio, no tiene porqu´e ser uno solamente, sino que pueden ser varios. Existen varios tipos predefinidos que pueden ser usados para representar elementos de informaci´on com´unmente usados hoy en d´ıa: para almacenar la informaci´on de una persona, podemos usar el tipo person, para almacenar la
4.2. PROTOCOLOS SITUADOS EN LA CAPA DE APLICACI ´ON
informaci´on de una cuenta de usuario en un sistema Unix, podemos usar el tipo posixAccount, mientras que para poder representar la informaci´on de un grupo en un sistema Unix, se facilita el tipo posixGroup. Una vez que el tipo de un nodo queda establecido, podemos asignar valores a los atributos que nos facilita ese tipo estructural. Parece razonable que si un elemento posee el tipo posixAccount, se pueda saber el nombre de usuario, su UID, el grupo al que pertenece, su gecos, y seguramente algunos campos m´as. Sin embargo, si un objeto posee la estructura posixGroup, seguramente nos baste con saber el nombre del grupo y su identificador num´erico.
Podemos decir que cada objeto que exista en el directorio LDAP va a constar de una serie de tipos estructurales a los que pertenece, adem´as de un nombre o identificador que va a posicionar al elemento en un punto concreto del directorio. Este nombre se denomina nombre distinguido o distinguished name. Dependiendo del punto en el que se encuentre el objeto dentro del ´arbol, este tendr´a un dn diferente a otro. Normalmente, el dn se construye concatenando la sucesi´on de nodos por los que es necesario pasar para poder llegar al objeto, de forma muy similar al servicio de nombres DNS.
Existen tipos predefinidos que se facilitan para poder agrupar elementos, y poder as´ı crear organizaciones dentro del ´arbol. Normalmente, estos tipos reciben el nombre de unidad organizativa o organizational unit. A trav´es de estos elementos estructurales, podremos agrupar elementos finales (como cuentas de usuario, por ejemplo) en diferentes sub´arboles, como veremos a continuaci´on.
La jerarqu´ıa de nuestro directorio LDAP
Una vez llegados a este punto, es necesario decidir c´omo estar´a estructurado el directorio LDAP donde se encontrar´an las cuentas de los usuarios de nuestro sistema. Para empezar, debemos decidir cuales son las diferencias entre los tipos de usuario que vamos a almacenar en nuestro directorio, que se detallan a continuaci´on:
En primer lugar, necesitamos almacenar cuentas de usuario de dos tipos, fundamentalmente: estudiantes que cursan asignaturas (normalmente, pertenecientes a titulaciones de grado y postgrado) y profesores que imparten estas asignaturas.
Los estudiantes pueden pertenecer al Campus de M´ostoles (Escuelas de Ciencias Tecnol´ogicas e Inform´atica) o al Campus de Fuenlabrada (Escuelas de Telecomunicaci´on y Facultad de Comunicaci´on Audiovisual).
Sin embargo, los profesores que imparten las asignaturas, suelen pertenecer al Campus de M´ostoles (al menos, su localizaci´on geogr´afica se encuentra en M´ostoles) y pueden impartir asignaturas en un campus, o en ambos.
Adem´as, es preciso saber de cada alumno, el a˜no en el que obtuvo la cuenta, sin importar en principio la asignatura para la que la usa (ya que en cada carrera, suele usarse en diferentes asignaturas).
Con estas premisas, se ve claramente que los profesores, deben poder usar su cuenta en ambos campus (no se hace distinci´on entre los profesores de Fuenlabrada y los profesores de M´ostoles) y que las cuentas de los alumnos de cada campus deben estar organizadas o separadas por el campus al que pertenecen. Adem´as, es muy probable que un profesor pueda acceder a recursos o a m´aquinas a las que no pueden acceder los alumnos estudiantes. Es por ello que una vez m´as, deberemos separar muy bien esta organizaci´on en el esquema del ´arbol LDAP. Podemos ver una primera versi´on de esta jerarqu´ıa en la imagen 4.2. En ella vemos como la ra´ız del ´arbol LDAP
CAP´ITULO 4. IMPLANTACI ´ON
contiene dos nodos principales, en los que se crean dos unidades organizativas: los alumnos por un lado, y los profesores por otro.
dc=admin,dc=zipi,dc=es cet,dc=urjc,dc=es ou=alumnos,dc=zipi, dc=escet,dc=urjc,dc= es ou=profesores,dc=zipi, dc=escet,dc=urjc,dc=e s
Figura 4.2: La raiz del ´arbol LDAP contiene dos unidades organizativas principales: alumnos y profesores.
Si nos centramos en la unidad organizativa de alumnos, debemos tener en cuenta que ´estos pueden pertenecer a dos campus: al campus de M´ostoles, o al campus de Fuenlabrada. Es por ello, que decidimos de la misma forma representar esta divisi´on en el ´arbol LDAP en forma de dos unidades organizativas, como se puede ver en la imagen 4.3.
Figura 4.3: La unidad organizativa de alumnos se subdivide a su vez en otras dos: alumnos de M´ostoles y alumnos de Fuenlabrada.
Por el contrario, en el grupo de profesores, no es necesario realizar ninguna distinci´on adicional: podemos decir que todos los profesores se deben encontrar en el mismo nivel del ´arbol LDAP. Es por ello, que directamente agrupamos sus usuarios y grupos (objetos de las clases PosixAccount y PosixGroup) en el nivel de la unidad organizativa profesores que ve´ıamos en la imagen 4.2.
4.2. PROTOCOLOS SITUADOS EN LA CAPA DE APLICACI ´ON
Esta representaci´on se puede observar en la imagen 4.4.
ou=profesores, dc=zipi,dc=escet, dc=urjc,dc=es ou=usuarios (...) ou=grupos (...)
Figura 4.4: La unidad organizativa de profesores contiene dos unidades organizativas que almacenan los objetos posixAccount y posixGroup.
Configuraci´on de los clientes
Una vez que se ha configurado los servidores, es necesario pasar a configurar los clientes para que ´estos puedan autenticar a sus usarios mediante un directorio LDAP. Usando Ubuntu, solamente es necesario instalar un par de paquetes para disponer de las herramientas adecuadas. Estos paquetes son libnss-ldap y libpam-ldap, los cuales proveen de las bibliotecas oportunas para poder autenticar a usuarios a trav´es de un directorio LDAP. La instalaci´on de estos paquetes en Ubuntu es inmediata y bastante simple, realizando una llamada al instalador de paquetes apt, como queda reflejado en el listado 4.23.
Listado 4.23: Instalaci´on de las bibliotecas necesarias para la autenticaci´on PAM v´ıa LDAP
$ apt - get install -- assume - yes libnss - ldap libpam - ldap
Es posible que los paquetes instalados anteriormente requieran configuraci´on adicional, como por ejemplo, la ra´ız del ´arbol LDAP a partir del cual se buscar´an los usuarios a autenticar. En nuestro caso, vamos a responder a todas las preguntas por omisi´on y a configurar estos datos de forma manual. En principio, para poder autenticar a los usuarios de un sistema Ubuntu mediante LDAP, es necesario configurar al menos los siguientes ficheros:
El fichero /etc/nsswitch.conf en el que se indicar´a que los datos de los usuarios y los grupos proceden de una base de datos LDAP.
El fichero /etc/ldap/ldap.conf en el que se deben introducir los datos de conexi´on a los servidores LDAP (URIs de los servidores) y alg´un otro par´ametro, como por ejemplo si es necesario establecer una conexi´on segura al servidor.
Los ficheros /etc/pam ldap.conf y /etc/libnss-ldap.conf, en los que es necesario configurar entre otras cosas, los datos de conexi´on a los servidores LDAP, la ra´ız del ´arbol LDAP a partir de la cual se deben buscar a los usuarios, y muchos otros par´ametros que para nosotros ser´an transparentes.
CAP´ITULO 4. IMPLANTACI ´ON
Los ficheros de los m´odulos de autenticaci´on PAM, situados bajo el directorio /etc/pam.d/. En este directorio se situan los ficheros de configuraci´on de los m´odulos de autenticaci´on de usuario, en los que ser´a necesario indicar que la autenticaci´on se llevar´a a cabo mediante LDAP.
Vamos a ver de forma m´as detallada los ficheros de configuraci´on m´as importantes. Fichero /etc/nsswitch.conf
En este fichero se indica de donde provienen las bases de datos de los servicios m´as importantes del sistema, como los usuarios y los grupos. En nuestro caso, ser´a necesario anteponer la palabra LDAP para indicar que los datos de los usuarios y los grupos provienen de una base de datos LDAP, tal y como muestra el fichero 4.24.
Listado 4.24: Contenido del fichero nsswitch.conf para autenticaci´on v´ıa LDAP
passwd : files ldap
group : files ldap
shadow : files ldap
Fichero /etc/pam ldap.conf
Este fichero contiene la configuraci´on de PAM que accede a servicios de directorio LDAP. En este fichero, los datos de configuraci´on m´as importantes son las cadenas de conexi´on al servidor LDAP y la raiz del ´arbol a partir de la cual se empiezan a buscar usuarios. Podemos ver esta configuraci´on en el siguiente fragmento del fichero de configuraci´on mostrado en el listado del fichero 4.25.
Listado 4.25: Contenido del fichero pam ldap.conf para autenticaci´on v´ıa LDAP
uri ldaps :// peloto . escet . urjc . es base dc = zipi , dc = escet , dc = urjc , dc = es l d a p _ v e r s i o n 3
b i n d _ p o l i c y soft
fichero /etc/libnss-ldap.conf
Este fichero es bastante parecido al anterior, y contiene la informaci´on para poder acceder a un servidor LDAP en el caso en el que se usen bases de datos LDAP en la base de datos de los servicios del sistema (Fichero nsswitch.conf). Las l´ıneas m´as significativas de este fichero son bastante parecidas al anterior, y se muestran en el listado del fichero 4.26.
Listado 4.26: Contenido del fichero libnss-ldap.conf para autenticaci´on v´ıa LDAP
uri ldaps :// peloto . escet . urjc . es base dc = zipi , dc = escet , dc = urjc , dc = es l d a p _ v e r s i o n 3
b i n d _ p o l i c y soft
M´odulos de PAM bajo /etc/pam.d/
Por ´ultimo, es necesario configurar todos los ficheros de autenticaci´on de PAM para que usen la autenticaci´on bajo un directorio LDAP. Este directorio, contiene los ficheros necesarios para la autenticaci´on, adem´as de un fichero por cada servicio que requiere autenticaci´on en el sistema (ssh, screensaver, gdm, etc´etera). Debemos ser cuidadosos en el sentido de que si tenemos un servicio que requiere autenticaci´on pero no a˜nadimos su fichero correspondiente en este directorio, ese servicio no podr´a autenticar v´ıa LDAP con nuestro servicio de autenticaci´on. Por ejemplo, si no se crea el servicio de autenticaci´on screensaver, cuando un usuario lance el salvapantallas en una sesi´on X y deje la pantalla bloqueada (es necesario introducir el nombre de usuario y la contrase˜na
4.2. PROTOCOLOS SITUADOS EN LA CAPA DE APLICACI ´ON
para volver a retomar su sesi´on) no podr´a desbloquearla, puesto que el servicio salvapantallas no podr´a autenticar contra el servicio de autenticaci´on LDAP.
Migraci´on de cuentas NIS a LDAP
Un aspecto importante de la decisi´on de implantaci´on de un servidor LDAP para la administraci´on de cuentas de usuario es la seguridad de poder migrar la base de datos actual de usuarios (ahora mismo en NIS) a la base de datos LDAP. En el momento en el que se realiza la migraci´on, el n´umero de usuarios en el sistema es aproximadamente de dos mil usuarios (solamente en el Campus de M´ostoles, que es el primero en el que se propone la migraci´on). Sin duda, no nos podemos plantear la migraci´on a la tecnolog´ıa LDAP si no tenemos una herramienta que automatice todo el proceso de migraci´on de cuentas (es impensable migrar dos mil cuentas de usuario a mano). Por eso, lo primero que debemos hacer es localizar una herramienta que pueda traducir el fichero actual de usuarios (recordamos que la una base de datos NIS es equivalente a los ficheros de usuarios /etc/passwd y /etc/shadow tradicionales) a una base de datos o fichero de importaci´on de datos de LDAP, un fichero LDIF15
que contendr´a todos los usuarios actuales y que ´unicamente tendremos que volcar en la base de datos LDAP.
Para esta tarea, se provee de unas herramientas muy ´utiles que nos ayudar´an en la tarea de la migraci´on de un formato a otro. Una vez m´as, este paquete se encuentra en la mayor´ıa de las distribuciones usadas hoy en d´ıa, y como no, en Debian GNU/Linux:
Listado 4.27: Instalaci´on del conjunto de herramientas migrationtools a trav´es de apt-get
$ apt - get install m i g r a t i o n t o o l s
El uso de estas herramientas es realmente simple y muy potente. Las aplicaciones quedan instaladas bajo el directorio /usr/share/migrationtools/. En este directorio podemos localizar el script migrate passwd.pl, el cual se encarga de transformar los ficheros /etc/passwd y /etc/shadow de la m´aquina donde ejecuta el script en el formato adecuado de una base de datos LDAP: la salida, mostrada por pantalla, es un fichero LDIF que contiene los usuarios de estos ficheros transformados al formato correspondiente.
Con un poco de mano, podemos transformar este peque˜no script escrito en Perl para que tome como argumentos ficheros pasados al invocar al programa, aumentando as´ı la versatibilidad del mismo. Adem´as, como vimos en el apartado anterior (Jerarqu´ıa de nuestro servidor LDAP), podemos separar las cuentas entre los profesores y los alumnos, haciendo que para cada uno de ellos, se muestre un nombre distinguido diferente. Estas operaciones auxiliares, se pueden realizar