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”:
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;
Os nomes e endereços IP dos servidores seguem abaixo: Servidor 1:
Servidor 2:
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.
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"
# 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, 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
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