Replicar el servicio ldap del servidor "ldap" en el servidor "servidor" | Algo de Linux

jueves, 24 de abril de 2014

Replicar el servicio ldap del servidor "ldap" en el servidor "servidor"

Como ya comenté en un post anterior, repliqué el servicio ldap del servidor "ldap" en el servidor "servidor" de mi centro, configuré el dhcp en modo failover y monté el servidor dns replicado en el servidor "servidor" para lograr una mayor seguridad y una alta disponibilidad de servicios.

Como la base de todos estos cambios está en crear una réplica del servidor "ldap" (ldap master) en el servidor "servidor" (ldap slave), vamos a ver qué cambios hay que realizar para replicar el servicio mediante syncrepl.

Configuración del ldap master (servidor "ldap"):
Lo primero que tenéis que hacer es aseguraros de que tenéis las siguientes líneas en el fichero de configuración /etc/ldap/slapd.conf del ldap master:

moduleload syncprov
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 200
Estas líneas convierten el servidor ldap en un proveedor.

Por otra parte, aseguraos de que entre las opciones de indexado de la B.D. existe la siguiente:
index           entryCSN,entryUUID eq

Y que entre las reglas de acceso a los atributos restringidos, hay permiso de lectura para el usuario replica, un usuario que usamos única y exclusivamente para esta tarea:
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" write
        by dn="cn=replica,dc=instituto,dc=extremadura,dc=es" read
        by anonymous auth
        by self =xw
        by * none

access to attrs=employeeNumber,jpegPhoto
        by dn="cn=replica,dc=instituto,dc=extremadura,dc=es" read
        by dn="cn=interno,dc=instituto,dc=extremadura,dc=es" read
        by self read

Configuración del ldap slave (servidor "servidor"):
En el servidor ldap, lo primero que habrá que hacer es instalar los paquetes slapd, ldap-utils y phpldapadmin.

Una vez instalados los paquetes, vamos a necesitar tener la misma configuración que en el otro servidor, así que lo mejor que podemos hacer es copiar el archivo slapd.conf y el directorio schema desde el servidor "ldap" al servidor "servidor". Así nos aseguramos de que tenemos la misma configuración y los mismos esquemas.

Bien, pues una vez hecho ésto, editamos el archivo /etc/ldap/slapd.conf y le añadimos las siguientes líneas:

syncrepl rid=1
        provider=ldap://ldap
        searchbase="dc=instituto,dc=extremadura,dc=es"
        type=refreshOnly
        interval=00:00:02:00
        retry="60 10 300 +"
        filter="(objectClass=*)"
        scope=sub
        attrs="*,+"
        sizelimit=unlimited
        timelimit=unlimited
        schemachecking=off
        bindmethod=simple
        starttls=yes
        tls_reqcert=never
        binddn="cn=replica,dc=instituto,dc=extremadura,dc=es"
        credentials=clave-del-usuario-replica
updateref       ldap://ldap

Con ésto, lograremos que el ldap slave replique la B.D. del ldap master.

No voy a entrar en detalle sobre todos los parámetros. Todos son importantes, pero tan sólo contaremos los principales:

  • syncrepl rid=1 Identificamos la réplica. Por lo que he leído, cada réplica debe llevar un número diferente.
  • provider=ldap://ldap Indicamos quién es el proveedor del que se va a obtener la B.D.
  • searchbase="dc=insituto,dc=extremadura,dc=es" Nos permite indicar la raiz desde donde realizar búsqueda para hacer la réplica.
  • type=refreshOnly Con esta opción le decimos al ldap slave que realice la réplica y no vuelva a realizarla hasta que pase un intervalo de tiempo especificadon mediante el parámetro interval
  • interval=00:00:02:00 Esta opción se usa conjuntamente con el tipo de sincronización refreshOnly para que vuelva a realizarse una sincronización tras el intervalo de tiempo especificado en formato dias:horas:minutos:segundos. En este caso, estamos diciendo que vuelva a realizar la sincronización cada 2 minutos.
  • retry="60 10 300 +" Si se produce algún error durante el proceso de réplica, el consumidor intentará reconectar con el servidor de acuerdo con los parámetros especificados en la lista. Ésta es una lista de pares. En el ejemplo mostrado, el consumidor reintentará realizar la sincronización cada 60 segundos las 10 primeras veces. Transcurridos estos intentos, tratará de realizar la sincronización cada 300 segundos de forma indefinida (ésto es lo que significa el signo +)
  • binddn="cn=replica,dc=instituto,dc=extremadura,dc=es" nos permite indicar con qué usuario se debe realizar la operación de sincronización.
  • credentials=clave-del-usuario-replica nos permite indicar la clave del usuario con el que se realiza la operación de sincronización.
