Instalación del servidor LDAP

slapd es un servidor de directorio LDAP.

Instalar el servidor Openldap

Instalar los paquetes slapd y ldap-utils.

apt-get install slapd ldap-utils

Fichero de configuración slapd.conf

  1. Editamos el fichero de configuración /etc/ldap/slapd.conf y modificamos los siguientes aspectos.

  2. Este es el sufijo principal de las entradas del directorio, es decir, lo que hemos denominado base o raíz del directorio.

    suffix  "dc=esi, dc=es".

  3. backend de Base de Datos

    database bdb

  4. Directorio de la Base de Datos

    /var/lib/ldap
  5. Cuenta del administrador del directorio. Por defecto es manager, aunque podríamos cambiarlo.

    rootdn  "cn=manager, dc=esi, dc=es"
  6. Contraseña del administrador

    rootpw  {crypt}contraseña_cifrada
    							rootpw {MD5}ISMvKXpXpadDiUoOSoAfww==
    						

    Con slappasswd -h {MD5} ponemos una contraseña cifrada usando el algoritmo MD5

  7. Niveles de acceso

    Esta opción permite especificar a quién se da el permiso para leer, buscar, comparar, modificar, etc., la información almacenada en el directorio. Para ello se utilizan una o múltiples reglas de control de acceso, cuya sintaxis se muestra a continuación:

    access to what [by who acess_control]+

    • what: a qué datos del directorio se aplica la regla. A todo el directorio (*), a un subconjunto de entradas con un sufijo dn=".*,ou=profesores, dc=iescuravalera,dc=es" o un atributo en concreto dn=".*, ou=profesores, dc=esi, dc=es" attr=userPassword

    • who: indica a qué usuario(s) se especifica la regla. self (el propietario de la entrada), dn="..." (el usuario representado por el nombre distinguido), users (cualquier usuario acreditado), anomymous (cualquier usuarios no acreditado) y * (cualquier usuario).

    • access_control: indica qué operación concede la regla: none (sin acceso), auth (utilizar la entrada para validarse), compare (comparar), search (búsqueda), read (lectura), y write (modificación).

      
		access to * 
      		by dn="cn=Manager,dc=esi,dc=es" write 
      		by * read 
      	

      Permite al administrador cambiar cualquier entrada del directorio y al resto de usuarios sólo leerlas.

      
		access to attrs=userPassword
      		by dn="cn=Manager,dc=esi,dc=es" write
      		by anonymous auth
      		by self write
      		by * none
      	

      Permite a cada usuario a cambiarse su propia contraseña (la contraseña es el atributo userPassword en los objetos de tipo usuario), al administrador cambiar la de cualquier usuario y al resto de usuarios sólo pueden utilizar este campo para autentificarse.

      access to dn=".*,ou=profesores,dc=esi,dc=es" 
      		by dn="cn=Manger,dc=esi,dc=es" write
      		by * read
      	

      Al resto de los atributos de las cuentas de usuario, permite al administrador su cambio y al resto sólo su consulta (de esta forma evitamos que un usuario pueda cambiarse su UID, GID, etc.).

Actvivar el servicio

/etc/init.d/slapd start

Gestionar entradas al dierctorio

El formato ldif es en el que se almacenan las entradas de directorio

Los comandos para manejar dicho directorio son ldapsearch, ldapadd, ldapmodify, ldapdelete. Sus parámetros comunes son:

-b

DN

DN base desde donde se realiza la búsqueda

-D

DN

DN del usuario con el que nos autenticamos

-h

host

host del servidor LDAP

-p

puerto

puerto del servidor LDAP

-w

clave

clave para una autenticación simple

-x

autenticación simple

Añadimos las entradas iniciales

Editamos el fichero /var/lib/ldap/entradas.ldif y añadimos como primeras entradas el dominio principal y el administrador de dicho dominio


		# esi.es Dominio principal
		dn: dc=esi,dc=es
		objectClass: top
		objectClass: dcObject
		objectClass: organization
		o: Ciclo Grado Medio Instituto
		dc: esi
		
		# Manager, esi.es. Administrador del dominio
		dn: cn=Manager,dc=esi,dc=es
		objectClass: top
		objectClass: organizationalRole
		cn: Manager
	

# Añadimos como administrador al servidor LDAP el fichero 		entradas.ldif
		ldapadd -x -D "cn=Manager,dc=esi,dc=es" -W -f /var/lib/ldap/passwd.ldif -h 127.0.0.1	
	

Migrar los usuarios y grupos actuales al dominio

