LDAP Linux Replication: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
Строка 378: | Строка 378: | ||
diff ./ldap1 ./ldap2 |
diff ./ldap1 ./ldap2 |
||
+ | </PRE> |
||
+ | |||
+ | |||
+ | =HA Mode= |
||
+ | |||
+ | ==HA TLS Cert Issue== |
||
+ | Так как используется HAProxy и IP (который перемещается на активную ноду) - то в конечном итоге лучше использовать один сертефикат и одно имя - 'ldap' |
||
+ | <BR> |
||
+ | В моем примере есть 2 ноды |
||
+ | |||
+ | <PRE> |
||
+ | 10.20.0.6 ldap2 |
||
+ | 10.20.0.3 ldap1 |
||
+ | 10.20.0.100 ldap |
||
+ | </PRE> |
||
+ | |||
+ | Адрес |
||
+ | <PRE> |
||
+ | 10.20.0.100 ldap |
||
+ | </PRE> |
||
+ | используется как адрес Load Balancer |
||
+ | <PRE> |
||
+ | Потому в конечном итоге я перегенерировал сертификаты для имени <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=*)' |
||
+ | </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:21, 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.
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