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.