(((TalaioticHacklab)))

16-sep-2005:
esquema - ldap
estoy llamando servidor ldap a un equipo, conectado a una red, que mantiene una base de datos jerárquica, modificable y consultable desde cualquier otra máquina de la red, respecto a una organización, por ejemplo un dominio de internet; con un servidor ldap en marcha (por ejemplo OpenLDAP, paquete slapd(1) en debian) podemos hacer consultas y modificaciones en la base de datos, del tipo cambiar el email de la ficha de una persona, básicamente desde línea de comandos con las utilidades para ldap, en el paquete ldap-utils de debian, por ejemplo:

... mostrar campos description, homeDirectory y mail del registro cuyo cn=carlos (-LLL salida corta)

# ldapsearch -x cn=carlos description homeDirectory mail -LLL
dn: uid=carlos,ou=usuarios,dc=ldap,dc=example,dc=com
description: Carlos González
mail: carlos@example.com
homeDirectory: /home/carlos
a partir de esta base de datos central, ajustamos el resto de ordenadores de la red (los que van a ser clientes ldap), para que distintos subsistemas suyos (el subsistema de usuarios, o l@s usuari@s de subsistemas samba, etc. utilicen algunos campos de la base de datos del servidor para realizar acciones que normalmente harían con información local; por ejemplo, si un equipo GNU/Linux normalmente autentifica sus usuarios contra /etc/password, /etc/shadow y otros archivos locales, al convertirlo en cliente ldap ya no buscará los datos de sus usuari@s en esos archivos locales, sino en algunos campos de la base de datos del servidor ldap, por ejemplo, actuará según las siguientes equivalencias:

datos de usuari@
archivo
sin cliente ldap
archivo
con cliente ldap
id_usuario /etc/password
campo cn
shell
/etc/password
campo loginShell
directorio Home
/etc/password
campo homeDirectory
grupo
/etc/groups
campo gidNumber

resumiento, cuando haces login en una máquina cuyo sistema de usuarios es cliente ldap, la máquina se conecta al servidor, le pide los datos de tu ficha y te toma como usuari@ local, dándote el shell que diga loginShell, colocando tus ficheros donde diga homeDirectory, etc.; como contrapartida, por supuesto, si no existe tu ficha, o estás marcado como cuenta desactivada, o hay algún problema, te quedas sin entrar en ninguna de las máquinas que tienes como clientes ldap, hasta que arregles tu ficha ldap, o hasta que vuelvas a apuntar el sistema de usuarios a los ficheros locales; el cliente se puede configurar de las dos maneras, para que admita usuarios ldap además de los usuarios locales, o sólo uno de ambos, depende de la arquitectura que buscamos;

  • esquemas para LDAP
el árbol completo LDAP se genera a partir de archivos-esquema (en /etc/ldap/schema), que definen el árbol de clases y atrubutos permitidos para la organización; si a una entrada le añadimos la clase InetOrgPerson, eso nos permitirá almacenar los atributos propios de esa clase, por ejemplo, el campo mail, o la clase posixAccount que nos permitirá añadir los campos homeDirectory, loginShell, etc.; los esquemas que hemos utilizado para nuestra instalación están en la Tabla 3 (hay que ponerlos por ese orden, eso es importante!!):


  • administración del servidor ldap:
todas las tareas de administración modificaciones, altas, cambios, copias de seguridad del árbol ldap, etc. se pueden hacer con las ldap-utils desde linea de comandos, pero hay excelentes interfaces web libres y escritos en php para hacer todo esto muy fácil, de forma que podremos hacer cualquier modificación en datos de usuario desde cualquier navegador de cualquier máquina de la red (activar usuari@s, cambiar password, mil cosas ...)

  • administración de los clientes ldap:
también se simplifica al máximo la administración de los clientes, básicamente copias de los datos de usuario, porque todos los datos de usuarios, grupos, permisos, etc. están en el servidor; para remontar un cliente GNU/Linux que se ha roto, se instala un sistema base, se restauran de las copias los $home de los usuarios y se pone como cliente ldap; todo el mundo tiene ya su usuario, password, etc. de siempre

  • instalación
en este protocolo apuntamos hacia el servidor ldap principalmente 3 subsistemas del cliente GNU/Linux: pam, nsswitch y el servidor samba;

pam es Pluggable Authentication Modules, y se encarga de librerías para autenticación de aplicaciones y servicios como login, su, passwd, etc.;

nsswitch es Name Service Switch y se encarga de determinar con qué ficheros autenticar datos como hosts, passwords, grupos, etc.; la configuración de estos dos subsistemas está en la Tabla 1.

samba ya se sabe lo que hace y aún no tengo escrito el protocolo del cliente ...


paquetes:
# apt-get install slapd ldap-utils db4.2-utils
-- configuración slapd: (o dpkg-reconfigure --priority=low slapd)
-- do you want to omit the configuration of slapd? - No
-- domain name (base) - dc=ldap,dc=example,dc=com
-- name organization - ldap.example.com
-- admin password - ***elquesea***
-- database backend - BDB
-- remove database when slapd is purged? - No
-- move old database - depende si empezamos de cero No
-- allow protocol ldapv2 - No

 - aquí, tendríamos que tener un servidor LDAP funcionando, comprobar con ps que está en marcha slapd; se puede probar:
$ /usr/bin/ldapsearch -x
que tendría que contestar algo aunque no haya registros aún.


  • -- /etc/default/slapd - añadimos los índices nuevos y los permisos de modificación
    # Indexing options for database #1
    index objectClass eq
    index default sub
    index cn pres,sub,eq
    index sn pres,sub,eq
    # Requerido para soportar pdb_getsampwnam
    index uid pres,sub,eq
    # Requerido para soportar pdb_getsambapwrid()
    index displayName pres,sub,eq
    # Descomente las siguientes líneas si está almacenando entradas
    # posixAccount y posixGroup en el directorio
    index uidNumber eq
    index gidNumber eq
    index memberUid eq
    # Samba 3.*
    index sambaSID eq
    index sambaPrimaryGroupSID eq
    index sambaDomainName eq
... en el mismo archivo:
  • access to attrs=sambaLMPassword,sambaNTPassword
    by dn="cn=manager,dc=ldap,dc=example,dc=com" write
    by * none
  • añadir usuario slapd
addgroup --system slapd
adduser --home /var/lib/ldap --shell /bin/false --no-create-home --ingroup slapd --system slapd
/bin/chown -R slapd.slapd /etc/ldap /var/lib/slapd /var/lib/ldap /var/run/slapd
  • usuario por defecto para slapd en /etc/default/slapd:
SLAPD_USER="slapd"
SLAPD_GROUP="slapd"
  • modificaciones posteriores:
con estas líneas en un archivo (crea_freeId.ldif), creo la entrada:

dn: cn=NextFreeUnixId,dc=ldap,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: sambaUnixIdPool
cn: NextFreeUnixId
sn: NextFreeUnixId
gidNumber: primerGidLibre (escribir el número id)
uidNumber: primerUidLibre (escribir el número id)

con:
ldapadd -xvWD "cn=manager,dc=ldap,dc=example,dc=com" -f crea_freeId.ldif

que es el registro donde se va a guardar el último uid y gid usados;
hay ejemplos de ficheros de moficaciones para usar con ldapmodify al final de este documento


  • postinstalación:
en función de las aplicaciones que vamos a apuntar al servidor Ldap serán necesarios unos esquemas de atributos u otros; en la instalación del hospital, estamos usando los esquemas que se muestran en la Tabla 3.


instalación cliente ldap para cuentas GNU/Linux
subsistema PAM:


  • libldap2 ........ (viene instalado); cambiar en /etc/ldap/ldap.conf) los valores BASE y URI apuntando al servidor LDAP:
