Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> Кластер OpenLDAP 2.4

Настройка отказоустойчивого кластера OpenLDAP 2.4 c балансировкой нагрузки и синхронизацией по шифрованному соединению под ос FreeBSD 7.1

Автор: Dr.Yu..


Yury Fedorov AKA Dr.Yu.
yfedorov sobaka gmail tochka com
25.02.2008

Ссылка на обсуждение тут.

В этой конфигурации будут созданы два сервера (AS01 и AS02), взаимно дублирующие функциональность друг друга, т.е. при отказ любого из серверов не приведет к потере данных или падению сервисов.
Сервер slapd (серверный модуль openldap) будет поднят на обоих серверах, между серверами будет происходить репликация в режиме Multi-Master (подробнее  см тут - http://www.zytrax.com/books/ldap/ch7/#ol-syncrepl-mm. При этом все соединения, необходимые для репликации будут зашифрованы.


Что касается использованного цветового выделения:
Это содержимое файла
# Это запуск команды. Каждая строка начинается с #
Это вывод команды

Параметры серверов.
В этом примере будут использованы следующие параметры серверов:

Основной сервер:
AS01
ip 10.44.44.6/24 gateway 10.44.44.1

Дублирующий сервер:
AS02
ip 10.44.44.7/24 gateway 10.44.44.1

DNS домен для серверов будет int.sample.ru

Версии ПО

Openldap-2.4.14.
FreeBSD 7.1-RELEASE #0: Thu Jan  1 14:37:25 UTC 2009     root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
Базовая установка:
Т.к.оба сервера выполняют одинаковую функцию, то софт и базовая настройка для них одинаковы, за исключением ip адресов и имени.
На обе машины ставим FreeBSD 7.1-R.
После установки обновляем\ставим порты:
# portsnap fetch    
Если ставим первый раз:
# portsnap extract
Если обновляем
# portsnap update

Т.к. Во всех конфигурационных файлах мы указываем не ip, а dns адреса машин, то нкжно обеспечить разрешение имен даже при отсутствующем dns сервере. Редактируем /etc/hosts:

10.44.44.6        AS01.int.sample.ru AS01
10.44.44.6        AS01.int.sample.ru.
10.44.44.7        AS02.int.sample.ru AS02
10.44.44.7        AS02.int.sample.ru.

Теперь синхронизируем время на серверах. Это очень важно, т.к. при значительной разнице во времени не будет работать репликация между openldap серверами.
В файл /etc/rc.conf на обоих серверах добавляем:

ntpdate_enable="YES"
ntpdate_flags="ru.pool.ntp.org"
ntpd_enable="YES"          
ntpd_config="/etc/ntp.conf"

Создаем файл /etc/ntp.conf на сервере AS01:

server as02.int.sample.ru
server ru.pool.ntp.org  prefer
server ntp.psn.ru
logfile /var/log/ntpd.log

Создаем файл /etc/ntp.conf на сервере AS02:

server as01.int.sample.ru
server ru.pool.ntp.org  prefer
server ntp.psn.ru
logfile /var/log/ntpd.log

По идее подобная конфигурация должна обеспечить нормальную синхронизацию времени даже при условии отсутствия доступа в интернет.
Теперь перезагружаем оба сервера, после чего проверяем что время синхронизировано.

Установка OpenLDAP
Ставим openldap:
# cd /usr/ports/net/openldap24-server/
# make config

У меня активированы опции:
DNSSRV
PASSWD
PERL
ODBC
SLAPI
TCP_WRAPPERS
BDB
SEQMOD
SYNCPROV
SMBPWD
DYNAMIC_BACKENDS
# make install clean

Создание сертификатов для организации шифрованного соединения
Весь трафик репликации будет шифроваться. В этом примере сервера используют сертификаты, подписанные одним CA. Это обеспечивает дополнительную защиту и позволяет клиенту репликации доверять серверу
Создаем сертификаты для каждого сервера. Если в организации уже имеется CA, то просто создаем по сертификату для каждого из серверов. Сертификаты должны быть без пароля. Если же CA в организации нет - создаем: свой:

Создаем рабочие каталоги:
# mkdir  /var/db/certs/
# mkdir  /var/db/certs/keys
# mkdir  /var/db/certs/requests
# cd  /var/db/certs/


Генерируем ключ для CA. Вводим пароль для CA
# openssl genrsa -des3 -out keys/ca.key 2048
Generating RSA private key, 2048 bit long modulus
..+++
........................................+++
e is 65537 (0x10001)
Enter pass phrase for keys/ca.key:
Verifying - Enter pass phrase for keys/ca.key:


Создаем самоподписанный CA сертификат, заполняем все поля так, как хотим - от них ничего не зависит.
# openssl req -new -x509 -days 3650 -key keys/ca.key -out ca.crt
Enter pass phrase for keys/ca.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]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sample
Organizational Unit Name (eg, section) []:IT Security
Common Name (eg, YOUR name) []:Sample CA
Email Address []:it_security@sample.ru


