Instalacion y Configuracion de Ldap en Ubuntu y Debian
Instalacion y Configuracion de Ldap en Ubuntu y Debian
Instalacion y Configuracion de Ldap en Ubuntu y Debian
Para simplificar la administración de los usuarios del sistema es ideal utilizar una base de datos
accesible mediante LDAP. Almacenar las cuentas de usuario de forma centralizada en un único
repositorio facilitará la creación, modificación y eliminación de cuentas de usuario y grupos de
usuarios. Será necesario configurar los PCs de la red para que utilicen el servidor LDAP como servidor
de autentificación.
Instalación de OpenLDAP
El servidor OpenLDAP está disponible en el paquete slapd por tanto, lo instalaremos utilizando apt-
get. También nos conviene instalar el paquete ldap-utils que contiene utilidades adicionales:
// Instalación del servidor LDAP
sudo apt-get install slapd ldap-utils
Lo primero que nos pregunta el asistente es si deseamos omitir la configuración del servidor LDAP:
Asistente de configuración de slapd
Obviamente responderemos que no, ya que precisamente lo que queremos es configurar el servidor
LDAP.
Después nos preguntará si queremos que se elimine la base de datos cuando quitemos slapd. Para evitar
confusiones con bases de datos anteriores, lo mejor es responder Sí:
¿Sabías que?
La configuración del servidor LDAP se guarda en /etc/ldap pero...
...es mejor no tocar manualmente los archivos de configuración
Administración de OpenLDAP
• Enrutamiento, proxy y OpenLDAP
• Enrutamiento en Linux
• Cortafuegos iptables
• Proxy squid
• OpenLDAP
• Instalación y configuración de OpenLDAP
• Administración de OpenLDAP
• Autentificación del sistema con OpenLDAP
• Autentificación segura OpenSSL y OpenLDAP
• Acceso a carpetas privadas con autentificación por LDAP
Introducción
Una vez instalado y configurado el servidor LDAP, la siguiente tarea es la del diseño de la estructura y
la introducción de datos en el directorio.
Puesto que la finalidad de nuestro servidor LDAP es que sirva de almacén de usuarios y grupos para
autentificar sistemas linux y servicios como ftp y web, deberemos crear una estructura que parta de la
base de nuestro directorio, para almacenar dicha información. Tal y como se explica más abajo,
crearemos una unidad organizativa (ou) llamada groups, para almacenar los grupos de usuarios y
crearemos otra unidad organizativa llamada users para almacenar a los usuarios.
# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=ieslapaloma,dc=com
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=ieslapaloma,dc=com
olcRootPW: ldapadmin
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=ieslapaloma,dc=com" write by anonymous
auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=ieslapaloma,dc=com" write by * read
# ----------------------------------
Ahora habrá que cargar el servidor ldap con el archivo de configuración creado:
// Cargar en ldap el archivo ldapcurso-esquema-basico.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ldapcurso-esquema-basico.ldif
dn: cn=admin,dc=ieslapaloma,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fXdSVDNLMEpKSlQydmM=
dn: ou=users,dc=ieslapaloma,dc=com
objectClass: organizationalUnit
objectClass: top
ou: users
dn: ou=groups,dc=ieslapaloma,dc=com
objectClass: organizationalUnit
objectClass: top
ou: groups
dn: cn=Joaquin,ou=users,dc=ieslapaloma,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
cn: Joaquin
gidNumber: 1001
homeDirectory: /home/joaquin
loginShell: /bin/bash
sn:: R8OzbWV6
uid: joaquin
uidNumber: 1002
dn: cn=Jessica,ou=users,dc=ieslapaloma,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
cn: Jessica
gidNumber: 1002
homeDirectory: /home/jessica
loginShell: /bin/bash
sn: Perez
uid: jessica
uidNumber: 1004
dn: cn=profesores,ou=groups,dc=ieslapaloma,dc=com
objectClass: posixGroup
objectClass: top
cn: profesores
gidNumber: 1001
memberUid: javier
memberUid: joaquin
memberUid: miguel
dn: cn=alumnos,ou=groups,dc=ieslapaloma,dc=com
objectClass: posixGroup
objectClass: top
cn: alumnos
gidNumber: 1002
memberUid: jessica
memberUid: joel
# ----------------------------------
Ahora habrá que cargar el servidor ldap con el archivo de usuarios creado:
// Cargar en ldap el archivo ldapcurso-usuarios.ldif (cuando pida la contraseña: ldapadmin)
sudo ldapadd -c -x -D cn=admin,dc=ieslapaloma,dc=com -W -f /tmp/ldapcurso-
usuarios.ldif
A partir de este momento ya tendremos un servidor LDAP apto para almacenar usuarios y grupos de
cuentas unix.
Instalación de JXplorer
Previo a instalar jxplorer, es necesario instalar la máquina virtual java de Sun, para lo cual utilizaremos
apt-get, pero antes debemos activar los repositorios -partner- de Ubuntu (ver capítulo Trucos >
Archivo /etc/apt/sources.list):
// Instalación de Java (previamente activar repositorios partner)
sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-plugin sun-java6-fonts
El comando anterior instalará java en la carpeta /usr/lib/jvm/java-6-sun/jre/bin/. Posteriormente
tendremos que editar el archivo /root/.bashrc y añadir las variables que permitan al shell encontrar los
binarios del JRE:
// Añadir en /root/.bashrc
CLASSPATH=/usr/lib/jvm/java-6-sun/jre/bin/
JAVA_HOME=/usr/lib/jvm/java-6-sun/jre/bin/
PATH=/usr/lib/jvm/java-6-
sun/jre/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin
Una vez instalado el java y establecidas las variables CLASSPATH, JAVA_HOME y PATH en el
archivo /root/.bashrc, debes cerrar el terminal y volver a abrirlo, para que cargue nuevamente las
variables de entorno. Si ejecutas el comando set en el terminal, podrás comprobar que ha cargado las
variables de entorno y podrás instalar JXplorer. JXplorer no está disponible en los repositorios de
paquetes de debian, pero se puede descargar haciendo clic aquí. Debemos copiar el archivo en la
carpeta /tmp de nuestro sistema y ejecutar:
// Instalar JXplorer (como usuario, no como root)
sh /tmp/jxplorer3.2_linux.bin
Se iniciará un sencillo asistente de instalación que al finalizar habrá creado la carpeta JXplorer en
nuestra carpeta home y el script de inicio jxplorer.sh dentro de ella, por lo tanto para ejecutarlo
debemos escribir:
// Ejecutar JXplorer: Entran en la carpeta de instalación y ejecutar:
~/JXplorer/jxplorer.sh
El nombre de usuario administrador por defecto suele ser admin y a menudo hay que proporcionar
nombre y base del directorio: cn=admin,dc=ieslapaloma,dc=com
Al hacer clic en el botón 'conectar' (marcado con círculo rojo en la figura) nos aparecerá el diálogo de
conexión para que introduzcamos los datos de la conexión. Para no tener que introducir dicha
información cada vez que conectemos, podemos grabar los datos pulsando 'Save'.
Creación de grupos
Al pulsar OK nos aparecerá la siguiente figura, en la cual observamos los atributos clásicos de un grupo
posix. Debemos rellenar al menos el campo gidNumber. También podemos introducir miembros al
grupo. En el parámetro memberUid añadimos javier. Luego, haciendo clic con el derecho en javier >
Add another value podemos añadir más miembros.
Atributos clásicos de un grupo posix
Creación de usuarios
Para crear los usuarios, haremos clic con el derecho en la unidad organizativa 'users' y haremos clic en
'New'. Observamos en 'Selected Classes' (clases seleccionadas) que están seleccionadas las clases
'inetOrgPerson','organizationalPerson','person' y 'posixAccount'. Si su nombre es Carlos, podemos
escribir en la casilla RDN 'cn=Carlos'.
Creación de usuarios
Al pulsar OK nos aparecerá la siguiente figura, en la cual observamos los atributos de las tres tipologías
de nuestro elemento: persona, usuario de internet y cuenta posix. Debemos rellenar al menos los
campos gidNumber (grupo primario que será el 1003), homeDirectory, uid (identificador), uidNumber
y sn (surname - apellidos). También podemos configurar la contraseña en el atributo userPassword
escribiendo la nueva contraseña cifrada con MD5.
Atributos de las tres tipologías de nuestro elemento
Lo mismo haremos con el resto hasta que tengamos creados los cinco usuarios. Al final nuestro
servidor LDAP tendrá la siguiente información:
¿Sabías que?
Trabajar con herramientas gráficas como jxplorer o phpldapadmin resulta interesante cuando hay que
realizar consultas o pequeñas modificaciones...
...pero cuando se trata de crear usuarios de forma masiva, lo mejor es utilizar archivos ldif y el
comando ldapadd para cargarlos al servidor
Como ya hemos comentado anteriormente, una de las utilidades más importantes de un servidor LDAP
es como servidor de autentificación. Autentificarse es necesario para entrar en un sistema linux.
También para acceder a algunos servicios como un servidor FTP o a páginas privadas en un servidor
web. Aquí veremos las modificaciones que hay que realizar en un sistema Linux para que autentifique a
los usuarios en un servidor LDAP en lugar de utilizar los clásicos archivos /etc/passwd, /etc/group y
/etc/shadow.
Acto seguido ejecutaremos auth-client-config que configurará el archivo /etc/nsswitch.conf para que
utilice ldap:
// Configurar /etc/nsswitch.conf para que utilice ldap
sudo auth-client-config -t nss -p lac_ldap
A partir de este momento ya podemos comenzar a utilizar la autentificación del sistema por LDAP.
Nota: Si quieremos autentificarnos en el sistema con un usuario del LDAP, debemos previamente crear
la carpeta home de dicho usuario y cambiar el propietario y el grupo de dicha carpeta para que coincida
con el usuario y el grupo del usuario configurado en el LDAP.
Probar la autentificación
Nuestro servidor LDAP ya debería autentificar correctamente . Podemos probar la autentificación de
los servicios mediante el comando pamtest. Si deseamos probar que funciona el servicio passwd
(cambiar contraseña) sobre un usuario del directorio LDAP (ejemplo jessica) , podemos ejecutar:
// Probando el cambio de contraseña
pamtest passwd jessica
Trying to authenticate for service .
Password: // Introducimos el password de jessica
Authentication successful. // La autentificación ha sido satisfactoria
También podemos utilizar el comando finger sobre usuarios que estén solamente en el directorio
LDAP, por ejemplo joel:
// Probando finger
finger joel
Login: joel Name: Joel Javier
Directory: /home/www/alumnos Shell: /bin/sh
Last login Tue Sep 27 18:02 (CEST) on pts/3 from 192.168.1.213
No mail.
No Plan.
Podemos por ejemplo, desde una consola de root, cambiar mediante el comando 'su' (su=Switch User -
cambiar de usuario) a un usuario que esté en el directorio LDAP, para lo cuál no nos pedirá contraseña
ya que root tiene permiso para cambiar a cualquier usuario. Si posteriormente cambiamos a otro
usuario del directorio, ahora sí que nos pedirá contraseña. Deberemos introducir la contraseña que esté
almacenada en el directorio LDAP para dicho usuario:
// Cambiando de usuario
su joel // Somos root y cambiamos a joel
joel@ubuntu: // No nos pide password
joel@ubuntu:/$ su jessica // Somos joel, y cambiamos a jessica
Password: // Nos pide password, le introducimos
jessica@ubuntu:/$ // Ha cambiado correctamente
Reflexión
Si configuramos los PCs de un aula de informática para que se autentifiquen en el servidor LDAP,
¿podrán los usuarios utilizar su cuenta de usuario en cualquier PC sin necesidad de crear los usuarios
en cada PC?
Por supuesto, esa es la principal ventaja de centralizar los usuarios y contraseñas en un servidor LDAP
centralizado
Los permisos que los usuarios tienen sobre los sistemas se basan en la autentificación del usuario.
Aunque ya se han desarrollado sofisticados métodos de autentificación como sistemas de tarjeta
electrónica (DNI electrónico) o sistemas biológicos como la huella dactilar o el iris del ojo, la realidad
es que requieren de elementos caros para su aplicación. En entornos educativos y en pequeñas y
medianas empresas, se sigue utilizando el mecanismo tradicional de autentificación del usuario
mediante su nombre de usuario (login) y su contraseña (password).
Desde que el usuario introduce su contraseña hasta que ésta llega al servidor para comprobar la
autentificación, el paquete de datos que contiene la contraseña viaja por los cables de red atravesando
concentradores (hubs), conmutadores (switches) y enrutadores (routers) hasta llegar al servidor.
Durante el trayecto, cualquier persona con los conocimientos necesarios podría quedarse con una copia
del paquete de datos para, posteriormente analizarlo y tratar de descubrir el nombre y la contraseña del
usuario sin que éste se percatase.
Con la finalidad de dificultar que alguien trate de descubrir contraseñas analizando los datos que las
contienen, existe la posibilidad de cifrar los paquetes de datos en el PC antes de enviarlos por la red, de
manera que lleguen al servidor cifrados. De esta forma, aunque un usuario malintencionado capture un
paquete de datos con la información del usuario y la contraseña, será muy dificil, por no decir
imposible, que sea capaz de descifrarlos ya que se utiliza cifrado asimétrico
El cifrado asimétrico permite la generación de una pareja de claves comunmente denominadas clave
pública y clave privada en el servidor. La pareja de claves es tal que, todo lo cifrado con una, solo se
puede descifrar con la otra.
El servidor tiene guardada en un lugar seguro la clave privada. Cuando un cliente intenta autentificarse,
el servidor le trasfiere la clave pública para que cifre los datos con dicha clave antes de enviarlos. El
cliente utiliza la clave pública del servidor para cifrar los datos, así al llegar el paquete al servidor, éste
podrá descifrarlo porque dispone de la clave privada. Si un usuario malintencionado intercepta el
paquete de datos cifrado con la clave pública, no podrá hacer nada porque no dispone de la clave
privada. Si el usuario malintencionado intercepta el primer paquete que envía el servidor con la clave
pública, no le servirá para nada ya que no le permitirá descifrar los datos emitidos por el PC que se va
autentificar.
Fundamentos de la autentificación segura
Al finalizar el script se habrá reinciado el servidor slapd y admitirá conexiones seguras por el puerto
636.
Al intentar conectar, nos aparecerá la información del certificado. Podremos aceptar el certificado para
esta sesión (This session only) o para siempre (Always):
Aceptar certificado
Una vez que hemos conectado, podemos apreciar en la parte inferior que la conexión se ha realizado al
puerto 636:
Conexión segura
Reflexión
¿Por qué deberíamos siempre conectarnos al servidor LDAP utilizando el protocolo seguro ldaps?
Porque en las conexiones al servidor LDAP, enviamos contraseñas y si estas viajan en texto plano,
serían fácilmente descubiertas por algún usuario avanzado que conoque un sniffer en la red y almacene
todos los paquetes de datos
Acceso a carpetas privadas con autentificación
por LDAP
• Enrutamiento, proxy y OpenLDAP
• Enrutamiento en Linux
• Cortafuegos iptables
• Proxy squid
• OpenLDAP
• Instalación y configuración de OpenLDAP
• Administración de OpenLDAP
• Autentificación del sistema con OpenLDAP
• Autentificación segura OpenSSL y OpenLDAP
• 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 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.
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
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'.