BASE dc=ldap,dc=example,dc=com
URI ldap://ip_servidor_ldap

base dc=ldap,dc=example,dc=com
ldap_version 3
rootbinddn cn=manager,dc=ldap,dc=example,dc=com
  crear el fichero /etc/ldap.secret (modo 0600) con el password del manager-ldap

  cambiar en /etc/pam.d los ficheros de PAM, según Tabla 1:

subsistema NSSwitch


Tabla 1. ficheros del subsistema PAM

##############################
file:/etc/pam.d/common-account
##############################
#
account    required    pam_unix.so
account    sufficient    pam_ldap.so

###########################
file:/etc/pam.d/common-auth
###########################
#
auth     sufficient     pam_unix.so
auth     sufficient     pam_ldap.so try_first_pass
auth     required       pam_env.so
auth     required       pam_securetty.so
auth     required       pam_unix_auth.so
auth     required       pam_warn.so
auth     required       pam_deny.so

###############################
file:/etc/pam.d/common-password
###############################
#
password required    pam_cracklib.so retry=3 minlen=8 difok=4
password sufficient    pam_unix.so use_authtok md5 shadow
password sufficient    pam_ldap.so use_authtok
password required    pam_warn.so
password required    pam_deny.so

##############################
file:/etc/pam.d/common-session
##############################
#
session required        pam_mkhomedir.so skel=/etc/skel/ umask=0022
session required        pam_limits.so
session required        pam_unix.so
session optional        pam_ldap.so



Tabla 2. subsistema NSSwitch, archivo /etc/nsswitch.conf
# /etc/nsswitch.conf
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd: compat ldap
group: compat ldap
shadow: compat ldap

hosts: files ldap dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: ldap nis

Tabla 3. orden de carga de esquemas para el servidor LDAP, sobre el fichero /etc/ldap/slapd.conf:
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/misc.schema
include         /etc/ldap/schema/authldap.schema
include         /etc/ldap/schema/exim4.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/samba.schema
el esquema exim4.schema lo cargué para hacer unas pruebas sobre el correo, pero no lo estamos usando en este momento, podría eliminarse; si hay algún problema con la carga de los esquemas (faltan ficheros, se carga en otro orden, etc, el servidor slapd no arranca ...

- ejemplo de búsqueda con ldapsearch
ldapsearch -x cn=carlos -LLL
- ejemplo de modificación con ldapmodify y un fichero ldif de modificaciones:
ldapmodify -D "cn=manager,dc=ldap,dc=example,dc=com" -x -W -f mail.ldif
donde mail.ldif contiene:
dn: uid=carlos,ou=usuarios,dc=ldap,dc=example,dc=com
changetype: modify
replace: mail
mail:carlos@example.com

- ejemplo de copia y restauración de la base de datos LDAP completa
# slapcat -l todo_ldap.ldif
... modificaciones pertinentes al fichero antes de la carga ...
# slapadd -l todo_ldap.ldif

- ejemplos de lectura de datos LDAP desde bash para su uso en shell scripts
export email=`ldapsearch -x cn=carlos mail -LLL|grep 'mail:'|cut -f2 -d' '`

- stablecer el password de la usuaria fgonzalez a 'passguord' (hay que poner el dn: del usuario que se modifica entero, tal como lo saca ldapsearch sin 'dn:'):
# ldappasswd -xvWD "cn=manager,dc=example,dc=com" -s passguord "uid=fgonzalez,ou=usuarios,dc=example,dc=com"

Enter LDAP Password: (aquí te pide el del manager de ldap)
ldap_initialize( <DEFAULT> )
Result: Success (0)


- si queremos que se lo pida ala usuaria interactivamente:
# ldappasswd -xvWD "cn=manager,dc=example,dc=com" -S "uid=fgonzalez,ou=usuarios,dc=example,dc=com"

New password: (el nuevo de fgonzalez)
Re-enter new password: (otra vez)
Enter LDAP Password: (el del manager de ldap)
ldap_initialize( <DEFAULT> )
Result: Success (0)



- añadir usuarias desde bash:
creamos el fichero crea_user.ldif con las siguientes líneas:
dn: uid=graso,ou=usuarios,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
givenName: Gregorio
sn: Raso
cn: graso
uid: graso
uidNumber: 10018
gidNumber: 10000
homeDirectory: /home/graso
loginShell: /bin/bash
userPassword: {CRYPT}6Ycc3R9YxCbnI
gecos: Gregorio Raso
description: Gregorio Raso
mail: graso@example.com
el valor de userPassword: lo he obtenido con:
# slappasswd -h {CRYPT} -v
New password: soygraso
Re-enter new password: soygraso
{CRYPT}6Ycc3R9YxCbnI

copiando lo que nos devuelve "{CRYPT}6Ycc3R9YxCbnI" y pegándolo en el campo userPassword: del fichero crea_user.ldif; y por fín añadimos la usuaria con:
# ldapmodify -axvWD "cn=manager,dc=example,dc=com" -f /home/manager/crea_user.ldif

   -a: añadir al árbol ldap (no es modificación)                   
   -x: autenticación simple (sin SSL, etc.)
   -v: verbose
   -W: pídeme el password del DN con que me autentifique 
   -D "dn": el dn: completo del usuario que hace la modificación o que añade (el manager de LDAP, generalmente)
   -f fichero: fichero donde escribo las modificaciones 


- cliente LDAP para samba (pendiente)