esquema - ldap
- arquitectura:
... mostrar campos description, homeDirectory y mail del registro cuyo cn=carlos (-LLL salida corta)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:
# 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
| 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;
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 ...
- esquemas para LDAP
- administración del servidor ldap:
- administración de los clientes ldap:
- instalación
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 ...
- (1) instalación servidor OpenLDAP
# 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.
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
instalación cliente ldap para cuentas GNU/Linux
subsistema PAM:
-- 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
-
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:
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:
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
- libpam-ldap ..... (apt): cambiar en /etc/pam_ldap.conf los valores:
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:
libpam-cracklib (apt; no se configuran archivos, lo usa common-password)
subsistema NSSwitch
nscd ............ (apt, config. en /etc/nscd.conf, no se configura, dejo el default)
libnss-ldap ...... apt; arranca el programa de configuracion, dentro de synaptic y pide: ip del servidor LDAP, base_del_dominio, versión ldap (3), modo 0600 (Si); usa /etc/libnss-ldap.conf lo ha modificado el programa de instalación con los valores que nos pedía; revisar BASE, rootbinddn, host, etc.
- libpam-dotfile ... apt; contiene pamtest para testear la autenticación
finalmente cambiar /etc/nsswitch.conf, para convertir el sistema en cliente ldap, según Tabla 2 - he tenido que recargar sshd (/etc/init.d/ssh reload) para que los usuarios ldap pudieran acceder con ssh
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:
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 ...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
- utilidades y ejemplos:
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- ejemplo de copia y restauración de la base de datos LDAP completa
donde mail.ldif contiene:
dn: uid=carlos,ou=usuarios,dc=ldap,dc=example,dc=com
changetype: modify
replace: mail
mail:carlos@example.com
# 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
# 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)