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

    Ссылки на остальные части: вторая, третья, четвертая, пятая

    Наверное все согласятся с тем, что для начинающего интернет-проекта необходима централизованная система 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] часть вторая

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 5

      0
      на поля паролей не распространяется шаблон *, и право на чтение для syncrepl надо выставлять отдельно.
        0
        Дак прописано же
        # Настройки прав на дерево. Аккаунт 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

        К вышеописанному глюку это не относится
          0
          а, пардон, не заметил.
        0
        Добавьте, плз, в эту статью ссылки на все остальные части.
        Спасибо.
          0
          Сделал.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое