Esta pagina se ve mejor con JavaScript habilitado

Replicación Multi-Master LDAP + Keepalive

 ·  🎃 kr0m

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:

slappasswd

Insertamos los datos del usuario:

vi sync_user.ldif

dn: cn=syncuser,dc=alfaexploit,dc=com
changetype: add
objectClass: top
objectClass: person
cn: syncuser
sn: syncuser
description: LDAP synchronisator
userPassword: {SSHA}XXXXXXXXXXXXXXXX
ldapadd -x -D “cn=Manager,dc=alfaexploit,dc=com” -W -f sync_user.ldif

Configuramos LDAP para que replique datos con el usuario indicado:

vi /etc/openldap/slapd.conf

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:

/etc/init.d/slapd restart


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:

vi /etc/openldap/slapd.conf

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:

/etc/init.d/slapd stop
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:

ssh SERVER1(192.168.40.189)
shelldap --server 192.168.40.189 --binddn cn=Manager,dc=alfaexploit,dc=com
ls

ssh SERVER2(192.168.40.141)
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:

emerge -av keepalived

En el primer server:

vi /etc/keepalived/keepalived.conf

! 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:

vi /etc/keepalived/keepalived.conf

! 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:

vi /etc/sysctl.conf
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
sysctl -p

Arrancamos keepalive y lo añadimos al arranque:

/etc/init.d/keepalived start
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:

slapcat -v -l backup_openldap.ldif

SLAVE:

/etc/init.d/sldap stop
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

Si te ha gustado el artículo puedes invitarme a un RedBull aquí