Anteriormente se explicó como montar un servidor LDAP, pero este escenario no nos proporcionaba ni redundancia de datos ni alta disponibilidad, para solventar estos problemas montaremos LDAP en modo multi-master y se servirá dicho servicio mediante un VIP con keepalive, de este modo los datos se replicarán de un LDAP al otro de forma automática independientemente del servidor que reciba la orden.
Cuando el primer servidor caiga la VIP migrará de forma automática al otro server sin que los usuarios se percaten de nada de lo ocurrido, la única limitación de este sistema es que los dos servidores deben estar en el mismo segmento de red ya que es una necesidad del VRRP y por lo tanto de keepalive.
SERVER ORIGINAL
Generamos el password para el usuario de replicación:
Insertamos los datos del usuario:
dn: cn=syncuser,dc=alfaexploit,dc=com
changetype: add
objectClass: top
objectClass: person
cn: syncuser
sn: syncuser
description: LDAP synchronisator
userPassword: {SSHA}XXXXXXXXXXXXXXXX
Configuramos LDAP para que replique datos con el usuario indicado:
moduleload syncprov
# Give syncuser DN limitless searches
limits dn.exact="cn=syncuser,dc=alfaexploit,dc=com" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
access to * by dn="cn=syncuser,dc=alfaexploit,dc=com" read by * read
# LDAP Sync - Master
serverID 1
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
# LDAP Sync - Slave
syncrepl rid=001 provider=ldap://192.168.40.141 bindmethod=simple binddn="cn=syncuser,dc=alfaexploit,dc=com" credentials=XXXXXX searchbase="dc=alfaexploit,dc=com" filter="(objectClass=*)" attrs="*" schemachecking=on type=refreshAndPersist interval=00:00:00:30 retry="60 +"
mirrormode on
Reiniciamos el servicio:
SERVER NUEVO
Primero lo montamos con una config idéntica al server 1 sin replicación y comprobamos que todo funciona correctamente.
Configuramos LDAP para que replique datos con el usuario indicado:
moduleload syncprov
# Give syncuser DN limitless searches
limits dn.exact="cn=syncuser,dc=alfaexploit,dc=com" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
access to * by dn="cn=syncuser,dc=alfaexploit,dc=com" read by * read
# LDAP Sync - Master
serverID 2
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
# LDAP Sync - Slave
syncrepl rid=001 provider=ldap://192.168.40.189 bindmethod=simple binddn="cn=syncuser,dc=alfaexploit,dc=com" credentials=XXXXXX searchbase="dc=alfaexploit,dc=com" filter="(objectClass=*)" attrs="*" schemachecking=on type=refreshAndPersist interval=00:00:00:30 retry="60 +"
mirrormode on
Borramos la DB para que resincronice desde cero:
cd /var/lib/openldap-data/
cp DB_CONFIG /root/
rm *
cp /root/DB_CONFIG ./
chown ldap:ldap DB_CONFIG
/etc/init.d/slapd start
Los parámetros de configuración de la replicación son:
syncrepl rid=<replica ID>
provider=ldap[s]://<hostname>[:port]
[type=refreshOnly|refreshAndPersist]
[interval=dd:hh:mm:ss]
[retry=[<retry interval> <# of retries>]+]
searchbase=<base DN>
[filter=<filter str>]
[scope=sub|one|base]
[attrs=<attr list>]
[attrsonly]
[sizelimit=<limit>]
[timelimit=<limit>]
[schemachecking=on|off]
[bindmethod=simple|sasl]
[binddn=<DN>]
[saslmech=<mech>]
[authcid=<identity>]
[authzid=<identity>]
[credentials=<passwd>]
[realm=<realm>]
[secprops=<properties>]
[starttls=yes|critical]
[tls_cert=<file>]
[tls_key=<file>]
[tls_cacert=<file>]
[tls_cacertdir=<path>]
[tls_reqcert=never|allow|try|demand]
[tls_ciphersuite=<ciphers>]
[tls_crlcheck=none|peer|all]
[logbase=<base DN>]
[logfilter=<filter str>]
[syncdata=default|accesslog|changelog]
Comprobamos que se ha replicado el contenido del arbol:
shelldap --server 192.168.40.189 --binddn cn=Manager,dc=alfaexploit,dc=com
ls
shelldap --server 192.168.40.141 --binddn cn=Manager,dc=alfaexploit,dc=com
ls
Con esto ya tendríamos la replicación pero no la alta disponibilidad.
Instalamos y configuramos keepalive:
En el primer server:
! Configuration File for keepalived
global_defs {
notification_email {
sys@alfaexploit.com
}
notification_email_from ldap00@rack
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_MAIN_LDAP
}
vrrp_script chk_ldap {
script "killall -0 slapd"
interval 2 # check cada 2 segundos
weight 2 # anyade 2 puntos de prioridad si OK
}
vrrp_instance VI_LDAP_1 {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXXXXX
}
virtual_ipaddress {
AAA.BBB.CCC.DDD/MASK dev INTERFAZ
}
track_script {
chk_ldap
}
}
En el segundo:
! Configuration File for keepalived
global_defs {
notification_email {
sys@alfaexploit.com
}
notification_email_from ldap01@rack
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_MAIN_LDAP
}
vrrp_script chk_ldap {
script "killall -0 slapd"
interval 2
weight 2
}
vrrp_instance VI_LDAP_1 {
state BACKUP
interface eth0
virtual_router_id 10
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXXXXX
}
virtual_ipaddress {
AAA.BBB.CCC.DDD/MASK dev INTERFAZ
}
track_script {
chk_ldap
}
}
ADVERTENCIA: Tendremos que tener en cuenta varios aspectos para que todo esto funcione automágicamente hay que dejar el servicio configurado con las ips finales en el ldap(por defecto ldap se bindea a todas las interfaces disponibles), para poder bindear en el backup unas ips que no tiene hay que hacer pirulas:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.ip_nonlocal_bind=1
Arrancamos keepalive y lo añadimos al arranque:
rc-update add keepalived default
Los servicios que utilicen LDAP obviamente deberán ser configurados para que conecten contra la VIP.
NOTA: Si queréis conocer mas sobre keepalive podéis leer mas en este artículo anterior .
Si uno de los nodos casca NO basta con reengancharlo, hay que exportar el arbol LDAP, importarlo en el server estropeado y volver a dejarlo sincronizando.
MASTER:
SLAVE:
cp -rp /var/lib/openldap-data/ /var/lib/openldap-data_ori
cd /var/lib/openldap-data/
rm *
cp /var/lib/openldap-data_ori/DB_CONFIG /var/lib/openldap-data/
slapadd –v –l /root/backup_ldap.diff
chown ldap:ldap *
/etc/init.d/sldap start