Servei LDAP amb master + read-only slaves

Objectiu:

Aquest tutorial explica com instal·lar i configurar un servidor ldap mestre (amb possibilitat d’escriptura) i esclaus només de lectura. LDAP és un protocol destinat a rebre moltes peticions d’informació (lectures) i poques, en comparació d’escriptura.

Fa un parell d’anys ja es va explicar en aquest blog com instal·lar un servei LDAP de manera simple. Aquesta guia serveix d’actualització de l’antiga entrada (pel tema de la configuració amb el mètode cn=config) alhora que s’amplia amb la configuració dels esclaus.

Què és un servei de directori?

Un servei de directori és, en el fons, una base de dades. Les dades que emmagatzema poden anar des de les dades personals dels usuaris fins a la informació relativa d’inicis de sessió, carpetes de correu, àlies, serveis associats, etcètera.

Cada cop que un usuari accedeix a un servei de l’organització que necessita d’autenticació el servei LDAP valida el nom d’usuari i la contrasenya. Un servei LDAP és molt senzill de configurar, però pot donar mals de cap a l’hora de mantenir-lo si no es planifica correctament de bon principi.

La intenció doncs d’aquesta guia es disposar d’un servidor LDAP mestre i servidors esclaus que agafin les modificacions que es facin en el principal. Les modificacions només estaran permeses al servidor principal. D’altra banda, els clients només accediran als esclaus per fer consultes. En una propera entrada s’explicarà com afegir alta disponibilitat sobre els esclaus per que l’usuari no s’adoni mai si un d’aquests falla. Es poden anar afegint esclaus a mesura que la demanda augmenti controlats per un distribuïdor de carrega com ara LVS.

CONFIGURACIÓ DEL SERVIDOR MESTRE:

Obtenció del programari:

Partim de la base que disposem d’un servidor Debian Squeeze (6.0). Per començar, i com a bona pràctica abans d’instal·lar res, actualitzem les fonts de programari.

$ apt-get update

Per instal·lar el paquet de l’OpenLDAP executarem la següent comanda:

$ apt-get install slapd ldap-utils

Durant la primera instal·lació se’ns demanarà una nova contrasenya per l’usuari administrador del directori. La canviarem després, en qualsevol cas entrarem segons ens convingui:

  • Admin password: secret
  • Confirm password: secret

Els arxius de configuració d’OpenLDAP versió 2.4 es troben a la carpeta /etc/ldap/slapd.d. La configuració ha canviat respecte a versions anteriors. Ara tota la informació de la configuració es realitza mitjançant arxius LDIF cosa que permet la modificació de paràmetres de configuració en temps real sense haver de reiniciar el servei tal i com passava abans.

Configuració:

La configuració inicial que realitza Debian agafa per defecte el domini associat a la màquina i, a partir d’aquest, crea la base pel directori. Tot i que sembla una bona decisió pot no ser sempre la correcta. El que farem es eliminar tot el que Debian ha fet i crear-ho de nou segons les nostres necessitats.

Per començar aturem el servei:

$ /etc/init.d/slapd stop

Anem al directori on s’emmagatzema la base de dades de l’ldap i esborrem tota la informació actual:

$ cd /var/lib/ldap
$ rm __db.* *.bdb log.* -f

En aquesta carpeta quedaran només els arxius alock i DB_CONFIG.

A continuació podem generar la nova contrasenya que assignarem a l’usuari administrador del directori:

$ slappasswd -s contrasenya
{SSHA}+gc03jKI1W/Kh8EexCvs/N+6v4Oivd34

Anem a la carpeta /etc/ldap/slapd.d/cn=config i modifiquem l’arxiu olcDatabase={1}hdb.ldif:

$ cd /etc/ldap/slapd.d/cn\=config/
$ pico olcDatabase\=\{1\}hdb.ldif

Les dades que modificarem són totes les referències a dc=domini,dc=tld pel nou domini que vulguem crear. Per exemple les dades rellevants (en negreta) serien:

dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=domini,dc=tld
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,domini,dc=tld" write by * none
olcAccess: {1}to * by self write by dn="cn=admin,domini,dc=tld" write by users read by * none
olcLastMod: TRUE
olcRootDN: cn=admin,domini,dc=tld
olcRootPW: {SSHA}+gc03jKI1W/Kh8EexCvs/N+6v4Oivd34
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: uidNumber,objectClass eq
olcDbIndex: uid,mail eq,sub
olcDbIndex: entryCSN,entryUUID eq
structuralObjectClass: olcHdbConfig
entryUUID: 3fbae2a8-c8af-102f-9f7c-19ea6a03c941
creatorsName: cn=admin,cn=config
createTimestamp: 20110209154439Z
entryCSN: 20110209154439.444510Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20110209154439Z

Ja podem tornar a iniciar el servei:

$ /etc/init.d/slapd start

Amb això podem donar per configurat el servidor mestre. En aquest punt podem afegir els primers elements al directori. El primer que crearem és la DN Base. Per això creem un arxiu (base.ldif, per exemple) amb els següent contingut:

dn: dc=domini,dc=tld
description: domini.tld, El meu domini LDAP
dc: domini
o: La meva empresa
objectClass: top
objectClass: dcObject
objectClass: organization

A continuació l’afegim al directori:

$ ldapadd -h localhost -xWD 'cn=admin,dc=domini,dc=tld' -f base.ldif

CONFIGURACIÓ DELS ESCLAUS:

Els esclaus no deixen de ser serveis LDAP tradicionals però que agafen la informació que s’ha modificat en el servidor mestre a intervals regulars (mode pull) o aquest els hi envia tant aviat la modificació es fa efectiva (mode push).

El procediment de configuració és el mateix en tots els esclaus que vulguem configurar. Primer instal·lem el paquet del servidor OpenLDAP i les utilitats d’ldap:

$ apt-get install slapd ldap-utils

Un cop respostes les preguntes de Debian eliminarem tota la configuració creada i la base de dades associada:

$ /etc/init.d/slapd stop
$ cd /var/lib/ldap/
$ rm -f *db* *.bdb log.*

A continuació podem començar a modificar la configuració per establir el mode de replicació:

$ cd /etc/ldap/slapd.d/
$ pico cn\=config.ldif

En aquest arxiu canviem l’entrada olcLogLevel: none a olcLogLevel: stats. Això ens donarà força informació al syslog per detectar errors. En un servidor en producció s’hauria d’optar pel nivell none ja que el registre de missatges pot arribar a consumir força recursos.

El següent arxiu a modificar és /etc/ldap/slapd.d/cn=config/cn=module{0}.ldif. Afegirem la següent línia per carregar el mòdul de replicació:

olcModuleLoad: {1}syncprov

Finalment només queda modificar l’arxiu /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif. El contingut hauria de ser similar (adaptat a la nostra situació, és clar) al següent:

dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=domini,dc=tld
olcAccess: {0}to attrs=userPassword,shadowLastChange by anonymous auth by self read by * none
olcAccess: {1}to * by users read by * none
olcLastMod: TRUE
olcRootDN: cn=admin,dc=domini,dc=tld
olcSyncrepl: rid=001 provider=ldap://master.domini.tld type=refreshAndPersist interval=00:00:01:00 searchbase="dc=domini,dc=tld" binddn="uid=syncrepl,ou=system,dc=domini,dc=tld" credentiadentials=secret bindmethod=simple retry="60 +"
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: uidNumber,objectClass eq
olcDbIndex: uid,mail eq,sub
olcDbIndex: entryCSN,entryUUID eq
structuralObjectClass: olcHdbConfig
entryUUID: dd16e2f0-c99e-102f-9f2a-715c6e2389d1
creatorsName: cn=admin,cn=config
createTimestamp: 20110210201953Z
entryCSN: 20110210201953.168114Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20110210201953Z

Aquesta configuració utilitza el mode pull (refreshAndPersist).

Si iniciem el servidor no funcionarà res ja que queden uns detalls a configurar al mestre. D’entrada s’ha d’indicar-li que hi haurà màquines que li sol·licitaran informació. També s’ha de crear l’usuari syncrepl que accedeix al servidor mestre i donar-li els permisos adients.

CONFIGURACIÓ DEL SERVIDOR MESTRE (segona part)

El primer arxiu a modificar és: /etc/ldap/slapd.d/cn=config/cn=module{0}.ldif. Afegirem la següent línia per carregar el mòdul de replicació:

olcModuleLoad: {1}syncprov

A l’arxiu /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif afegirem les següents línies (una per cada esclau que vulguem afegir):

olcAccess: {0}to * by dn="uid=syncrepl,ou=system,dc=domini,dc=tld" peername.ip=ip_remota_1 read by * none break
olcAccess: {1}to * by dn="uid=syncrepl,ou=system,dc=domini,dc=tld" peername.ip=ip_remota_2 read by * none break

A la carpeta /etc/ldap/slapd.d/cn=config crearem una nova subcarpeta:

$ mkdir /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb

i crearem un nou arxiu a l’interior:

$ pico olcOverlay\=\{0\}syncprov.ldif

amb el següent contingut:

dn: olcOverlay={0}syncprov
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 50 10
olcSpSessionlog: 100
olcSpNoPresent: TRUE
structuralObjectClass: olcSyncProvConfig
entryUUID: 4840ca4e-ca1e-102f-8dac-cd94504a3460
creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
createTimestamp: 20110211113159Z
entryCSN: 20110211113159.043586Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20110211113159Z

Finalment afegim al directori l’usuari syncrepl. L’LDIF amb les dades mínimes és el següent:

dn: ou=system,dc=domini,dc=tld
objectClass: organizationalUnit
objectClass: top
ou: system

dn: uid=syncrepl,ou=system,dc=domini,dc=tld
objectClass: simpleSecurityObject
objectClass: top
objectClass: account
uid: syncrepl
userPassword:: e1NTSEF9UlNzenNsMFRfejYgbTdZall0TUM3MndxRzdOaGlYYVFFTTFlaFE9Ps==
uid: syncrepl

La contrasenya s’ha generat amb l’utilitat slappasswd.

POSADA EN FUNCIONAMENT

En aquest punt ja podem posar en funcionament tots els serveis (o reiniciar-los). Els esclaus haurien de disposar immediatament de la rèplica del directori mestre i s’hi podrien fer consultes normalment.

Com a nota final, s’ha de tenir en compte que els esclaus no son proxys, sinó que disposen de la còpia sencera en disc local de la part del directori sol·licitada al servidor mestre. Això vol dir que en un moment donat, si el mestre caigués, aquests podrien seguir donant resposta a peticions sense problemes. En mode proxy si el servidor mestre cau el punt intermig no sap que retornar.