La idea es que los usuarios y grupos, que tengamos creados en la máquina que contiene el servidor LDAP, migrarlos al directorio LDAP. Vamos a crear los grupos profesores y alumnos, y les vamos a asociar usuarios. Después haremos la migración a LDAP.

  1. Creamos los grupos:

    
		addgroup -gid 2000 PROFESORES
    		addgroup -gid 2001 ALUMNOS
    	

    Creamos usuarios para esos grupos, morgado es profesor y pepe es alumno.

    
		adduser -gid 2000 morgado
    		adduser -gid 2001 pepe
    	
  2. Nos descargamos el paquete Migration Tools, lo descomprimimos en /usr/share/MigrationTools y nos posicionamos en dicho directorio. La idea es pasar el passwd y group a formato ldif en los ficheros base.ldif, group.ldif y passwd.ldif

    Editamos el fichero migrate_common.ph y hacemos los siguientes cambios:

    
		#Default DNS domain
    		$DEFAULT_MAIL_DOMAIN = "asi.net";
    		
    		# Default base 
    		$DEFAULT_BASE = "dc=esi,dc=es";
    		
    		# turn this on to support more general object clases such as person.
    		$EXTENDED_SCHEMA = 1;
    	

    A continuación ejecutamos, desde la shell, los scripts de migración:

    
		#migramos el sistema base
    		./migrate_base.pl > /var/lib/ldap/base.ldif
    		
    		#migramos los grupos
    		./migrate_group.pl /etc/group /var/lib/ldap/group.ldif
    		
    		#migramos los usuarios
    		./migrate_passwd.pl /etc/passwd /var/lib/ldap/passwd.ldif
    	

    Entradas significatias del base.ldif:

    
		dn: ou=Hosts,dc=esi,dc=es
    		ou: Hosts
    		objectClass: top
    		objectClass: organizationalUnit
    		
    		dn: ou=Rpc,dc=esi,dc=es
    		ou: Rpc
    		objectClass: top
    		objectClass: organizationalUnit
    		
    		dn: ou=Services,dc=esi,dc=es
    		ou: Services
    		objectClass: top
    		objectClass: organizationalUnit
    	

    Entradas significatias del group.ldif:

    
		# El grupo root
    		dn: cn=root,ou=Group,dc=esi,dc=es
    		objectClass: posixGroup
    		objectClass: top
    		cn: root
    		userPassword: {crypt}x
    		gidNumber: 0
    		
    		# el grupo bin
    		dn: cn=bin,ou=Group,dc=esi,dc=es
    		objectClass: posixGroup
    		objectClass: top
    		cn: bin
    		userPassword: {crypt}x
    		gidNumber: 2
    		...
    		
    		# el grupo profesores con gid 2000
    		dn: cn=profesores,ou=Group,dc=esi,dc=es
    		objectClass: posixGroup
    		objectClass: top
    		cn: profesores
    		userPassword: {crypt}x
    		gidNumber: 2000
    		
    		# el grupo alumnos
    		dn: cn=alumnos, ou=Group,dc=esi,dc=es
    		objectClass: posixGroup
    		objectClass: top
    		cn: profesores
    		userPassword: {crypt}x
    		gidNumber: 2001
    	

    Entradas significatias del passwd.ldif:

    
		#usuario root
    		
    		dn: uid=root,ou=People,dc=esi,dc=es
    		uid: root
    		cn: root
    		sn: root
    		objectClass: person
    		objectClass: organizationalPerson
    		objectClass: inetOrgPerson
    		objectClass: posixAccount
    		objectClass: top
    		objectClass: shadowAccount
    		userPassword: {crypt}$1$Rxs0Oeuw$zH9ze87mvoFuPeyjRfvJb/
    		shadowLastChange: 11627
    		shadowMax: 99999
    		shadowWarning: 7
    		loginShell: /bin/bash
    		uidNumber: 0
    		gidNumber: 0
    		homeDirectory: /root
    		gecos: root
    		
    		# usuario mysql
    		
    		dn: uid=mysql,ou=People,dc=esi,dc=es
    		uid: mysql
    		cn: MySQL Server
    		givenName: MySQL
    		sn: Server
    		objectClass: person
    		objectClass: organizationalPerson
    		objectClass: inetOrgPerson
    		objectClass: posixAccount
    		objectClass: top
    		objectClass: shadowAccount
    		userPassword: {crypt}!
    		shadowLastChange: 11627
    		shadowMax: 99999
    		shadowWarning: 7
    		loginShell: /bin/false
    		uidNumber: 107
    		gidNumber: 114
    		homeDirectory: /var/lib/mysql
    		gecos: MySQL Server,,,
    		
    		# resto de usuarios
    		
    		#usuario morgado dentro de la ou=People y perteneciente al grupo 2000 de profesores
    		dn: uid=morgado,ou=People,dc=esi,dc=es
    		uid: morgado
    		cn: morgado
    		sn: morgado
    		objectClass: person
    		objectClass: organizationalPerson
    		objectClass: inetOrgPerson
    		objectClass: posixAccount
    		objectClass: top
    		objectClass: shadowAccount
    		userPassword: {crypt}$1$tN3sIQTM$00KGQCUJKfJGIEP8.o4LS/
    		shadowLastChange: 11627
    		shadowMax: 99999
    		shadowWarning: 7
    		loginShell: /bin/bash
    		uidNumber: 1001
    		gidNumber: 2000
    		homeDirectory: /home/morgado
    		
    		#usuario pepe dentro de la ou=People y perteneciente al grupo 2001 de alumnos
    		
    		dn: uid=pepe,ou=People,dc=esi,dc=es
    		uid: pepe
    		cn: pepe
    		sn: pepe
    		objectClass: person
    		objectClass: organizationalPerson
    		objectClass: inetOrgPerson
    		objectClass: posixAccount
    		objectClass: top
    		objectClass: shadowAccount
    		userPassword: {crypt}$1$tN3sIQTM$00KGQCUJKfJGIEP8.o4LS/
    		shadowLastChange: 11627
    		shadowMax: 99999
    		shadowWarning: 7
    		loginShell: /bin/bash
    		uidNumber: 1001
    		gidNumber: 2001
    		homeDirectory: /home/pepe
    		gecos: ,,,
    	

    A destacar:

    Dentro del dominio asi.es nos ha creado por defecto dos unidades organizativas People y Group. En People están los usuarios y en Group los grupos del sistema.

    Las cuentas de usuario son objeto tipo posixAccount y las cuentas de grupo posixGroup

