[OpenLDAP] Особенности и нюансы

В статье будут описаны нюансы в работе, возможно некоторые очевидны, но все это понимают.

OS

По сути один и тот же openldap, но в разных ОС с одними и теми же ключами может работать или не работать. Вот пример:

ldapsearch -x -LLLL -D 'cn=admin,ou=services,dc=domain,dc=com' '(!(objectClass=gosaDepartment))' -s sub -H 'ldaps://ldap.domain.com' -b 'uid=user,ou=people,dc=domain,dc=com' -w '<pass>'

Так вот, в Linux’e это отработает нормально, а в Solaris будет ругань:

ldap_bind: Server is unwilling to perform (53)
additional info: unauthenticated bind (DN with no password) disallowed

В чём же дело? Внимательный читатель заметит, что фильтр идёт не в конце, после всех параметров, в средине. Видимо, в Linux не так строго, как в Solaris.

Index

В OpenLDAP’e так же, как и в mysql/postgresql/… есть индексы. Полная аналогия как по преимуществам, так и по недостаткам. Как правило, самыми распространёнными есть eq (чёткое соответствие) и sub (аналог like в базах данных). Их так же нужно использовать с осторожностью: слишком много индексов будут больше потреблять ресурсов. Поэтому, используйте их только тогда, когда в логах часто видите сообщения:

<= mdb_substring_candidates: (description) not indexed

что означает, что индекс по атрибуту description не используется. Можно задавать так:

index roleOccupant eq,sub

а можно одним махом сразу несколько определить и для них всех будет использоваться матчинг eq+sub:

index default sub,eq
index cn,sn,uid,mail,givenName,description

Теперь самое важное! Если вы делаете include схем с описанием атрибутов, то использовать индекс вы можете только после включения файла, где он описан. В противном случае вы получите ошибку:

/etc/openldap/slapd.conf: line 85: index attribute "gosaGroupObjects" undefined

Дальше. Индексы создаются исключительно в момент заливки ldif’a в пустую базу. Если же захотелось индексы на непустой базе, нужно её принудительно переиндексировать, предварительно остановив службу LDAP’e:

slapindex -v -f /etc/openldap/slapd.conf

Limit

С ними сталкиваешься на относительно не больших объёмах баз, к примеру, 500 записей пользователей (неважно, активные или нет) + 20 групп уже могут выходить на пределы лимита. В логах можно увидеть такую запись:

mdb_id2entry_put: mdb_put failed: MDB_MAP_FULL: Environment mapsize limit reached(-30792)

Для решения этого нужно увеличить объём самой базы хранения. По умолчанию она 10Мб. Заодно, можно увеличить и прочие лимиты, например, на передачу данных на slave — сервера:

overlay memberof
...
maxsize 104857600
sizelimit unlimited
sizelimit size=unlimited
... overlay syncprov ... sizelimit unlimited sizelimit size=unlimited

Важно делать эти изменения в каждом блоке overlay.

master — slave

Как узнать, актуален ли ваш slave? Узнать это можно, запросив аттрибут contextCSN у master’a и slave’a и сравнив их. По сути это немного изменённый timestamp.

Config

Существует 2 метода хранения параметров: классический и новый OLC (когда параметры LDAP’a хранятся в самом LDAP’e). Как отличать их? Всё просто: если вы встречаете параметры, которые начинаются с olc, например, olcAccess, то это новый метод. У OLC метода есть свои преимущества и недостатки:

преимущества — не нужно делать restart сервера, если нужно внести изменения в настройки сервера
недостатки — любые изменения в конфиге нужно делать через ldapadd/ldapmodify, что усложняет настройку.

LoadBalancer

Для повышения отказоустойчивости, можно применять lload (LDAP Load Balancer Daemon ) , если у вас версия 2.5 и выше или другой tcp proxy (например, haproxy), если версия 2.4 или ниже.

Добавить комментарий

Ваш адрес email не будет опубликован.