LDAP Linux Replication: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 78: Строка 78:
   
 
LDAPTLS_REQCERT=never ldapsearch -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap2 '(objectclass=*)'
 
LDAPTLS_REQCERT=never ldapsearch -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap2 '(objectclass=*)'
  +
</PRE>
  +
  +
==HAProxy Config==
  +
Это тестовая версия и требуется оптимизация
  +
<PRE>
  +
  +
global
  +
log /dev/log local0
  +
log /dev/log local1 notice
  +
chroot /var/lib/haproxy
  +
stats socket /run/haproxy/admin.sock mode 660 level admin
  +
stats timeout 30s
  +
user haproxy
  +
group haproxy
  +
  +
ca-base /etc/ssl/certs
  +
crt-base /etc/ssl/private
  +
  +
ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
  +
  +
defaults
  +
log global
  +
mode tcp
  +
option dontlognull
  +
timeout connect 5000
  +
timeout client 50000
  +
timeout server 50000
  +
  +
backend ldaps_backend
  +
server ldap1 ldap1:636 check backup
  +
server ldap2 ldap2:636 check
  +
mode tcp
  +
balance first
  +
timeout server 2s
  +
timeout connect 1s
  +
  +
frontend ldaps_frontend
  +
mode tcp
  +
bind 10.20.0.100:636
  +
description LDAP Service
  +
timeout client 5s
  +
default_backend ldaps_backend
  +
option tcplog
  +
  +
listen stats :1936
  +
mode http
  +
stats enable
  +
stats hide-version
  +
stats realm Haproxy\ Statistics
  +
stats uri /
  +
stats auth root:r00tme
 
</PRE>
 
</PRE>
   

Версия 12:03, 30 мая 2016

ТУт заметки о репликации

Все действия выполняются на обоих серверах если не сказано другое

Важное замечание

Так как после настройки репликации сервера будут иметь на 100 процентов одинаковый конфиг и при этом используются сертефикаты с разными именами может возникнуть ситуация когда на одном из серверов в конфиге окажется настройка вида

olcTLSCertificateFile: /etc/ldap/ssl/ldap1.crt
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap1.key

при этом таких файлов не будет. Это возникнет когда на ldap2 реплецируются настройки с ldap1
Обратная ситуация так же возможна.
Что бы избежать этой ситуации можно

  • назвать файлы одинаково и изменить настойку TLS
  • сделать на обоих серверах символические ссылки
# ls -lsa /etc/ldap/ssl/
total 16
4 dr-x------ 2 openldap openldap 4096 May 26 13:57 .
4 drwxr-xr-x 6 root     root     4096 May 26 13:49 ..
4 -r-------- 1 openldap openldap 2199 May 26 10:30 ldap1.crt
4 -r-------- 1 openldap openldap 3247 May 26 10:30 ldap1.key
0 lrwxrwxrwx 1 root     root        9 May 26 13:57 ldap2.crt -> ldap1.crt
0 lrwxrwxrwx 1 root     root        9 May 26 13:57 ldap2.key -> ldap1.key
ldap2# ls -lsa /etc/ldap/ssl/
total 16
4 dr-x------ 2 openldap openldap 4096 May 26 13:57 .
4 drwxr-xr-x 6 root     root     4096 May 26 11:46 ..
0 lrwxrwxrwx 1 root     root        9 May 26 13:56 ldap1.crt -> ldap2.crt
0 lrwxrwxrwx 1 root     root        9 May 26 13:57 ldap1.key -> ldap2.key
4 -r-------- 1 openldap openldap 2199 May 26 11:33 ldap2.crt
4 -r-------- 1 openldap openldap 3243 May 26 11:33 ldap2.key

Если этого не сделать то репликация развалиться после того как эти записи будут синхронизированы и slapd не сможет стартовать с ошибкой

# /usr/sbin/slapd  -h "ldaps://ldap1 ldapi:///" -g openldap -u openldap -F /etc/ldap/slapd.d -4 -d 4

<SKIP>


5746fed2     2.5.13.0 (objectIdentifierMatch): 5746fed2 matchingRuleUse: ( 2.5.13.0 NAME 'objectIdentifierMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ supportedApplicationContext ) )
5746fed2 main: TLS init def ctx failed: -1
5746fed2 slapd destroy: freeing system resources.
5746fed2 syncinfo_free: rid=001
5746fed2 slapd stopped.
5746fed2 connections_destroy: nothing to destroy.
root@node-3:/etc/ldap# /usr/sbin/slapd  -h "ldaps://ldap1 ldapi:///" -g openldap -u openldap -F /etc/ldap/slapd.d -4 -d 2
5746fee7 @(#) $OpenLDAP: slapd  (Ubuntu) (Sep 15 2015 18:19:13) $
	buildd@lgw01-53:/build/openldap-2QUgtL/openldap-2.4.31/debian/build/servers/slapd
5746fee7 main: TLS init def ctx failed: -1
5746fee7 slapd stopped.
5746fee7 connections_destroy: nothing to destroy.


HA Mode

Так как используется HAProxy и IP (который перемещается на активную ноду) - то в конечном итоге лучше использовать один сертефикат и одно имя - 'ldap'
В моем примере есть 2 ноды

10.20.0.6       ldap2
10.20.0.3       ldap1
10.20.0.100     ldap

Адрес

10.20.0.100     ldap

Используется как адрес Load Balancer Потому в конечном итоге я перегенировал сертефикаты для имени ldap вместо ldap1 и ldap2 Потому если требуется запросить какой-то из серверов напрямую - то через переменные окружения надо передать LDAPTLS_REQCERT=never


LDAPTLS_REQCERT=never ldapsearch  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap2 '(objectclass=*)'

HAProxy Config

Это тестовая версия и требуется оптимизация


global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy

	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL

defaults
	log	global
	mode	tcp
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000

backend ldaps_backend
  server                ldap1 ldap1:636 check  backup
  server                ldap2 ldap2:636 check
  mode                  tcp
  balance               first
  timeout server        2s
  timeout connect       1s

frontend ldaps_frontend
  mode                  tcp
  bind                  10.20.0.100:636
  description           LDAP Service
  timeout client        5s
  default_backend       ldaps_backend
  option tcplog

listen stats :1936
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth root:r00tme

cn=config replication

Load Extention

  • Загрузить расширение
0001_loadSyncProvModule.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0001_loadSyncProvModule.ldif

Set Server ID

Разные ID на разных серверах

  • Server ID
    • ldap1 : 1
0003_setServerID.ldif
dn: cn=config
changeType: modify
add: olcServerID
olcServerID: 1
    • ldap2: 2
0003_setServerID.ldif
dn: cn=config
changeType: modify
add: olcServerID
olcServerID: 2
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0003_setServerID.ldif

Set credentials

  • Root DN and Root PW
0004_setConfigDB_rootDN
dn: olcDatabase={0}config,cn=config
changeType: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config


0004_setConfigDB_rootPW
dn: olcDatabase={0}config,cn=config
changeType: modify
add: olcRootPW
olcRootPW: r00tme
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0004_setConfigDB_rootPW
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0004_setConfigDB_rootDN

Add ServerID

ldaps - по тому что шифрование но нужно ли это?


0006_addConfigReplication.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldaps://ldap1
olcServerID: 2 ldaps://ldap2
ldapmodify  -Y EXTERNAL  -H ldapi:// <0006_addConfigReplication.ldif

Add Overlay

<0007_addSyncProv.ldif
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
ldapmodify  -Y EXTERNAL  -H ldapi:// <0007_addSyncProv.ldif

Replica Config

0008_addSyncRepl.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldaps://ldap1  binddn="cn=admin,cn=config" bindmethod=simple credentials=r00tme searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5"       timeout=1 tls_reqcert=allow tls_cacert=/etc/ssl/certs/rootca.crt
olcSyncRepl: rid=002 provider=ldaps://ldap2  binddn="cn=admin,cn=config" bindmethod=simple credentials=r00tme searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5"       timeout=1 tls_reqcert=allow tls_cacert=/etc/ssl/certs/rootca.crt
-
add: olcMirrorMode
olcMirrorMode: TRUE
ldapmodify  -Y EXTERNAL  -H ldapi:// <0008_addSyncRepl.ldif

Test Replica

Add something in LDAP cn=config, olcServerID: 3 ldaps://test.test1.tld on ldap1 and olcServerID: 3 ldaps://test.test2.tld on ldap2

Add on ldap1


dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldaps://ldap1
olcServerID: 2 ldaps://ldap2
olcServerID: 3 ldaps://test.test1.tld
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0009_testConfigReplication_ldap1.ldif

On Ldap1 and Ldap2

slapcat -b  cn=config | grep --color test
olcServerID: 3 ldaps://test.test1.tld

Add on ldap2

0009_testConfigReplication_ldap2.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldaps://ldap1
olcServerID: 2 ldaps://ldap2
olcServerID: 3 ldaps://test.test2.tld
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0009_testConfigReplication_ldap2.ldif
slapcat -b  cn=config | grep --color test
olcServerID: 3 ldaps://test.test2.tld

So replication is works and all data from ldap1 is replicated to ldap2 and back.

Restore Original settings

ldapmodify  -Y EXTERNAL  -H ldapi:// < 0006_addConfigReplication.ldif

fuel_domain replica

Все делаем на одном сервере так как все изменения вносим в конфиг (cn=config), которая УЖЕ настроена на репликацию

Add Overlay

0001_addOverlay.ldif
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0001_addOverlay.ldif

RootDN and RootPW

0002_rootDN.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=fuel_domain
0002_rootPW.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: r00tme
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0002_rootDN.ldif
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0002_rootPW.ldif


Configure Replication

0003_configureReplica.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=101 provider=ldaps://ldap1            binddn="cn=admin,dc=fuel_domain"        bindmethod=simple credentials=r00tme searchbase="dc=fuel_domain"        type=refreshAndPersist                      retry="5 5 300 5" timeout=1 tls_reqcert=allow tls_cacert=/etc/ssl/certs/rootca.crt
olcSyncRepl: rid=102 provider=ldaps://ldap2            binddn="cn=admin,dc=fuel_domain"        bindmethod=simple credentials=r00tme searchbase="dc=fuel_domain"        type=refreshAndPersist                      retry="5 5 300 5" timeout=1 tls_reqcert=allow tls_cacert=/etc/ssl/certs/rootca.crt
-
add: olcMirrorMode
olcMirrorMode: TRUE
ldapmodify  -Y EXTERNAL  -H ldapi:// < 0003_configureReplica.ldif

Configure Indexes

0004_addIndex.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq

ldapmodify  -Y EXTERNAL  -H ldapi:// < 0004_addIndex.ldif

Check Repliction for fuel_domain

Create Organization on ldap1

0005_testReplica_AddCustomerOrg.ldif
dn: dc=customer_organization,dc=fuel_domain
dc: customer_organization
o: Example Organization
objectClass: dcObject
objectClass: organization
ldapadd  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -H ldaps://ldap1 < 0005_testReplica_AddCustomerOrg.ldif

Compare

ldapsearch  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap1 '(objectclass=*)' > ./ldap1
ldapsearch  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap2 '(objectclass=*)' > ./ldap2

diff ./ldap1 ./ldap2

Create Group on ldap2

0006_testReplica_AddPeopleGroup.ldif
dn: ou=People,dc=customer_organization,dc=fuel_domain
ou: People
objectClass: top
objectClass: organizationalUnit
ldapadd  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -H ldaps://ldap2 < 0006_testReplica_AddPeopleGroup.ldif

Compare

ldapsearch  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap1 '(objectclass=*)' > ./ldap1
ldapsearch  -D "cn=admin,dc=fuel_domain" -w 'r00tme' -b 'dc=fuel_domain' -H ldaps://ldap2 '(objectclass=*)' > ./ldap2

diff ./ldap1 ./ldap2