Logo
You
Code

LDAP sobre Linux

  • Tutoriales
Autor YouCode - http://www.youcode.com.ar/tutoriales/ldap-sobre-linux-316

Introduccion a servidores LDAP sobre Linux

¿Que es LDAP?

 
LDAP significa Protocolo de Acceso a Directorios Ligeros (siglas en inglés de Lightweight Directory Access Protocol) y es un servicio de directorio, muy similar a los directorios del sistema de ficheros al que estamos acostumbrados, o a la guía de teléfonos que usamos para buscar números de teléfono, o a los servicios de directorios de red como el NIS de SUN
(Network Information Service, Servicio de Información de Red), DNS (Domain Name Service), o al árbol que ves en tu jardín (o en el de tu vecino).

LDAP es una base de datos especializada. Es muy importante recordar que LDAP no es otra base de datos más.
LDAP está optimizada para hacery aprende Recursos Formulario de "talkback" para este artículo búsquedas (leer datos).
Las lecturas en LDAP se realizan de manera mucho más frecuente que las escrituras.

¿Qué tienen todos estos servicios en común?
Todos devuelven alguna información cuando se les pregunta con algún criterio.
 
Ejemplos.

Directorio del sistema de ficheros
ls /etc
Devolverá todos los ficheros y subdirectorios del directorio /etc

ls /etc/p*
Devolverá todos los ficheros y subdirectorios que empiezan por p

find /usr/local/apache -name index.html
Buscará en el sistema de ficheros un fichero o directorio que se llame index.html, empezando en la base

"/usr/local/apache"
Directorio de NIS

ypcat passwd
Devolverá el nombre de usuario, contraseña, userid, etc de la base de datos de NIS

ypmatch atif passwd
Devolverá las entradas para la contraseña para el usuario atif

Directorio DNS
nslookup www.linuxfocus.org
Devolverá la dirección ip para la entrada www.linuxfocus.org de la base de datos de DNS

nslookup -type MX linuxfocus.org
Devolverá solo información MX de la base de datos de DNS donde el nombre de host sea linuxfocus.org

Directorio LDAP
(lo veremos con detalle más abajo)
ldapsearch uid=aghaffar
Devolverá toda la información pública sobre el usuario aghaffar
Similar al comando de unix find / -uid aghaffar

ldapsearch uid=aghaffar mail
Solo devolveráa el mail del usuario aghaffar
 

Directorio Base o Root (raíz)

En cada servicio de directorio de los que hemos mencionado arriba, siempre hay un punto de inicio desde el que empezar a buscar. Este punto de inicio se llama normalmente "root".
Es similar a la raíz del árbol.
Cada árbol tiene una raíz, luego algunas ramas, y luego más ramas y hojas y flores, etc.
Para el sistema de ficheros, el root es / para el NIS el root es el nombre de dominio, por ejemplo "linuxfocus.org" para el DNS está Internic, por ejemplo, que mantiene la base de datos principal sobre servidores de nombre de igual modo para LDAP existe una base que es definible. Por ejemplo "o=linuxfocus.org" donde o significa OrganizaciónCada raíz puede tener varias ramas (como en el árbol del jardín de tu vecino), para el sistema de ficheros esas ramas pueden ser, por ejemplo, otro subdirectorio, o un fichero.

Cada una de las ramas puede tener atributos.
Por ejemplo, las ramas del sistema de ficheros (subdirectorios and ficheros) tienen los siguientes atributos.
nombre
hora de modificación
propietario
grupo
etc
A continuación hay un diagrama que muestra el directorio de un sistema de ficheros.
Los atributos representan la salida del comando de unix ls -ld /usr drwxr-xr-x 29 root root 749 Jun 17 23:45 /usr
Ahora un diagrama para un directorio LDAP
Hablaremos sobre este diagrama más tarde.
 

Distinguished Name (nombre distinguido)

Al contrario que en un árbol natural, cada rama del directorio del sistema de ficheros, del LDAP o de la guía de teléfonos tiene como mínimo un atributo único, que nos ayuda a diferenciarlas las unas de las otras.
En los sistemas de ficheros este atributo único es el nombre del fichero con todo el camino, por ejemplo /etc/passwd
El nombre del fichero passwd tiene que ser único dentro de su camino. Claro que podemos tener /usr/passwd y /opt/passwd que son únicos con todo su nombre completo.
De igual modo, el sistema DNS tiene el FQDN (Fully Qualified Domain Name) que es una entrada &uaacute;nica (ya se que puedes asignar muchas ip al mismo FQDN!).
En LDAP el nombre completo de una entrada se llama "dn" o nombre distinguido (en inglés Distinguished name). Este nombre es siempre único en un directorio. Por ejemplo, mi dn es "uid=aghaffar,ou=People, o=developer.ch"
No es posible tener otras entrada con el mismo dn, pero seguramente podremos tener un dn como
"uid=aghaffar, ou=Administrators, o=developer.ch"
Esto representa el ejemplo de las entradas del sistema de ficheros /etc/passwd y /usr/passwd
Tenemos un único atributo llamado uid in the árbol "ou=Administrators, o=developer.ch" y tenemos un único
atributo llamado uid en el árbol "ou=People, o=developer.ch". No colisionan.
 

Servidores LDAP

Hoy en día hay muchos servidores LDAP disponibles en el mercado, y la mayoría de ellos funcionan bien con Linux.
Para este artículo uaremos openLDAP.
¿Por qué he elegido openLDAP? ¿Por qué deberías elegir tú openLDAP?
Porque su código es libre openLDAP está disponible en http://www.openldap.org. Puedes bajarte el código fuente y construirtelo tú mismo, o mirar a ver si está el package para tu distribución de Linux. Te ahorrará el esfuerzo e isntalarás directamente los binarios.
Yo lo he provado en SuSE6.x y en RedHat6.x
 

Construcción del directorio LDAP

En esta sección montaremos un servidor LDAP paso por paso.
  • Pasos a realizar:
  • Descargar e instalar openLDAP
  • Configurar el servidor LDAP
  • Configurar las variables de entorno para apuntar a la instalación de LDAP
  • Inicializar la base de datos de LDAP
  • Interrogar a LDAP
  • Añadir y/o modificar entradas LDAP
 


Descarga e instalación de openLDAP

Como ya hemos dicho, debes descargar los fuentes de www.openldap.com e instalarlos según la documentación o instalar un package de binarios precompilados (instalar los packages o un HOWTO sobre cómo compilar aplicaciones queda más allá de las intenciones de este artículo).
 

Configurar el servidor LDAP

Para este ejemplo, construiremos un directorio LDAP para linuxfocus.org. Si quieres, puedes cambiar los nombres y todo lo necesario para adaptarlo a tu site.
Para configurar el servidor principal, tenemos que editar los ficheros slapd.conf y ldap.conf. Lo puedes hacer en tu editor favorito.
En mis servidores, estos ficheros están en /etc/openldap. Los tuyos pueden estar en /usr/local/etc/openldap o en algún otro sitio, dependiendo de tu Distribución de Linux, o de los parámetros de configuración si compilaste openLDAP tu mismo.
######### /etc/openldap/slapd.conf ###################################
# lo que sigue esta definido por defecto en mi linux suse 6.4
# hablaremos mas sobre ello en la segunda o tercera parte de este articulo
# Quizas por entonces ya sepa que significa :)
include /etc/openldap/slapd.at.conf
include /etc/openldap/slapd.oc.conf
schemacheck off
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
#######################################################################
# definiciones de la base de datos ldbm
#######################################################################
# esto define el tipo de base de datos a usar. manten el valor por
# defecto ldbm
database ldbm
# sufijo o raiz (root) del directorio. Es el nodo raiz superior
# de tu directorio LDAP
suffix "o=linuxfocus.org"
# aqui es donde se guardara el dbs de ldap
directory /var/lib/ldap
# el nombre distingudo (distinguished name) del directorio manager
rootdn "cn=Manager, o=linuxfocus.org"
# no es muy buena idea guardar la contraseña en texto llano,
# pero la dejaremos asi al principio hasta que controlemos mas sobre LDAP
rootpw secret
# Esto es todo, de momento.
Editamos el fichero /etc/openldap/ldap.conf
Este fichero pertenece al cliente de LDAP, pero aquí utilizamos la misma máquina como cliente y servidor.
Pueden ser la misma o dos diferentes.
Normalmente este fichero lo leen utilidades ldap como ldapdelete, ldapadd, etc.
##########/etc/openldap/ldap.conf#########
#
# Valores por defecto para LDAP
#
# mirar ldap.conf(5) para mas detalles
# Este fichero debe tener permiso de lectura para todo el mundo
# esto define el servidor ldap. Se puede usar hostname o direccion ip
host 127.0.0.1
# este es el el directory root que queremos usar para iniciar las
# busquedas. usaremos el nodo superior en nuestra configuracion
# pero no tiene porque serlo. Por ejemplo, podemos poner
# base = ou=users, o=linuxfocus.ch
# si lo hacemos, todas las busquedas empezaran en una rama del arbol
base o=linuxfocus.org
# esto es todo
Ahora iniciamos el servidor LDAP.
Si usas el servidor pre-instalado de SuSE, lo puedes iniciar con /etc/rc.d/ldap start
En RedHat, creo que es /etc/rc.d/init.d/ldap start
Si lo has compilado e instalado por ti mismo y has usado los directorios por defecto, lo puedes iniciar con
/usr/local/libexec/slapd & o donde lo hallas instalado. Simplemente encuentra slapd y ejecutelo.
 

Cómo añadir datos al nuevo servidor LDAP

Llegados a este punto ya tenemos un servidor LDAP funcionando, listo para ser llenado con información.
La manera estándar de llenar de información el servidor LDAP es crear un fichero LDIF (Formato de intercambio de directorios LDAP, en inglés LDAP Directory Interchange Format)*. Puedes leerte el man de ldif para informarte más sobre ldif.
Muy brevemente, ldif es la representación textual de las entradas de LDAP. Estas entradas están en un formato legible por el hombre e intercambiable entre dos servidores LDAP diferentes de diferentes fabricantes, usando motores de bases de datos diferentes, y ejecutandose en sistemas operativos diferentes.

* Sí. Otro formato más. Me pregunto por qué no se usa XML en lugar de LDIF.
Sin más preámbulos creemos el fichero ldif. Algunas cosas a recordar.
Cada registro/entrada del fichero ldif se separa con una línea en blanco.
Los espacios en los valores son muy importantes. No es lo mismo "Atif Ghaffar" que "Atif Ghaffar "
El fichero ldif: linuxfocus.org.ldif
dn: o=linuxfocus.org
o: linuxfocus.org
objectclass: top
objectclass: organization
dn: ou=editors, o=linuxfocus.org
ou: editors
objectclass: organizationalUnit
dn: uid=aghaffar, ou=editors, o=linuxfocus.org
uid: aghafar
cn: Atif Ghaffar
sn: Ghaffar
givenname: Atifobjectclass: person
userpassword: {CRYPT}yIvSBWSuLs2N2
mailacceptinggeneralid: aghaffar@linuxfocus.org
ou: editors
dn: uid=mkempe, ou=editors, o=linuxfocus.org
uid: mkempe
cn: Magnus Kempe
sn: Kempe
givenname: Magnus
objectclass: person
userpassword: clearpass
mailacceptinggeneralid: mkempe@linuxfocus.org
maildrop: mkempe@developer.ch
preferredlanguage: fr
ou: editors
Ahora tenemos que añadir esta información al directorio LDAP. Usamos el programa llamado ldapadd
ldapadd -D "cn=Manager, o=linuxfocus.org" -w secret < linuxfocus.org.ldif
Este comando usa "cn=Manager, o=linuxfocus.org" como el dn del manager y ’secret’ como password y lee la información del fichero linuxfocus.org.ldif y la inserta en el directeorio LDAP.
Si todo va bien ya estamos listos para hacer preguntas a a nuestro directorio LDAP, o si no fue todo bien ya estás listo para inundarme el correo ;)
Por el bien de mi servidor de correo espero que todo haya ido bien.
Antes de seguir, examinemos el fichero ldif línea por línea.
  1. Esta línea define el dn para la entrada de nivel superior. Será la raíz del árbol de directorios.
    Es necesario definirla
  2. Esta línea define la o (organización) y le da el valor "linuxfocus.org"
  3. Esta línea define la clase de este objeto. Le indicamos top.
  4. Aquí definimos el tipo del objeto (es un objeto de organización
  5. La línea en blanco separadora
  6. dn para el grupo de editores (esta es la rama hecha para los editores de linuxfocus)
    Como esta rama, podemos tener todas las que queramos para otros propósitos. Por ejemplo, una rama
    con los hosts y sus datos, una rama para mirrors del site, etc. etc
  7. aquí se define explícitamente el atributo ou (unidad organizativa) para los editores.
    Estos atributos sirven como ítems buscables. Por ejemplo, si quieres encontrar todos los usuarios que son
    editores puedes buscar con "show all dn where ou=editors". Si no definimos esto aquí esta
    entrada/registro no se encontraría.
  8. aquí definimos el objectclass (organizationalUnit)
  9. La línea en blanco separadora.
  10. dn para el usuario aghaffar del grupo de editores
  11. el uid (asegúrate que es único) del usuario
  12. el cn (common name, nombre común) del usuario. Por ejemplo, yo prefiero escribir el nombre como
    "Nombre Apellido", otros prefieren "Apellido Nombre".
  13. sn: apellido (en inglés Surname)
  14. givenname (Nombre)
  15. objectclass (Persona)
  16. userpassword (este es un password encriptado). La cadena {CRYPT} indica que este password está
    encriptado con el algoritmo crypt. El resto es el password encriptado.
  17. Esta línea define una dirección de email donde puedo recibir emails.
  18. ou. Esto define que estoy en la unidad organizativa de editores.
  19. La línea en blanco separadora
  20. de nuevo, dn para otra entrada. Nombre de usuario: mkempe, ou editores
  21. nombre comun
  22. apellido
  23. nombre
  24. objectclass
  25. userpassword: aquí estamos utilizando un password en texto llano. Se puede usar para diferentes usuarios
    formatos diferentes. Se puede definir en cada entrada y no para toda la base de datos. Por lo que un
    usuario puede tener texto llano, otro puede encriptar con CRYPT, otro con SHA etc.
  26. dirección de mail donde el usuario acepta mail. (Normalmente se usa para el servidor de mail).
  27. maildrop: De nuevo para el servidor de mail. Define dónde reside el mail del usuario. En este ejemplo, el
    servidor de mail recibe el mail para la dirección "mkempe@linuxfocus.org", el servidor de mail
    preguntará entonces al servidor de LDAP "hay algún buzón que acepte mail para
    "mkekpe@linuxfocus.org"?. El servidor ldap le devolverá el valor del atributo maildrop. El servidor de
    mail enviará entonces el mail a ese buzón. Hablaremos más sobre el tema en otro momento. Estoy
    construyendo la infraestructura de un ISP donde uso bastante LDAP para administrar dominios virtuales
    y toda la información sobre dominios y sus usuarios. Si estás interesado en estas cosas, envíame un
    mail.
  28. preferredlanguage. Aquí tenemos un atributo extra que nos dice el idioma preferido del usuario. Podemos
    usar esta información o otras informaciones de preferencias del usuario que almacenemos centralmente
    en el LDAP para proporcionar mejores servicios. Por ejemplo, a este usuario siempre se le redirecciona
    automáticamente a las páginas en franc´s.
    Fíjate que el anterior usuario no tiene algunos atributos (preferredlanguage, maildrop, etc). Es una de las
    ventajas de LDAP. No hay una estructura fija, como en una tabla de una base de datos. Puedes tener una
    entrada con solo 3 atributos, mientras que otra puede tener 30.
  29. ou. la unidad de editores



Interrogando a la base de datos LDAP

Busquemos todos los datos sobre el usuario mkempe
ldapsearch uid=mkempe
Busquemos el dn de todos los editores
ldapsearch ’(&(objectclass=person)(ou=editors))’ dn
Si quieres más ejemplos, léete las páginas del manual de ldapsearch
 

Ventajas de LDAP

¿Cuáles son las ventajas de cambiar a LDAP?
LDAP es un estándar abierto. La mayoría de aplicaciones nuevas que utilices serán capaces de buscar
información en una base de datos. Incluso Windows 2000 usa LDAP para sus servicios de directorio.
Centralizar toda la información en un lugar tiene enormes beneficios: un único punto de administración, con
menos posibilidad de errores, menos datos duplicados por todas partes, y la facilidad de realizar backups
 

Implementaciones de ejemplo de LDAP

Yo ahora pdría ser un empleado de Compaq y tratar de venderte LDAP diciendo que puedes usarlo como
ádministrador de contactos’. Pero no trabajo para Compaq, Por lo que trataré de explicarte un uso más
interesante de LDAP.
 

ORIGEN ÚNICO DE AUTENTICACIÓN

Cuentas de usuarios en un lugar central.
Puedes utilizar un árbol LDAP para administrar tus usuarios, sus passwords y mucha más información de la
que puedes guardar en un simple fichero /etc/passwd. Esta información podrá ser usada por los usuarios de
Microsoft Windows, Unix o Mac. 

Idea Puedes jugar con los ficheros /etc/pam.d/login, etc para que la autenticación se haga con la información
de LDAP, en lugar de la del fichero shadow, o de nis etc.
Idea Puedes escribir un pequeño interfase web para que los usuarios cambien su password de unix sin
necesidad de entrar en el sistema, ya que la información del password está en LDAP y no en el sistema.
Necesitarás usar pam_ldap para esto. Mira el capítulo de Recursos para url’s sobre pam_ldap.

NOTA
Única fuente de autenticación != Única autenticación.
Muchos vendedores de LDAP tratan de venderlo diciendo que si implementas LDAP tendrás una solución de
autenticación única.

Es una verdad a medias. La autenticación única es algo totalmente diferente y difícil de conseguir, y que planea
estos días sobre los IT Managers.
Autenticación única es, por ejemplo:
  • Entras en tu estación como "aghaffar"
  • Vas a la intranet de la empresa, donde la página web está protegida por contraseña, y entras sin
  • autenticarte porque tu identidad ya es conocida por la intranet.
  • Inicias otro programa, por ejemplo SAP, y no te pide de nuevo tu contraseña, porque tu identidad e
  • información ya está ahí.
  • etc etc etc
De acuerdo que puedes usar LDAP como fuente de información única del usuario, pero la magia de controlar
las sesiones entre diferentes programas es lo llamado "autenticación única" y no tiene nada que ver con LDAP.
Se puede hacer con LDAP, NIS, cuentas de un dominio NT, bases de datos, ficheros planos...

Idea Puedes querer dar a unos usuarios cuentas de correo en tus servidores, pero no crear cuentas de unix.
Ningún problema. Yo uso una combinación de LDAP, Postfix MailServer y Cyrus IMAP/POP Server para
controlar miles de usuarios y ninguno de ellos tiene una cuenta en el sistema.

Idea Puedes querer centralizar las preferencias para diferentes aplicaciones. Por ejemplo, preferencias de
Netscape, bookmarks etc se pueden guardar en LDAP, y el usuario se puede mover de una máquina a otra,
recibiendo sus preferencias de un servidor LDAP. El usuarios puede cambiarse de un Netscape de Windows
NT a un Netscape de Linux/Solaris/Macintosh y puede usar la misma información. (Lo siento Microsoft... se
que esto es muy malo para vosotros).

Escenario Odio rellenar my información una vez y otra tanto en la web como en papel. No se porqué la gente
quiere saber una vez y otra mi edad, fecha de nacimiento, dirección... cuando ya se las he dado una vez. En mi
última empresa, tuvimos que hacer enormes formularios para el Help-Desk, que eran básicamente el 75% de lo
mismo (nombre, apellido, cargo, dirección, piso, nombre del jefe, departamento). En lugar de agobiar a los
usuarios y arriesgarse a que te peguen una paliza por la noche, lo mejor es preguntarles a los usuarios solo la
información necesaria. Por ejemplo, pídeles su userid y obtén el resto de la información del LDAP, y
pregúntales solo los datos que te falten.

Idea Por ejemplo, si no me va el teléfono, la única información nueva que tengo para ti es no me va el teléfono’.
A un usuario le agobiará menos la intranet si:
El usuario escribe la url del formulario de problemas (O clicka un enlace de su página de bookmarks)
La página le pregunta al usuario su usuario y password (solo una vez cada sesión. En las siguientes visitas a
esta página o otras páginas protegidas, el sistema recordará su información)
La página tiene dos partes: 1) áread de texto donde reportar el problema y 2) botón de envío
 
http://www.youcode.com.ar/tutoriales/ldap-sobre-linux-316