lunes, 26 de enero de 2009

Servicio de directorio: LDAP

Servicio de directorio: LDAP

LDAP: Protocolo Ligero de Acceso a Directorios (Lightweight Directory Access Protocol)

OpenLDAP



Modelo de datos de LDAP

Un directorio es una base de dato optimizada para lectura, navegación y búsqueda
  • la información se almacena de manera jerárquica
  • generalmente no se soportan transacciones complejas ni sistemas de recuperación
  • las actualizaciones son cambios simples
  • proporcionan respuestas rápidas a grandes volúmenes de búsquedas
  • el directorio puede estar replicado y/o distribuido entre varios sistemas (p.e. DNS)
LDAP organiza el directorio como una estructura jerárquica de entradas (nodos) en forma de árbol
  • Cada entrada posee un conjunto de atributos, que pueden ser de diferentes tipos
    • cada atributo se identifica por su tipo y uno o más valores
    • los tipos son normalmente palabras nemotécnicas, como uid (identificador de usuario), cn (common name), c (country), dc (domain component), etc.
    • los diferentes atributos de un nodo están determinados por la clase a la que pertenece
    • las clases permiten definir entradas con diferente información: clases para personas, para equipos, administrativas, etc.
    • las clases se definen mediante ficheros de esquema (schema)
  • Cada nodo debe poseer un nombre único: nombre distinguido o dn (distinguished name)
    • el dn identifica de forma unívoca cada objeto en la base de datos
Ejemplo: árbol de usuarios y grupos en LDAP, basado en nombres de dominios de Internet:
Image LDAParbol
  • cada nodo puede tener varios atributos, p.e. el nodo pepe podría tener los siguientes atributos:
    dn: cn=Jose Pena,ou=People,dc=midominio,dc=com
    objectClass: account
    uid: pepe
    sn: Pena
    description: alumno
    mail: pepe@midominio.com
  • el formato en el que se muestran los atributos del objeto se denomina LDIF (LDAP Data Interchange Format)
    • formato de intercambio de datos para importar y exportar datos a un servidor LDAP



Instalación de un servidor LDAP

Describiremos como montar un servidor LDAP simple que nos permita la gestión de usuarios y grupos
  • el servidor mantendrá la lista de usuarios y grupos del dominio
  • en los clientes la autenticación de usuarios y los permisos se basará en el servidor LDAP

Pasos para la instalación del servidor en Debian

  1. Instalar los siguientes paquetes:
    1. slapd: servidor OpenLDAP
    2. ldap-utils: utilidades del paquete OpenLDAP
      • incluye comandos como ldapsearch, ldapadd
    • El comando slapcat permite ver la estructura creada
    • Podemos hacer búsquedas sencillas con ldapsearch
    # ldapsearch -x -b dc=midominio,dc=com ´(cn=admin)´
  2. Ficheros de configuración:
    1. Fichero /etc/ldap/ldap.conf
      • Fichero de configuración global para los clientes LDAP
      • Permite especificar la base por defecto, el servidor LDAP, etc. (cambiarlo para poner nuestra configuración, comprobar que tiene permisos 644)
      • Para más info, ver man ldap.conf
    2. Fichero /etc/ldap/sldap.conf
      • Fichero de configuración del demonio slapd
      • En principio, no es necesario cambiarlo (comprobar que tiene permisos 600)
  3. Crear la estructura de la base de datos: crearemos los nodos de People y Group del árbol LDAP
    1. Crear el siguiente fichero estructura.ldif en formato LDIF:
          dn: ou=People,dc=midominio,dc=com
      objectClass: top
      objectClass: organizationalUnit
      ou: People

      dn: ou=Group,dc=midominio,dc=com
      objectClass: top
      objectClass: organizationalUnit
      ou: Group
    2. Añadir los nodos a la base de datos:
      # ldapadd -x -D 'cn=admin,dc=midominio,dc=com' -W -f estructura.ldif
      • -x autenticación simple sin SASL (Simple Authentication and Security Layer)
      • -D nombre distinguido con el que nos conectamos a LDAP (ponemos el del administrador)
      • -W pide la contraseña de forma interaciva
      • -f fichero a cargar
  4. Añadir un usuario y un grupo a la base de datos
    1. Crear un fichero como este, que tiene la información para un usuario y un grupo (¡no useis acentos!):
          dn: cn=Jose Pena,ou=People,dc=midominio,dc=com
      objectClass: top
      objectClass: account
      objectClass: posixAccount
      objectClass: shadowAccount
      uid: pepe
      cn: Jose Pena
      uidNumber: 2000
      gidNumber: 2000
      homeDirectory: /home/pepe
      loginShell: /bin/bash
      gecos: Jose Pena, Despacho 22,,

      dn: cn=pepe,ou=Group,dc=midominio,dc=com
      objectClass: top
      objectClass: posixGroup
      cn: pepe
      gidNumber: 2000
      • define un usuario pepe y un grupo pepe con información similar a la aparece en el fichero /etc/passwd
      • puede añadirse más información, como la que aparece en el fichero /etc/shadow: campos shadowMax, shadowExpire, shadowWarning, etc.
    2. Añadir el fichero con:
      # ldapadd -x -D ´cn=admin,dc=midominio,dc=com´ -W -f user-group.ldif
    3. Probarlo haciendo búsquedas, tipo:
      # ldapsearch -x uid=pepe
    4. Añadir una contraseña al usuario: puede hacerse directamente metiendo un campo userPassword en el fichero anterior, pero es preferible hacerlo mediante el comando ldappasswd
    # ldappasswd -x ´cn=Jose Pena,ou=People,dc=midominio,dc=com´ -D ´cn=admin,dc=midominio,dc=com´ -W -S
  5. Si queremos migrar la información de los ficheros /etc o NIS a LDAP podemos usar el paquete MigrationTools (ver www.padl.com/OSS/MigrationTools.html)
  6. Por último, también podemos querer instalar el servidor como cliente, por lo que debemos seguir los pasos indicados en la sección de instalación de un cliente