Создаем ключ для сервера as01:
# openssl genrsa -out keys/as01_ldap.key 2048
Generating RSA private key, 2048 bit long modulus
..................................+++
........................................................+++
e is 65537 (0x10001)


Создаем запрос на подпись сертификата сервера AS01, Внимательно заполняем все поля, в поле Common Name пишем DNS адрес сервера - as01.int.sample.ru, пароль не вводим, т.е просто жмем enter:
# openssl req -new -key keys/as01_ldap.key -out requests/as01_ldap.csr
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]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sample
Organizational Unit Name (eg, section) []:IT Security
Common Name (eg, YOUR name) []:as01.int.sample.ru
Email Address []:it_security@sample.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


Подписываем сертификат, вводим пароль для CA:
# openssl x509 -req -days 3650 -in requests/as01_ldap.csr -CA ca.crt -CAkey keys/ca.key -CAcreateserial -out as01_ldap.crt
Signature ok
subject=/C=RU/ST=Moscow/O=Sample/OU=IT Security/CN=as01.int.sample.ru/emailAddress=it_security@sample.ru
Getting CA Private Key
Enter pass phrase for keys/ca.key:


Создаем ключ для сервера as02:
# openssl genrsa -out keys/as02_ldap.key 2048
Generating RSA private key, 2048 bit long modulus
..............................................................+++
..........+++
e is 65537 (0x10001)


Создаем запрос на подпись сертификата сервера AS02, Внимательно заполняем все поля, в поле Common Name пишем DNS адрес сервера - as02.int.sample.ru, пароль не вводим, т.е просто жмем enter:
# openssl req -new -key keys/as02_ldap.key -out requests/as02_ldap.csr
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]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sample
Organizational Unit Name (eg, section) []:IT Security
Common Name (eg, YOUR name) []:as02.int.sample.ru
Email Address []:it_security@sample.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


Подписываем сертификат, вводим пароль для CA:
# openssl x509 -req -days 3650 -in requests/as02_ldap.csr -CA ca.crt -CAkey keys/ca.key -CAcreateserial -out as02_ldap.crt
Signature ok
subject=/C=RU/ST=Moscow/O=Sample/OU=IT Security/CN=as02.int.sample.ru/emailAddress=it_security@sample.ru
Getting CA Private Key
Enter pass phrase for keys/ca.key:


Ок, сертификаты готовы, теперь на серверах AS01 и AS02 создаем необходимые каталоги:
# mkdir /var/db/certs
# mkdir /var/db/certs/keys


В каталог /var/db/certs кладем сертификаты  ca.crt и as01_ldap.crt (as02_ldap.crt для сервера AS02)
В каталог /var/db/certs/keys кладем ключ  as01_ldap.key ( as01_ldap.key для сервера AS02)
Задаем права на сервере AS01:
# chown ldap:ldap /var/db/certs/as01_ldap.crt
# chown ldap:ldap /var/db/certs/keys/ as01_ldap.key
# chmod 0400 /var/db/certs/as01_ldap.crt
# chmod 0400 /var/db/certs/keys/ as01_ldap.key
# chmod 444 /var/db/certs/ca.crt

Задаем права на сервере AS02:
# chown ldap:ldap /var/db/certs/as02_ldap.crt
# chown ldap:ldap /var/db/certs/keys/ as02_ldap.key
# chmod 0400 /var/db/certs/as02_ldap.crt
# chmod 0400 /var/db/certs/keys/ as02_ldap.key
# chmod 444 /var/db/certs/ca.crt

Конфигурирование slapd на сервере AS01
Теперь необходимо создать хэш пароля для основного пользователя - администратора ldap. Запускаем slappasswd без параметров, дважды вводим пароль, получаем хэш:
# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Этот хэш нужно вписать в поле rootpw в файле slapd.conf

Редактруем файл /usr/local/etc/openldap/slapd.conf на сервере AS01:
Права на файл:
-rw-----—  1 ldap  ldap   1419 Feb 16 23:51 slapd.conf

Содержимое:
include        /usr/local/etc/openldap/schema/core.schema
include        /usr/local/etc/openldap/schema/cosine.schema
include        /usr/local/etc/openldap/schema/inetorgperson.schema
include        /usr/local/etc/openldap/schema/misc.schema
include        /usr/local/etc/openldap/schema/nis.schema
include        /usr/local/etc/openldap/schema/openldap.schema

pidfile        /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

TLSCertificateFile /var/db/certs/as01_ldap.crt
TLSCertificateKeyFile /var/db/certs/keys/as01_ldap.key
TLSCACertificateFile /var/db/certs/ca.crt
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3:RSA:+TLSv1
TLSVerifyClient never

modulepath    /usr/local/libexec/openldap
moduleload    back_bdb
database    bdb

suffix        "dc=int,dc=sample,dc=ru"