Bien, pues ahora que ya hemos configurado el archivo /etc/ldap/slapd.conf, establecemos el propietario y grupo del directorio /var/lib/ldap a openldap:openldap

# chown -R openldap:openldap /var/lib/ldap

Por último, reiniciamos los servicios ldap de ambos servidores y comprobamos que los cambios del master se han replicado en el slave.

Publicado por primera vez en http://enavas.blogspot.com.es

1 comentario:

César dijo...


Hola paisano!
Tengo una duda que creo que la tengo clara, pero la quiero tener más clara.

Te explico mi escenario:

Tengo un servidor Master LDAP (lo llamo A) y estoy construyendo dos servidores más (B y C)

B y C se replican entre sí modo RW, pero además B se replica con A en modo lectura y C también con A en modo lectura. Es decir,
los cambios que se hagan en B y C no se deben replicar en A.
He hecho pruebas y parece que funciona bien pero antes de ir a producción y cargármelo todo quería estar seguro.

Según la documentación de LDAP, la configuración de B y C sería algo tal que asi

Servidor B:

syncrepl rid=X
provider=ldaps://C
type=refreshAndPersist
retry="5 12 60 +"
searchbase="dc=Prod,dc=EXTREMADURA"
attrs="*,+"
exattrs="accountPassword"
bindmethod=simple
binddn=""
credentials=password
tls_cert=/etc/openldap/ssl/b.crt
tls_key=/etc/openldap/ssl/b.key
tls_cacert=/etc/openldap/ssl/ca.crt
tls_reqcert=demand

syncrepl rid=X
provider=ldaps://A
type=refreshAndPersist
retry="5 12 60 +"
searchbase="dc=Prod,dc=EXTREMADURA"
attrs="*,+"
exattrs="accountPassword"
bindmethod=simple
binddn=""
credentials=password
tls_cert=/etc/openldap/ssl/b.crt
tls_key=/etc/openldap/ssl/b.key
tls_cacert=/etc/openldap/ssl/ca.crt
tls_reqcert=demand

Servidor C:

syncrepl rid=X
provider=ldaps://B
type=refreshAndPersist
retry="5 12 60 +"
searchbase="dc=Prod,dc=EXTREMADURA"
attrs="*,+"
exattrs="accountPassword"
bindmethod=simple
binddn=""
credentials=password
tls_cert=/etc/openldap/ssl/c.crt
tls_key=/etc/openldap/ssl/c.key
tls_cacert=/etc/openldap/ssl/ca.crt
tls_reqcert=demand

syncrepl rid=X
provider=ldaps://A
type=refreshAndPersist
retry="5 12 60 +"
searchbase="dc=Prod,dc=EXTREMADURA"
attrs="*,+"
exattrs="accountPassword"
bindmethod=simple
binddn=""
credentials=password
tls_cert=/etc/openldap/ssl/c.crt
tls_key=/etc/openldap/ssl/c.key
tls_cacert=/etc/openldap/ssl/ca.crt
tls_reqcert=demand

Es correcto?
Entiendo que en el servidor A no tengo que aniadir nada porque es simplemente el proveedor y no el consumidor. Si aniadiese algo,
lo haríamos también RW , cierto?

Gracias por el post. Es bastante útil!