Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

Replicación Multi-Master LDAP + 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 {
     [email protected]
   }
   notification_email_from [email protected]
   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 {
     [email protected]
   }
   notification_email_from [email protected]
   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

Autor: Kr0m -- 23/10/2014 22:10:36