Fichero de configuración slapd.conf

Fichero de configuración del demonio slapd
Tiene dos partes:
  1. Directivas globales: distintos tipos de opciones del servidor, entre ellas los esquemas que el directorio debe conocer:
    • nis.schema define los atributos de objetos para las cuentas de usuario, grupos, etc.
    • se basa en los esquemas básicos core.schema y cosine.schema
    • inetorgperson.schema añade objetos con más información personal para los usuarios
  2. Directivas específicas para las distintas bases de datos
    • Incluye el sufijo, directorio donde guardar la base, y el tipo de database a usar (por defecto bdb, Berkeley Database)
    • También un conjunto de reglas de acceso de la forma:
      access to [by ]+
    • es una expresión que especifica a qué datos del directorio se aplica la regla. Tres opciones:
      1. puede indicarse todo el directorio mediante un asterisco (*)
      2. un subconjunto de entradas cuyo nombre distinguido contiene un cierto sufijo (por ejemplo, dn=".*,dc=midominio,dc=com")
      3. un atributo concreto de dichos objetos (por ejemplo, dn=".*,ou=People,dc=midominio,dc=com" attr=userPassword)
    • indica a quién (a qué usuario(s)) se especifica la regla; puede tomar diferentes valores, siendo los más comunes los siguientes:
      • self el propietario de la entrada
      • dn="..." el usuario representado por el nombre distinguido
      • users cualquier usuario acreditado
      • anonymous cualquier usuarios no acreditado
      • * cualquier usuario
    • indica qué operación concede la regla:
      • none sin acceso
      • auth utilizar la entrada para validarse
      • compare comparar
      • search búsqueda
      • read lectura
      • write modificación
    • Por ejemplo, la regla por defecto para userPassword permite que los usuarios puedan autenticarse y cambiar sus propias contraseñas y el administrador las de todos

Instalación de un cliente LDAP

Describiremos como como configurar un cliente para que acceda a la información almacenada en el directorio de LDAP del servidor
  • Dos pasos:
    1. Configurar el Name Service Switch (fichero /etc/nsswitch.conf)
    2. Configurar el módulo de autenticación (PAM, Pluggable Authentication Modules)
  • Los módulos necesarios para esta configuración pueden descargarse de la página de PADL (www.padl.com) o directamente como paquetes Debian
  • En algunas distros (RedHat) existe la herramienta authconfig que facilita esta configuración

Configurar el Name Service Switch

El NSS se encarga, entre otras, de realizar la correspondencia entre los números y nombres de usuario
  • permite gestionar los permisos de acceso de usuarios a ficheros
  • se configura a través del fichero /etc/nsswitch.conf
  • la configuración de ese fichero la vimos en el tema 5
Pasos (hacerlos en un sistema diferente del servidor):
  1. Instalar el paquete libnss-ldap
    • En la configuración indicar la IP del servidor LDAP y el DN de la base del directorio LDAP
      • esa configuración se guarda en el fichero /etc/libnss-ldap.conf
  2. Modificar las líneas de passwd, group y shadow del fichero nsswitch.conf
    passwd: files ldap
    group: files ldap
    shadow: files ldap
    • esto indica al NSS que busque la información primero en los ficheros y, si no la encuentra, en el servidor LDAP
  3. Probar que funciona:
    1. Hacer un finger al usuario definido en LDAP
        # finger pepe
      Login: pepe Name: Jose Pena
      Directory: /home/pepe Shell: /bin/bash
      ...
    2. Crear el directorio /home/pepe y cambiarle el propietario a pepe
    3. Hacer un su - pepe para ver que podemos cambiar al usuario pepe en el cliente

Configurar el módulo de autenticación

Aunque el usuario es válido en el cliente, todavía no podemos autenticarnos (entrar en la cuenta)
  • Debemos configurar el servicio PAM
PAM (Pluggable Authentication Module)
biblioteca de autentificación genérica que cualquier aplicación puede utilizar para validar usuarios, utilizando por debajo múltiples esquemas de autentificación alternativos (ficheros locales, Kerberos, LDAP, etc.)
  • permite añadir nuevos mecanismos de autentificación (Kerberos, LDAP,...) sin tener que modificar los servicios de entrada al sistema como login, ftp, ssh, etc.
  • PAM utiliza módulos que proporcionan autentificación en los servicios de entrada al sistema:
    • Módulos de autentificación (auth): comprobación de contraseñas (utilizado por el proceso de login para averiguar si las credenciales tecleadas por el usuario (nombre y contraseña) son correctas)
    • Módulos de cuentas (account): controlan que la autenticación sea permitida (que la cuenta no haya caducado, que el usuario tenga permiso de iniciar sesiones a esa hora del día, etc.)
    • Módulos de contraseña (password): permiten cambiar contraseñas
    • Módulos de sesión (session): configuran y administran sesiones de usuarios (tareas adicionales que son necesitadas para permitir acceso, como el montaje de directorios, actualización del fichero lastlog, etc.)
  • Las librerías de PAM están en /lib/security y los ficheros de configuración en /etc/pam.d/ (en versiones viejas, se configuraba a través del fichero /etc/pam.conf)
  • Existe un fichero de configuración para cada servicio que usa PAM
  • También existen ficheros comunes que son incluidos por los ficheros de configuración: common-auth, common-account, common-password y common-session

Configuración de PAM para usar LDAP

en el cliente seguimos los siguientes pasos:
  1. Instalar el paquete libpam-ldap
    • Cambiar el Root login account al DN del administrador LDAP
    • El resto de opciones dejarlas por defecto
    • La configuración es en el fichero /etc/pam_ldap.conf
    • Para más información, ver la página de manual de pam_ldap.conf
    NOTA sobre la configuración: en el último paso de la instalación nos pide la clave del administrador de LDAP
    • esta clave se guarda en plano en el fichero /etc/pam_ldap.secret, y se usa para que el root del sistema pueda modificar directamente las contraseñas de los usuarios
    • si no se quiere tener ese fichero con la clave, dejar vacío el campo clave y en el fichero /etc/pam_ldap.conf comentar la línea que empieza por rootbinddn
  2. Cambiar los ficheros common-auth, common-account y common-password, añadiendo la siguiente línea:
    sufficient pam_ldap.so
    cambiando por auth, account o password según corresponda
  3. En el fichero common-auth añadir use_first_pass después de pam_unix.so
    • esto evita que a los usuarios no-LADP se les pida la contraseña dos veces
  4. Podemos crear directorios home ``al vuelo'': añadir lo siguiente al principio de common-session
    session    required    pam_mkhomedir.so skel=/etc/skel/ umask=0022
    • al entrar el usuario en la cuenta, si no existe su HOME, se crea
  5. Probar que funciona:
    1. Entrar en la cuenta como un usuario LDAP
    2. Cambiar la contraseña del usuario

Instalación del paquete nscd

una vez que todo funciona, en el cliente podemos instalar el paquete nscd
  • Name Service Cache Daemon
  • Hace caché para los nombres leidos del servidor LDAP