==== Replicação LDAP utilizando SyncRepl ====
O Syncrepl é o método atualmente utilizado e único disponível a partir da série 2.4 do OpenLDAP. Trata-se de um módulo do próprio "slapd" e não há necessidade de ativar mais um serviço a parte. O Syncrepl é basicamente um sistema de replicação que é ativado e controlado pelo "Servidor Secundário", ou seja, a responsabilidade de manter a replicação fica no cliente e não no servidor. A vantagem imediata deste método é não ter que reiniciar o "Servidor Mestre" sempre que se vai adicionar uma réplica ao ambiente.
Outro aspecto importante é o fato de que se a conexão entre o "Servidor Master" e o "Servidor Secundário" for interrompida por algum tempo e depois restaurada, a sincronização será feita automaticamente, sem a necessidade de intervenção manual.
Dois métodos de replicação estão disponíveis no "syncrepl":
* pull-based - Neste método o "Servidor Secundário", após a primeira sincronização, monitora o "Servidor Mestre" de tempos em tempos, comparando as duas bases e atualizando às informações que foram modificadas. Este tempo é configurável. Este método é ativado definindo a opção "type"da configuração como "refreshOnly".
* push-based - Neste método o "Servidor Secundário", após a primeira sincroni zação, mantém uma conexão persistente com o "Servidor Mestre". Assim qualquer alteração é sincronizada imediatamente. Este método é ativado definindo a opção "type" da configuração como "refreshAndPersist". Os dois métodos são extremamente eficientes porque utilizam um sistema de controle que informa apenas os campos que foram alterados, não sendo necessário trafegar a base completa do "Servidor Mestre" para o "Servidor Secundário". Todas as alterações feitas, sejam no "Servidor Master", seja no "Servidor Secundário" são armazenados, originalmente em memória, usando para isso um "log". Este log é volátil e não pode ser acessado diretamente.
==== Replicações Multi-Master ====
O OpenLDAP suporta replicações multimaster, em que dois ou mais servidores são capazes de atender requisições de leitura e gravação, mantendo suas bases sincronizadas. Esse cenário traz consigo vantagens e desvantagens:
Aspectos positivos:
1. Se qualquer um dos servidores cair, outro aceitará as alterações que forem feitas;
2. Evita ter um único ponto de falhas;
3. Os servidores podem ficar em pontos físicos diferentes, separados numa rede global, por exemplo;
4. Bastante útil como técnica anti-falhas ou alta-disponibilidade;
Aspectos negativos:
1. Rompe a garantia de consistência de informações do modelo de diretórios definido pelo X.500;
2. É fundamental manter uma sincronização de data e hora extremamente confiável;
3. Os servidores não saberão distinguir entre um problema físico no outro servidor ou uma perda de conexão;
* É interessante perceber que os servidores possuem configurações de Master e de Slave ao mesmo tempo.
==== Configurando os servidores ====
Os nomes e endereços IP dos servidores seguem abaixo:
Servidor 1:
* Nome: ldapmaster01.laboratorio.com.br
* Endereço IP: 192.0.2.110
Servidor 2:
* Nome: ldapmaster02.laboratorio.com.br
* Endereço IP: 192.0.2.111
Estas alterações são necessárias para que o modo Multi-Master funcione:
1. Deve-se utilizar um usuário próprio para a realização de replicações. O usuário "cn=admin" não deve ser utilizado por questões de segurança.
==== Executar na máquina LDAP Master 01 ====
Criando o usuário:
# slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}pabtcG7Afa1n3+YfQgXeSVpd8ruaVvdX
# cat replication_user.ldif
dn: cn=Replicator,dc=laboratorio,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: Replicator
description: LDAP Replicator
userPassword: {SSHA}pabtcG7Afa1n3+YfQgXeSVpd8ruaVvdX
# ldapadd -ZZ -w senha -x -D cn=admin,dc=laboratorio,dc=com,dc=br -f replication_user.ldif
adding new entry "cn=Replicator,dc=laboratorio,dc=com,dc=br"
O próximo passo é carregar o modulo syncprov á base cn=config
# cat replication_module_syncprov.ldif
dn: cn=module{0},cn=config
add: olcModuleLoad
olcModuleLoad: syncprov
# ldapmodify -ZZ -D cn=admin,cn=config -w senha -f replication_module_syncprov.ldif
modifying entry "cn=module{0},cn=config"
Agora que carregamos o módulo a base, precisamos setar as configurações de replicação adicionando o overlay:
# cat replication_overlay_syncprov.ldif
dn: olcOverlay={0}syncprov,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectclass: olcConfig
objectClass: top
objectClass: olcsyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
# ldapadd -ZZ -D cn=admin,cn=config -w senha -f replication_overlay_syncprov.ldif
adding new entry "olcOverlay=syncprov,olcDatabase={1}hdb,cn=config"
adding new entry "olcOverlay=syncprov,olcDatabase={0}config,cn=config"
Para que a replicação fique mais rápida o ideal é indexarmos os atributos entryU- UID e entryCSN que é utilizado pelo syncrepl para a checagem de alterações.
# cat replication_indexes.ldif
dn: olcdatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcdbIndex: entryUUID,entryCSN eq
# ldapmodify -ZZ -D cn=admin,cn=config -w senha -f replication_indexes.ldif
modifying entry "olcdatabase={1}hdb,cn=config"
Precisamos criar uma ACL para que o usuário Replicator possa ler os atributos userPassword e shadowLastChange necessários para a replicação.
# cat replication_user_acl.ldif
dn: olcDatabase={1}hdb,cn=config
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=laboratorio,dc=com,dc=br" write by dn="cn=Replicator,dc=laboratorio,dc=com,dc=br" read by * none
-
add: olcAccess
olcAccess: {1}to dn.base="" by * read
-
add: olcAccess
olcAccess: {2} to * by self write by dn="cn=admin,dc=laboratorio,dc=com,dc=br" write by * read
# ldapmodify -ZZ -D cn=admin,cn=config -w senha -f replication_user_acl.ldif
modifying entry "olcDatabase={1}hdb,cn=config"
Para terminar crie a configuração dos servidores envolvidos na replicação:
# cat ldap_master_master.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldap://ldapmaster01.laboratorio.com.br
olcServerID: 2 ldap://ldapmaster02.laboratorio.com.br
dn: olcdatabase={1}hdb,cn=config
changetype: modify
replace: olcsyncRepl
olcsyncrepl: rid=001 provider=ldap://ldapmaster01.laboratorio.com.br type=refreshAndPersist interval=00:00:00:10 searchbase=dc=laboratorio,dc=com,dc=br filter="(objectClass=*)" scope=sub attrs="*" schemachecking=off bindmethod=simple starttls=yes tls_cacert=/etc/ldap/tls/cacert.pem binddn=cn=Replicator,dc=laboratorio,dc=com,dc=br credentials=senha retry="10 +"
olcsyncrepl: rid=002 provider=ldap://ldapmaster02.laboratorio.com.br type=refreshAndPersist interval=00:00:00:10 searchbase=dc=laboratorio,dc=com,dc=br filter="(objectClass=*)" scope=sub attrs="*" schemachecking=off bindmethod=simple starttls=yes tls_cacert=/etc/ldap/tls/cacert.pem binddn=cn=Replicator,dc=laboratorio,dc=com,dc=br credentials=senha retry="10 +"
-
add: olcMirrorMode
olcMirrorMode: TRUE
# ldapmodify -ZZ -D cn=admin,cn=config -w senha -f ldap_master_master.ldif
modifying entry "cn=config"
modifying entry "olcdatabase={1}hdb,cn=config"
==== Executar na máquina LDAP Master 02 ====
# apt-get install slapd ldap-utils
Antes de continuar vamos criar um certificado para o servidor 2. Como já criamos uma agência certificado no cervidor 1 [[ativando-tls|Ativando TLS]], vamos usar ela para assinar o sertificado do servidor 2.
Para isso vamos alternar para o servidor 1.
# cd /etc/ldap/tls/
# openssl req -new -nodes -keyout srvkey02.key -out newreq02.pem
Generating a 2048 bit RSA private key
.............................................................+++
...........+++
writing new private key to 'srvkey02.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Para
Locality Name (eg, city) []:Belem
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Laboratorio Ltda.
Organizational Unit Name (eg, section) []:TI
Common Name (e.g. server FQDN or YOUR name) []:ldapmaster02.laboratorio.com.br
Email Address []:webmaster@laboratorio.com.br
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:senha
An optional company name []:Signatures Co.
# openssl x509 -req -in newreq02.pem -CAkey demoCA/private/cakey.pem -CA demoCA/cacert.pem -out srvcert02.pem -CAserial demoCA/serial
Signature ok
subject=/C=BR/ST=Para/L=Belem/O=Laboratorio Ltda./OU=TI/CN=ldapmaster02.laboratorio.com.br/emailAddress=webmaster@laboratorio.com.br
Getting CA Private Key
Enter pass phrase for demoCA/private/cakey.pem: senha
A configuração de replicação é idêntica a que fizemos no servidor 1, para não ficarmos fazendo tudo novamente vamos somente copiar os arquivos do outro servidor e aplicar neste:
# scp -r 192.0.2.110:/etc/ldap/ldif /etc/ldap/
# mkdir /etc/ldap/tls
# scp -r 192.0.2.110:/etc/ldap/tls/{cacert.pem,srvkey02.key,srvcert02.pem} /etc/ldap/tls/
# cd /etc/ldap/tls/
# mv srvcert02.pem srvcert.pem
# mv srvkey02.key srvkey.key
Configure o cliente LDAP na máquina
# cat /etc/ldap/ldap.conf
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
BASE dc=laboratorio,dc=com,dc=br
URI ldap://ldapmaster02.laboratorio.com.br
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for GnuTLS)
#TLS_CACERT /etc/ssl/certs/ca-certificates.crt
TLS_CACERT /etc/ldap/tls/cacert.pem
Definindo uma senha para o superusuário da base cn=config:
# slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}uzXYGAPQeCxWK/y7O8ncdZCcqgHBhmIg
# cat admin.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}uzXYGAPQeCxWK/y7O8ncdZCcqgHBhmIg
# ldapadd -H ldapi:/// -Y EXTERNAL -f admin.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
Agora vamos realizar os comandos para adicionar as informações a base:
# cd /etc/ldap/ldif/
# ldapadd -c -w senha -x -D cn=admin,dc=laboratorio,dc=com,dc=br -f replication_user.ldif
adding new entry "cn=Replicator,dc=laboratorio,dc=com,dc=br"
# ldapmodify -x -D cn=admin,cn=config -w senha -f replication_module_syncprov.ldif
modifying entry "cn=module{0},cn=config"
# ldapadd -x -D cn=admin,cn=config -w senha -f replication_overlay_syncprov.ldif
adding new entry "olcOverlay=syncprov,olcDatabase={1}hdb,cn=config"
adding new entry "olcOverlay=syncprov,olcDatabase={0}config,cn=config"
# ldapmodify -x -D cn=admin,cn=config -w senha -f replication_indexes.ldif
modifying entry "olcdatabase={1}hdb,cn=config"
# ldapmodify -x -D cn=admin,cn=config -w senha -f replication_user_acl.ldif
modifying entry "olcDatabase={1}hdb,cn=config"
# ldapmodify -x -D cn=admin,cn=config -w senha -f tls.ldif
modifying entry "cn=config"
# ldapmodify -x -D cn=admin,cn=config -w senha -f ssf.ldif
modifying entry "olcDatabase={1}hdb,cn=config"
# ldapmodify -x -D cn=admin,cn=config -w senha -f ldap_master_master.ldif
modifying entry "cn=config"
modifying entry "olcdatabase={1}hdb,cn=config"
Reinicie o LDAP do servidor ldapmatriz01 e ldapmatriz02 e veja que nossa base já está populada.
# ldapsearch -x -LLL -ZZ -b dc=laboratorio,dc=com,dc=br
==== Testando a Replicação ====
Para testar a Replicação no servidor ldapmatriz02, pare o servidor, remova a base e inicie o servidor novamente.
# service slapd stop
# rm -rf /var/lib/ldap/*
# service slapd start
# ldapsearch -x -LLL -ZZ -b dc=laboratorio,dc=com,dc=br