LDAP Linux Replication

Материал из Wiki
Перейти к: навигация, поиск


ТУт заметки о репликации
Основная статья - http://wiki.sirmax.noname.com.ua/index.php/LDAP_Linux_Auth


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

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

Так как после настройки репликации сервера будут иметь на 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.

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


HA Mode

HA TLS Cert Issue

Так как используется 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

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

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