Añadir entradas al directorio

Añadimos las entradas de esos ficheros al directorio LDAP. Con ldapadd, añadimos como manager, el fichero base.ldif al servidor LDAP de la máquina local.

El atributo uidNumber es el identificador (uid) de usuario y el gidNumber el idetificador (gid) de grupo al que pertenece ese usuario.


		# Añadimos como administrador al servidor LDAP el fichero base.ldif
		
		ldapadd -x -D "cn=Manager,dc=esi,dc=es" -W -f /var/lib/ldap/base.ldif -h 127.0.0.1
		
		# Añadimos como administrador al servidor LDAP el fichero group.ldif
		
		ldapadd -x -D "cn=Manager,dc=esi,dc=es" -W -f /var/lib/ldap/group.ldif -h 127.0.0.1
		
		# Añadimos como administrador al servidor LDAP el fichero passwd.ldif
		
		ldapadd -x -D "cn=Manager,dc=esi,dc=es" -W -f /var/lib/ldap/passwd.ldif -h 127.0.0.1	
	

Fichero /etc/ldap/ldap.conf

Simplemente realizamos los siguientes cambios:


		HOST	192.168.4.1
		BASE	dc=esi, dc=es
		URI	ldap://ldap.esi.es:666
	

Busquedas en el directorio con ldapsearch

El formato es ldapsearch [opciones] [filtros [atributos_a_recuperar]]

Con ldapsearch -x -b 'dc=esi,dc=es' -h 192.168.1.184 buscamos todas las entradas del directorio por debajo de nuestro dominio esi.es

Con ldapsearch -x -b 'ou=People,dc=esi,dc=es' -h 192.168.1.184 buscamos todas las entradas del directorio por debajo de nuestro dominio esi.es que pertenezcan a la unidad organizativa People

Con ldapsearch -x -b 'dc=esi,dc=es' '(uid=morgado)' -h 192.168.1.184 buscamos todas las entradas del directorio por debajo de nuestro dominio esi.es que pertenezcan a la unidad organizativa People

Con ldapsearch -x -b 'dc=esi,dc=es' '(cn=profesores)' -h 192.168.1.184 buscamos todas las entradas del directorio por debajo de nuestro dominio esi.es que pertenezcan a la unidad organizativa People

Con ldapsearch -x -b 'dc=esi,dc=es' -s sub "gidNumber=2000" -h 127.0.0.1 buscamos todas las entradas del directorio por debajo de nuestro dominio esi.es que tengan con gidNumber=2000, es decir todas las entradas que pertenezcan al grupo profesores.