Как стать автором
Обновить

LDAP для интернет-проекта

Время на прочтение5 мин
Количество просмотров18K
Ссылки на остальные части: вторая, третья, четвертая, пятая

Наверное все согласятся с тем, что для начинающего интернет-проекта необходима централизованная система AAA (Authentication, Authorization, Accounting): множество пользователей, куча боевых серверов, чуть поменьше серверов разработки, svn, админки, etc…
Передо мной тоже встала такая необходимость и я хочу рассказать о том что у меня получилось.
Итак, что нам потребуется установить и настроить:
  1. OpenLDAP, естественно с репликацией
  2. Бэкап LDAP'а — именно вторым пунктом, можно первым (-;
  3. phpldapadmin, планирование групп и шаблонов
  4. авторизация для админок — Apache HTTPD mod_ldap
  5. авторизация для svn (+sasl)
  6. авторизация для доступа по ssh — pam_ldap


Устанавливать всё это будем хозяйство будем на недавний релиз Debian GNU/Linux Lenny.

Заранее предчувствуя вопросы «Почему не (Active|Apache|Fedora|e)Directory?» отвечаю:
  1. Они все медленнее OpenLDAP — может оказаться решающим фактором.
  2. ActiveDirectory у нас нет, а если и есть, то я не настолько её знаю, чтобы «в случае чего» поднять из бэкапа на голом железе за 10 минут.
  3. eDirectory хорошо… но разворачивать отдельную инфраструктуру «только для» — я не готов.
  4. Про остальные две просто признаюсь, что совсем их не знаю (-:

Итак, поехали:
1.

Нам потребуются двы физических сервера или два виртуальных на разных физических, назовём их ldap01.habr.ru (master) и ldap02.habr.ru (slave).
Репликацию будем делать master-slave — через syncrepl.
Балансировка у нас будет работать через DNS round-robin, для этого добавляем записи в зону habr.ru:
ldap01.habr.ru. IN A 192.168.100.1
ldap02.habr.ru. IN A 192.168.100.2
ldap.habr.ru. IN A 192.168.100.1
ldap.habr.ru. IN A 192.168.100.2

Сначала настроим ldap01.habr.ru
apt-get install slapd ldap-utils ldapscripts phpldapadmin
Установщик спросит нас про домены, пароли — вводим habr.ru и пароль админа.
После установки нужно посмотреть, правильно ли заполнилась база — у нас должно быть две записи с правильным доменом (в etch был глюк — домен прописывался два раза, типа dc=habr,dc=ru,dc=habr,dc=ru):
#slapcat
dn: dc=habr,dc=ru
objectClass: dcObject
objectClass: organization
o: habr
dc: habr
structuralObjectClass: organization
entryUUID: f22558c4-8c9d-102d-95a8-73e8f6c3e453
creatorsName: cn=admin,dc=habr,dc=ru
createTimestamp: 20090211153942Z
modifiersName: cn=admin,dc=habr,dc=ru
modifyTimestamp: 20090211153942Z

dn: cn=admin,dc=habr,dc=ru
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
structuralObjectClass: organizationalRole
entryUUID: 82bbb18a-8c99-102d-8ac2-1508ef940fe8
creatorsName:
createTimestamp: 20090211150757Z
userPassword:: e0NSWVUIOS9FM25wTGQzU3FXOUE=
modifiersName: cn=admin,dc=habr,dc=ru
modifyTimestamp: 20090217023143Z

Если случился глюк с доменами, или что-то неправильно ввели, то делаем следующее:
  1. Сохраняем базу в файл и редактируем
    #slapcat > /root/habr.ru.ldiff
  2. далее останавливаем slapd — /etc/init.d/slapd stop
  3. удаляем старую базу — rm /var/lib/ldap/*
  4. запускаем slapd — /etc/init.d/slapd start
  5. Импортируем файлик — slapadd -l /root/habr.ru.ldiff

Если глюка не было, нам всё-равно придётся формировать подобный файл для пользователя cn=syncrepl,dc=habr.ru,dc=ru.
Генерируем хеш пароля для пользователя — slappasswd -h {MD5}
И создаём файл /root/syncrepl.habr.ru.ldiff:
cat > /root/syncrepl.habr.ru.ldiff << "EOF"
dn: cn=syncrepl,dc=habr,dc=ru
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: syncrepl
description: synrepl user
structuralObjectClass: organizationalRole
userPassword:: {MD5}ICy5YqxZB1uWSwcVLSNLcA==
EOF
И загружаем его в базу — slapadd -l /root/syncrepl.habr.ru.ldiff
Конфигурационные файлы находятся в /etc/ldap/

Настройки для локального клиента:
cat > /etc/ldap/ldap.conf << "EOF"
BASE dc=habr, dc=ru
URI ldap://ldap.habr.ru
EOF

Настройки сервера:
cat > /etc/ldap/slapd.conf << "EOF"
#общие настройки
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb

#без этого модуля не будет работать репликация
moduleload syncprov
sizelimit 500
tool-threads 1
backend bdb

#настройки нашей базы
database bdb
suffix "dc=habr,dc=ru"
checkpoint 512 30
rootdn "cn=admin,dc=habr,dc=ru"
# эти индексы нужны для репликации
index objectClass,entryCSN,entryUUID eq
overlay syncprov
syncprov-checkpoint 10 1
syncprov-sessionlog 10
directory "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
lastmod on
# Настройки прав на дерево. Аккаунт syncrepl нужен для репликации
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=habr,dc=ru" write
by dn="cn=syncrepl,dc=habr,dc=ru" read
by anonymous auth
by self write
by * none
access to *
by dn="cn=syncrepl,dc=habr,dc=ru" read
by * break
access to dn.base="" by * read
access to *
by dn="cn=admin,dc=habr,dc=ru" write
by * read
# далее можно описать другие базы
EOF


Теперь настроим ldap02.habr.ru:
apt-get install slapd
На вопросы о паролях и доменах можно ответить что-нибудь невнятное.

Останавливаем slapd — /etc/init.d/slapd stop
Настройки для локального клиента:
cat > /etc/ldap/ldap.conf << "EOF"
BASE dc=habr, dc=ru
URI ldap://ldap.habr.ru
EOF

Настройки сервера:
cat > /etc/ldap/slapd.conf << "EOF"
# общие настройки
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel none
modulepath /usr/lib/ldap
moduleload back_bdb
sizelimit 500
tool-threads 1
#настройки нашей базы
database bdb
suffix "dc=habr,dc=ru"
rootdn "cn=admin,dc=habr,dc=ru"
directory "/var/lib/ldap"
syncrepl rid=0
provider=ldap://ldap01.habr.ru
type=refreshOnly
interval=00:00:00:10
searchbase="dc=habr,dc=ru"
scope=sub
bindmethod=simple
binddn="cn=syncrepl,dc=habr,dc=ru"
#пароль пользователя syncrepl
credentials="password"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index objectClass,entryCSN,entryUUID eq
lastmod on
checkpoint 512 30
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=habr,dc=ru" write
by dn="cn=syncrepl,dc=habr,dc=ru" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="cn=admin,dc=habr,dc=ru" write
by dn="cn=syncrepl,dc=habr,dc=ru" write
by * read
EOF

Запускаем slapd — /etc/init.d/slapd start
Проверить работу репликации можно остановив slapd на ldap01.habr.ru и запустив slapcat.

Также хочу обратить внимание общественности на досадный нюанс, на выявление которого я потратил почти сутки:
Если на двух нодах используются различные хранилища (backend) - bdb и hdb, то реплицируются все записи, только без паролей.

Спасибо всем, кто до сюда дочитал.
На сегодня всё, продолжение чуть позже.

[UPD] часть вторая
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 7: ↑6 и ↓1+5
Комментарии5

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань