LDAP Linux Replication: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:LDAP]] |
||
⚫ | |||
+ | [[Категория:Linix]] |
||
+ | [[Категория:HA]] |
||
+ | [[Категория:SSL]] |
||
⚫ | |||
⚫ | |||
+ | Основная статья - http://wiki.sirmax.noname.com.ua/index.php/LDAP_Linux_Auth |
||
+ | |||
+ | |||
⚫ | |||
=Важное замечание= |
=Важное замечание= |
||
Строка 378: | Строка 385: | ||
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> |
Текущая версия на 15:19, 31 мая 2016
ТУт заметки о репликации
Основная статья - 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