|
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.
|
|