You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
8.1 KiB

9 years ago
---
title: Базовая настройка openldap
tags: ldap
---
Disclaimer: Я ни в коем не считаю ldap шедевром инженерной/архитектурной мысли, просто так исторически сложилось, что поддержка авторизации через него есть практически везде[^fn1]
---
Установка / Debian
-------------------
# apt-get install slapd
Лезет стандартное окошко настройки, которое просит установить пароль админа. Рекомендую его сразу поставить правильным, потому что поменять его - много лишних действий.
Дальше начинается чёрная магия.
Схема дерева
-------------
Будем делать дерево вот по такой простенькой схеме:
dc=org
`-> dc=company
`+-> ou=users
| `+-> uid=user1
| `-> uid=user2
`-> ou=groups
`+-> cn=group1
`-> cn=group2
Для юзера, образующий[^fn2] элемент - inetOrgPerson, для группы - groupOfUniqueNames.
Настройка slapd
----------------
Нужно создать саму базу, корень в ней, основные ou'шки и пользователя admin для дальнейшей работы.
openldap после 2.4.27 поставляется с динамическим конфигом. Что бы там не говорили разработчики, править его **намного сложнее**.
Перед тем как создавать свою базу, предлагаю сначала удалить типовую, созданную при установке. Как её удалить уже после создания нашей - см ниже.
* остановить slapd: `service slapd stop`
* перейти в `/etc/ldap/slapd.d/cn=config`, найти там файлик вида `olcDatabase={X}hdb.ldif`
* убедиться, что он именно тот, что нужно: `olcSuffix: dc=nodomain`
* если он последний по порядку: переместить его куда-нибудь, например в /tmp
* если он НЕ последний - см ниже
* проверить конфиг через `slaptest`, в случае успеха - запустить `slapd` обратно
Сначала нужно определить порядковый номер для новой базы. Смотрим в `/etc/ldap/slapd.d/cn=config/` на предмет файлов ``olcDatabase*``. Находим последнее по порядку значение в {N}, добавляем к нему единицу.
$ export RDN="dc=company,dc=org" # поменять на правильный
$ export N=2 # номер базы
$ export ADMIN="cn=admin,$RDN" # юзер для правки базы
$ PASS=$(slappasswd -h '{SSHA}')
New password:
Re-enter new password:
$
$ cat > 01-create-db.ldif <<EOF
dn: olcDatabase={$N}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {$N}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: $RDN
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="$ADMIN" write
by anonymous auth
by self write
by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="$ADMIN" write by * read
olcLastMod: TRUE
olcRootDN: $ADMIN
olcRootPW: $PASS
olcDbCheckpoint: 512 30
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
EOF
$ ldapadd -Y EXTERNAL -H ldapi:/// -f 01-create-db.ldif
Предполагается, что slapd запущен с ``-h ldap://127.0.0.1:389/ ldapi:///``, т.е. слушает на loopback'е и разрешены обращения через локальный сокет.
Создаём корень базы. Обратите внимание, авторизация меняется с `-Y EXTERNAL` на обычный ``-D $ADMIN -W``
$ cat > 02-create-rdn.ldif <<EOF
dn: $RDN
objectClass: top
objectClass: dcObject
objectclass: organization
o: company.org
dc: company
description: -
EOF
$ ldapadd -D "$ADMIN" -W -H ldapi:/// -f 02-create-rdn.ldif
Создаём основные ou'шки:
$ cat > 03-create-ou.ldif <<EOF
dn: ou=users,$RDN
objectClass: organizationalUnit
ou: users
dn: ou=groups,$RDN
objectClass: organizationalUnit
ou: groups
EOF
$ ldapadd -D "$ADMIN" -W -H ldapi:/// -f 03-create-ou.ldif
Создаём юзера, из под которого будем править базу:
$ cat > 04-create-admin.ldif <<EOF
dn: $ADMIN
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: $PASS
EOF
$ ldapadd -D "$ADMIN" -W -H ldapi:/// -f 04-create-admin.ldif
Этого должно быть достаточно. Проверяем работу:
$ ldapsearch -LL -D $ADMIN -b $RDN -W 'dn'
Enter LDAP Password:
version: 1
dn: dc=company,dc=org
dn: ou=users,dc=company,dc=org
dn: ou=groups,dc=company,dc=org
dn: cn=admin,dc=company,dc=org
Работа с базой
---------------
TODO: LDIF'ы типовых операций с базой.
Дополнительно / Багфиксы
-------------------------
Добавляем прав обычному юзеру[^fn3]. Обращаю внимание: перед "by" - ДВА пробела. это связано с тем, что при разборе продолжения линии парсером - первый пробел отбрасывается.
$ cat > tmp.ldif <<EOF
dn: olcDatabase={$N}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to *
by self write
by * read
by anonymous none
EOF
$ ldapadd -Y EXTERNAL -H ldapi:/// -f tmp.ldif
Багфикс №2 - добавляем индекс для ``(uid=*)``
$ cat > tmp.ldif <<EOF
dn: olcDatabase={$N}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
EOF
$ ldapadd -Y EXTERNAL -H ldapi:/// -f tmp.ldif
Дополнительно / Удаление типовой базы
--------------------------------------
Задание со звёздочкой. Если мы прошляпили момент и хотим удалить типовую базу **после** создания своей - последовательность действий такая:
* Останавливаем slapd
* делаем бэкапы ``/etc/ldap``
* идём в ``/etc/ldap/slapd.d/cn=config/``, убираем оттуда файлик olcDatabase, отвечающий за тестовую базу.
* исправляем имена файлов, чтобы число в {} было последовательным, начиная с нуля.
* исправляем то же число в {} внутри переименованных файлов
* исправляем чексумму в заголовке файла (нужно посчитать CRC32 для файла, пропуская первые 2 строки с заголовком, и вписать её в заголовок). Например так: `tail -n +3 olcDatabase={3}hdb.ldif | rhash --crc32 -`
* осеняем себя пентаграммой, запускаем slaptest, читаем вывод, исправляем
* запускаем обратно slapd
[^fn1]: Спасибо AD и лично товарищу БГ за наше счастливое детство, чтоб они были здоровы, @%$&
[^fn2]: structural
[^fn3]: оставлено для примера, можно было сразу сделать при создании базы