rootdn        "cn=ldapadmin,dc=int,dc=sample,dc=ru"
rootpw        {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory    /var/db/openldap-data

# Indices to maintain
index    entryCSN eq
index    entryUUID eq

access to attrs=userPassword
   by self         write
   by anonymous    auth
   by *          none
access to dn.subtree="dc=int,dc=sample,dc=ru"
   by dn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru" read

access to *
   by * none

serverID 001
syncrepl rid=000
 provider=ldaps://as02.int.sample.ru
 type=refreshAndPersist
 retry="5 10 300 +"
 searchbase="dc=int,dc=sample,dc=ru"
 attrs="*,+"
 bindmethod=simple
 binddn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru"
 credentials=SUPERPASSWORD
 tls_cert=/var/db/certs/as01_ldap.crt
 tls_key=/var/db/certs/keys/as01_ldap.key
 tls_cacert=/var/db/certs/ca.crt

mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 5


Теперь подробнее о параметрах. Внимание! Строчки не всегда можно поменять местами, при переделке <под себя> это нужно учитывать. Здесь опсывается назначение каждого фрагмента конфигурационного файла. Более для более подробной информации читаем man slapd.conf

include        /usr/local/etc/openldap/schema/core.schema
include        /usr/local/etc/openldap/schema/cosine.schema
include        /usr/local/etc/openldap/schema/inetorgperson.schema
include        /usr/local/etc/openldap/schema/misc.schema
include        /usr/local/etc/openldap/schema/nis.schema
include        /usr/local/etc/openldap/schema/openldap.schema

описывается какие схемы будут подключены

pidfile        /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

для отслеживания кол-ва запущенных копий демона и т.п.

TLSCertificateFile /var/db/certs/as01_ldap.crt
TLSCertificateKeyFile /var/db/certs/keys/as01_ldap.key
TLSCACertificateFile /var/db/certs/ca.crt
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3:RSA:+TLSv1

Параметры шифрования и пути к файлам сертификатов.

TLSVerifyClient never

Эта опция заставляет сервер не проверять сертификаты клиентов.

modulepath    /usr/local/libexec/openldap
moduleload    back_bdb
database    bdb

Описание и тип базы

suffix        "dc=int,dc=sample,dc=ru"
Основной суффикс - корень дерева ldap

rootdn        "cn=ldapadmin,dc=int,dc=sample,dc=ru"
rootpw        {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CN и шифрованный пароль для основного админа этого сервера. Этому пользователю разрешены любые операции с деревом.

directory    /var/db/openldap-data

Каталог, в котором храним базу ldap

index    entryCSN eq
index    entryUUID eq

Какие объекты индексировать - влияет на быстродействие.

access to attrs=userPassword
   by self         write
   by anonymous    auth
   by *          none
access to dn.subtree="dc=int,dc=sample,dc=ru"
   by dn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru" read
access to *
   by * none

Параметры безопасности и права доступа. В этом примере пользователям, прописанным в ldap разрешено аутентироваться и менять свой пароль. Пользователю  ldapsync_service разрешено чтение ветки dc=int,dc=sample,dc=ru. Остальным пользователям неразрешено вообще ничего.

serverID 001
syncrepl rid=000
 provider=ldaps://as02.int.sample.ru
 type=refreshAndPersist
 retry="5 10 300 +"
 searchbase="dc=int,dc=sample,dc=ru"
 attrs="*,+"
 bindmethod=simple
 binddn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru"
 credentials=SUPERPASSWORD
 tls_cert=/var/db/certs/as01_ldap.crt
 tls_key=/var/db/certs/keys/as01_ldap.key
 tls_cacert=/var/db/certs/ca.crt

mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 5

Это параметры репликации. Опции  retry и syncprov-checkpoint влияют на частоту репликации. Вместо SUPERPASSWORD нужно вписать открытым текстом пароль пользователя  ldapsync_service.

Конфигурирование базы для хранения данных LDAP
Теперь займемся базой.
На обоих серверах создаем каталог /var/db/openldap-data и выдаем правильные права:
# mkdir /var/db/openldap-data
# chmod 700 /var/db/openldap-data
# chown -R  ldap:ldap /var/db/openldap-data


Создаем файл /var/db/openldap-data/DB_CONFIG. В нем содержатся параметры для тюнинга базы данных:
# one 0.25 GB cache
set_cachesize 0 268435456 1

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152


Выдаем права для этого файла:
# chown  ldap:ldap /var/db/openldap-data/DB_CONFIG

Запуск и проверка slapd на сервере AS01
На сервере AS01 в файл /etc/rc.conf  добавляем строки:
slapd_enable="YES"
slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldaps://10.44.44.6/  ldap://10.44.44.6/ ldap://127.0.0.1/'"
slapd_sockets="/var/run/openldap/ldapi"


Запускаем slapd на сервере AS01:
# /usr/local/etc/rc.d/slapd start
Проверяем запуск:
# ps -ax | grep slapd
Должно быть примерно следующее:
5229  ??  Is     0:00.43 /usr/local/libexec/slapd -h ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://10.44.44.6/ ldap://127.0.0.1/ -u ldap -g ldap
Если нет - смотрим логи в файле  /var/log/debug.log

Наполнение базы ldap
Все, сервис ldap запущен на первом сервере, теперь можно начинать с ним работать.
Лично я для работы из-под windows использую ldapadmin ()

Начинаем наполнять каталог, репликация пустого каталога может привести к ошибкам:
Создаем файл top.ldif, заносим в него данные структуры:
dn: dc=int,dc=sample,dc=ru
objectClass: top
objectClass: dcObject
objectClass: organization
o: int
dc: int

dn: ou=systemusers,dc=int,dc=sample,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: systemusers

Записываем данные в каталог: Вместо !!PASSWORD!! здесь нужно вписать реальный пароль.
# ldapadd -x -D "cn=ldapadmin,dc=int,dc=sample,dc=ru" -w !!PASSWORD!! -f top.ldif

Вывод должен быть примерно такой:
adding new entry "dc=int,dc=sample,dc=ru"
[color=green]adding new entry "ou=systemusers,dc=int,dc=sample,dc=ru"
[/color]
Теперь с помощью программы  slappasswd (пример использования см выше) создаем хэш пароля для пользователя.ldapsync_service. Этот пользователь будет иметь права на чтение всего дерева каталогов.

Создаем файл ldapsync_service.ldif, в поле userPassword вписываем полученный хэш:
dn: uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru
objectClass: person
objectClass: uidObject
uid: ldapsync_service
cn: ldapsync_service
sn: ldapsync_service
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Записываем данные в каталог:
# ldapadd -x -D "cn=ldapadmin,dc=int,dc=sample,dc=ru" -w !!PASSWORD!! -f  ldapsync_service.ldif

Конфигурирование slapd на сервере AS02
Теперь редактруем файл /usr/local/etc/openldap/slapd.conf на сервере AS02:

include        /usr/local/etc/openldap/schema/core.schema
include        /usr/local/etc/openldap/schema/cosine.schema
include        /usr/local/etc/openldap/schema/inetorgperson.schema
include        /usr/local/etc/openldap/schema/misc.schema
include        /usr/local/etc/openldap/schema/nis.schema
include        /usr/local/etc/openldap/schema/openldap.schema

pidfile        /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

TLSCertificateFile /var/db/certs/as02_ldap.crt
TLSCertificateKeyFile /var/db/certs/keys/as02_ldap.key
TLSCACertificateFile /var/db/certs/ca.crt
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3:RSA:+TLSv1
TLSVerifyClient never

modulepath    /usr/local/libexec/openldap
moduleload    back_bdb
database    bdb

suffix        "dc=int,dc=sample,dc=ru"

rootdn        "cn=ldapadmin,dc=int,dc=sample,dc=ru"
rootpw        {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory    /var/db/openldap-data


# Indices to maintain
index    entryCSN eq
index    entryUUID eq

access to attrs=userPassword
   by self         write
   by anonymous    auth
   by *          none
access to dn.subtree="dc=int,dc=sample,dc=ru"
   by dn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru" read

access to *
   by * none

serverID 002
syncrepl rid=000
 provider=ldaps://as01.int.sample.ru
 type=refreshAndPersist
 retry="5 10 300 +"
 searchbase="dc=int,dc=sample,dc=ru"
 attrs="*,+"
 bindmethod=simple
 binddn="uid=ldapsync_service,ou=systemusers,dc=int,dc=sample,dc=ru"
 credentials=SUPERPASSWORD
 tls_cert=/var/db/certs/as02_ldap.crt
 tls_key=/var/db/certs/keys/as02_ldap.key
 tls_cacert=/var/db/certs/ca.crt

mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 5

Разница с аналогичным файлом на сервере AS01 минимальна, различаются параметры TLSCertificateFile, TLSCertificateKeyFile,serverID, provider

На сервере AS02 в файл /etc/rc.conf  добавляем строки:

slapd_enable="YES"
slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldaps://10.44.44.7/  ldap://10.44.44.7/ ldap://127.0.0.1/'"
slapd_sockets="/var/run/openldap/ldapi"

Запускаем slapd на сервере AS02:
# /usr/local/etc/rc.d/slapd start

Финальное тестирование
Все, система готова, но перед работой стоит прогнать несколько тестов:
-Изменить данные на ldap сервере as01. Проверить изменилась ли информация на  ldap сервере as02.
-Изменить данные на ldap сервере as02. Проверить изменилась ли информация на  ldap сервере as01.
-Выключить сервер  as02, внести изменения на сервере AS01, после чего включит сервер AS02 и проверить, что все изменения отреплицировались.
-Выключить сервер  as01, внести изменения на сервере AS02, после чего включит сервер AS01 и проверить, что все изменения отреплицировались.



размещено: 2009-02-27,
последнее обновление: 2009-03-14,
автор: Dr.Yu.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1458 секунд
Из них PHP: 50%; SQL: 50%; Число SQL-запросов: 76 шт.
Исходный размер: 32882; Сжатая: 8878