Рейтинг
+2.26

LDAP

4 читателя, 76 топиков

Принудительный LDIF line wrapping отменяется!

  • LDAP
Не прошло и пяти лет, как в ldapsearch наконец добавили опцию, позволяющую выводить LDIF без переносов строк. Напомню, что переносы эти ставились в соответствии со стандартом MIME, который сам по себе вообще весьма сомнительное отношение имеет к LDIF, но тем не менее. Особо хотелось бы отметить, что в реализациях ldapsearch родом из проекта iPlanet (детища консорциума Sun Microsystems и Netscape) подобная опция была с самого начала, а в OpenLDAP'овском клиенте её не добавляли исключительно по принципиальным соображениям строгого следования букве и духу стандартов, даже если это ограничивает свободу выбора или попросту противоречит здравому смыслу. Но в 2.4.24 они всё-таки сдались, так что скомпилировав его вы получите чудесный новенький ldapsearch, умеющий знаете что?
Вот:
ldapsearch -LLLZZZ -b 'dc=company,dc=com' -s one -o ldif-wrap=no

LDAP-конференция

  • LDAP
Собственно ldap@conference.jabber.ru
Защищена капчей, ботов нет
Буду рад ответить на все ваши вопросы
Ещё больше буду рад услышать ваши пожелания и предложения :)

Беспарольная авторизация на сервере OpenLDAP с использованием SASL

  • LDAP
Возникла как-то у вашего покорного слуги насущная потребность ходить на LDAP-сервер секьюрно (то есть по шифрованному соединению, а не со 100% гарантией безопасности, как можно было бы подумать), но без ввода пароля. Идея хорошая, но почему-то традиционно слова «секьюрно» и «без пароля» ассоциируются с такими громоздкими понятиями, как Kerberos, GSSAPI, SSO, Настройка всего этого — занятие не только трудоёмкое, но и не всегда оправданное: один человек это настроит, другой же, который рано или поздно придёт работать на его место, довольно быстро сойдёт с ума, а это нехорошо, потому что с людьми нужно быть… гуманнее как минимум :)

Читать дальше →

Вышла GOsa 2.7

  • LDAP
GOsa — это централизованная панель управления ИТ-инфраструктурой, если в инфраструктуре той «становым хребтом», обеспечивающих собственно интеграцию разрозненных программных компонент, является множество объектов, описанных в каталоге(ах) LDAP.

Читать дальше →

Типичные примеры использования entryDN в LDAP-фильтрах

  • LDAP
Очень часто нужно найти все объекты, начиная с некоей baseDN, но сам baseDN вам не нужен. Для этого отфильтруйте соотв. объект, добавив:
(!(entryDN=dc=example,dc=com))
Аналогично, если вам нужно найти объекты, за исключением тех, что находятся в определённом поддереве, добавьте фильтр вида
(!(entryDN:dnSubtreeMatch:=dc=example,dc=com))
— кстати, именно такой пример упомянут в man 8 slapcat.

Если же вам нужно получить при поиске только объекты из определённых поддеревьев, либо, напротив, исключить из поиска все такие объекты, используйте фильтр из RFC 5020:
(entryDN:componentFilterMatch:=or:{
          item:{ component "3", rule rdnMatch, value "o=Roga" },
          item:{ component "3", rule rdnMatch, value "o=Kopyta" } })

— в результаты поиска будут включены только те объекты, у которых третьим компонентов DN (компонент называется rDN) является либо «o=Roga», либо «o=Kopyta».
Подробнее: если это разрешено списками контроля доступа, то применив данный фильтр. вы найдёте контакты из «ou=contacts,o=Kopyta,l=Stargorod,c=ru» и учётные записи бухгалтеров из «cn=buh,cn=Groups,o=Roga,l=Odessa,c=ua», но, к счастью, не увидите аудиторов из «cn=Auditors,cn=Groups,o=F.A.S.,l=Moscow,c=ru».

Архитекторы LDAP: Курт Зейленга

  • LDAP
Курт Зейленга — Исполнительный директор OpenLDAP-фонда и консультант Проекта OpenLDAP, он основал обе организации летом 1998-го года и занимал должность Главного архитектора Проекта OpenLDAP с момента его основания вплоть до 2007-го года.
В настоящее время Курт на условиях полной занятости работает Инженером-разработчиком в компании Isode Limited, занимающейся проектированием интернет-технологий и стандартов с акцентом в области каталогов, обмена сообщениями и безопасности. Интересы Курта затрагивают не только разработку каталогов, но и «менее очевидные» вещи — такие как интернет-службы обеспечения безопасности, в особенности используемые для защиты протоколов прикладного уровня [модели OSI].
Курт — активный участник Internet Engineering Task Force (IETF). Он состоит в Директорате LDAP, Директорате по Безопасности, и Директорате Прикладной области. Авторство многих документов Internet-Drafts (черновых вариантов интернет-стандартов) непосрественно принадлежит Зейленге, многие [другие] он редактировал. Некоторое количество черновых вариантов стандартов, написанных им, в итоге приобрели статус стандартов RFC*. Курт участвует в рабочих группах LDAP Revision (LDAPbis), Simple Authentication and Security Layer (SASL), также vCard и CardDav.

Также Зейленга занят в работе Фонда Стандартов XMPP и является автором нескольких спецификаций Протокола Расширений XMPP (XEP). Трудовая деятельность Курта в Isode Limited (и не только) тесно связана с этой областью.

* несмотря на присутствие слова few в англоязычном оригинале, количество это весьма внушительно

Англоязычный оригинал на сайте OpenLDAP Project

ZImbra: нетривиальная маршрутизация почты - часть 2

  • LDAP
Первая часть тут

Положим, поставила перед вами нелёгкая судьбина следующую задачу: добавить в Zimbr'у alias, он же псевдоним. Но псевдоним тот не простой, а виртуальный, указывающий не на пользователя в локальном домене, обслуживаемом Zimbra, а на некий «внешний» почтовый адрес.
Как законопослушный гражданин, вы наверняка первым делом загрузите интерфейс администрирования Zimbra и в меню Создать выберете «Псевдоним». После совершения указанной манипуляции пред ваши очи предстанет такое вот окно:

Читать дальше →

ZImbra: нетривиальная маршрутизация почты - часть 1

  • LDAP
Zimbra — замечательный Collaboration Suite, но с точки зрения тонкой настройки собственно почтового сервиса MTA (в качестве которого, как мы все знаем, используется Postfix) её веб-интерфейс сильно хромает, а местами так и просто обескураживает.
Например, есть у меня Zimbra на внутреннем почтовике, она полностью закрыта от внешнего доступа и всю исходящую корреспонденцию шлёт внешнему серверу-шлюзу, от него же и принимает оную. Плюс настроен Split-Domain (как именно — см. Split Domain: Configuring Zimbra as the Secondary System), потому что пока на внешнем шлюзе есть нехилый кусок нашего корпоративного домена. Ну да это не суть важно, а важно то, что в моём случае Zimbra по дефолту не может отправлять любую почту, кроме адресованной локальным получателям, куда-либо, кроме того самого внешнего шлюза.
И всё было бы хорошо, если бы в дополнение к собственному домену Zimbra, назовём его domain.com, не появился ещё один внутренний домен с именем lists.domain.com, хостящийся буквально по соседству (VLAN/подсетка совпадают, так что не требуется дополнительная маршрутизация). И вот тут дефолтная конфигурация уже перестала меня устраивать: ведь в этот «соседний» домен тоже нужно каким-то образом отправлять почту, но если оставить всё как есть, то получится абсурдная ситуация: сначала Zimbra будет отправлять сообщение в lists.domain.com через интернет-шлюз на почтовый шлюз, а затем последний уже отправит это письмо обратно через интернет-шлюз… почти туда же, откуда оно и ушло. Таким образом, мы получили бы маршрутизацию почты в lists.domain.com аля «путешествие Афанасия Никитина за три моря» и массу потенциального геморроя.

Читать дальше →

[PHP] Поиск по LDAP в браузере

  • LDAP
Еще один скрипт поиска по LDAP с любого компьютера в сети. Скрипт написан на PHP. Не стал прикручивать в выдаче результата красивое оформление, если потребуется, его можно взять из доработанной версии этого же скрипта, который я выкладывал вчера.
А этот скрипт в браузере выглядит примерно так:
Читать дальше →

Поиск по LDAP в браузере с использованием jQuery

  • LDAP
Потребовался мне быстрый поиск по LDAP с любого компьютера в распределенной сети c возможностью выбора нескольких адресатов для отсылки письма. В итоге написал скрипт с использованием jQuery, который позволяет делать выборки из базы без перезагрузки страницы, манипулировать почтовыми адресами для отсылки. Выборку делает php программа, которая возвращает выборку данных в основной html документ. В итоге в браузере выглядит примерно так:
ldap search
Читать дальше →

Индексы not equal и pres

  • LDAP
Индекс pres нужно использовать только для очень редко встречающихся, но часто «искомых» атрибутов
Индекса not equal не существует в природе, но _некоторые_ (сдаётся, мне что двузначные, то есть флаговые например ) атрибуты могут создавать индекс not equal на основании индекса equal. В общем для zimbraIsSystemResource, который таки флаг, я индекс eq добавил, а там хоть трава не сохни.
Вообще полезно бывает в 25-й раз одну и ту же страницу документации читать: склероз побуждает к неожиданным открытиям, в особенности если раньше читал то же самое, но по другому поводу

Ах да, ещё лучше бы держать логи низкоуровневой БД и собственно данные на разных дисках.
Цитирую OL Admin Guide:
Use fast subsystems. Put each database and logs on separate disks configurable via DB_CONFIG:
# Data Directory
set_data_dir /data/db

# Transaction Log settings
set_lg_dir /logs

Эх, где бы эти раздельные диски ещё найти в наш век тотального RAID'а с LVM'ом…

P.P.S. А вообще по моим наблюдениям ту же MySQL нередко используют почти read-only.

Как правильно "скормить" Openfire аккаунты Zimbra

  • LDAP
Интеграция Openfire и Zimbr'ы сводится к стандартной настройке Openfire+LDAP, но есть один момент, характерный именно для Zimbra: это используемый LDAP-фильтр.

Он должен отсеивать ненужное по следующим критериям:
— Берутся только учётки Zimbra, соответственно objectClass=zimbraAccount;
— Учётная запись должны быть активной, соответственно zimbraAccountStatus=active;
— Нужно проверить, не системный ли ресурс данный аккаунт (всякие там спамы, хамы): для этого есть атрибут zimbraIsSystemResource и проверка !(zimbraIsSystemResource=TRUE);
— Нужно определить, кто может пользоваться Jabber'ом, а кто вовсе тестовый Вася Пупкин и ему не положено. Для этого придуман zimbraFeatureIMEnabled и проверка zimbraFeatureIMEnabled=TRUE

Читать дальше →

Ценная статья об интеграции OpenSSO и EJBCA

  • LDAP
Несмотря на то, что Oracle прикрыла разработку Sun'овского единого сервиса аутентификации для веб-приложений — OpenSSO, тем не менее он, как мы все знаем, относительно неплохо поживает под новым именем OpenAM как проект, поддерживаемый компанией ForgeRock. На самом деле сайт у них довольно мутный и никакой активности я там не наблюдаю, кроме выкладывания эпизодического неких «снэпшотов» OpenAM'а, в которых, возможно, меняется в месяц по строчке кода.
Тем не менее, OpenSSO был, есть и будет лучшим, если не единственным пригодным к энтерпрайз-эксплуатации веб-login'ом, так что никуда от него не деться. В связи с этим хотелось бы поделиться ссылкой на превосходную во всех отношениях статью, посвящённую интеграции OpenSSO и также весьма удачного во всех отношениях софта для построения Центров Сертификации под неблагозвучным для русского уха названием EJBCA. Также в статье рассмотрена и LDAP-специфика данного солюшна, что не может не радовать.
В двух словах о чём статья: статья о том, как сделать клиентам единый вход на веб-приложения так, чтобы хватало одного чудесного сертификата, установленного в браузере клиента.
На картинке это выглядит так:
OpenSSO+EJBCA scheme

Читать дальше →

Новая версия скрипта для бэкапа OpenLDAP-баз

  • LDAP
Каждый раз создаётся полный бэкап slapcat'ом
Если предыдущего бэкапа нет (первый запуск, например) — просто делаем первый полный бэкап
Если есть предыдущий полный бэкап, сравниваем текущий полученный бэкап с предыдущим
Если разница есть, то она записывается degrade-патчем (то есть позволяющим получить предыдущую версию из самой свежей), если разницы нет — просто чистятся файлы в /tmp

Если директории для бэкапов нет, она создаётся

Все переменные настроек — в начале скрипта

Читать дальше →

Мультипротокольный балансировщик нагрузки (pen)

  • LDAP
Оказывается, есть совершенно бесплатный балансировщик нагрузки, умеющий также и failover, подходящий для LDAP! Это утилита pen, созданная теми же людьми, которые разрабатывали Siag Office (сам pen тоже древний). Установка его тривиальна даже при компиляции из исходников, но, например, в дистрибутиве Fedora pen уже есть, так что просто yum install pen. Пока что я его активно не тестировал, по факту работает, но насколько правильно он это делает — сказать не могу, дам лишь ссылку на официальный HOWTO

Судьба человека и его ПО как "зеркало эпохи"

  • LDAP
Довольно туманно будущее OpenSource-сервера каталогов OpenDS, разработка коего, как это уже стало «доброй традицией» в мире открытого софта, держится по сути на одном-единственном человеке… Дело в том, что корпорация Oracle, поглотившая компанию Sun Microsystems — бывшего работодателя Ludovic Poitou (того самого разработчика), совершенно не заинтересована в развитии большинства OpenSource-проектов, не приносящих столь очевидной прибыли как, например, MySQL.
Читать дальше →

Стратегия бэкапа OpenLDAP

  • LDAP
Для того, чтобы сделать заведомо консистентный (непротиворечивый, целостный то есть) бэкап всех баз OpenLDAP, нужно:
1) Перевести соответствующую базу в режим работы read-only, если до этого она уже не работала в этом режиме;
2) Сделать полнотекстовый дамп базы с помощью утилиты slapcat, входящей в поставку серверной части OpenLDAP (более того, это просто (сим/хард)линк на slapd — бинарник самого сервера);
3) Если режим работы базы изменялся, вернуть его состояние к исходному.

Данный нехитрый алгоритм реализует приведённый ниже скрипт:

Читать дальше →

MultiMaster vs. Mirroring

  • LDAP
По возможности не используйте Multimaster-репликацию в её полноценном виде:

— теоретически неограниченое количество мастер-серверов,

— каждый мастер-сервер может принимать реплики изменений с любого другого мастер-сервера.

Дело в том, что это работает только в том случае, если все мастер-сервера создаются с нуля и практически одновременно. Это именно так в случае с простым тестом 050-multimaster, на который так любят ссылаться разработчики OpenLDAP. Тем не менее даже такой вроде бы стабильно работающий кластер взаимнореплицируемых серверов может потерять ноду… А потом вторую… В особенности это касается тех случаев, когда нод больше трёх: число три для режима Multimaster'а в OpenLDAP является каким-то магическим порогом, за которым начинаются эксперименты над критически важными данными с плохо прогнозируемыми последствиями.
Mirroring (зеркалирование) — технически тот же MultiMaster (найдите отличия в конфигурации? olcServerID?), но это иная стратегия репликации. Эта стратегия предполагает, что в штатном режиме работы запись производится лишь на одном сервере, а на второй сервер изменения пересылаются репликой. При этом чтение может осуществляться одновременно с двух серверов при помощи внешнего балансирующего нагрузку фронтэнда (не входит в поставку OpenLDAP можно использовать прокси-режимы работы OL). В случае отказа сервера, принимающего операции записи от клиентов, их начинает принимать неактивная часть «зеркала». Как только «отвалившаяся» часть зеркала поднимется, все операции записи, произведённые за время простоя, будут приняты репликой.
В общем, на самом деле, подчёркиваю, никакой принципиальной разницы между мультимастером и зеркалированием нет, кроме собственно количества нод. Но использование описанной стратегии даёт гораздо более предсказуемый результат, даже если вы не используете никаких внешних фронтэндов и все переключения осуществляете вручную.

P.S. Да, и в любом случае backup often

Одна из распространённых проблем репликации

  • LDAP
Если ваша база OpenLDAP упорно отказывается реплицироваться, запустите сервер, на который вы хотите залить реплику, с ключом -d 16384 (отладка механизма репликации). И если там будет явная «ругань» на то, что с мастер-сервера невозможно получить entryUUID для некоторых записей, это значит, что в исходном каталоге не хватает служебных атрибутов, без которых репликация действительно не пойдёт. Отложим обсуждение вопроса о том, почему так бывает, просто пофиксим эту проблему:
Если база относительно небольшая, переведите её в read-only и сделайте полный slapcat:
$ echo 'dn: olcDatabase={номер_базы}тип_бэкенда,cn=config changeType: modifyreplace: olcReadOnlyolcReadOnly: TRUE' | \ ldapmodify -x -D cn=config -Wbr /&
$ slapcat -F /path/to/config/dir -n номер_базы & my_db.ldif

А теперь… физически удалите файлы базы и залейте LDIF-дамп базы, полученный на шаге 1, обратно:
rm -f /path/to/db/files/*
slapadd -F /path/to/config/dir -n номер_базы -l my_db.ldif
chown -R openldap_user.openldap_group /path/to/db/files/

Примечание: под «номером базы» подразумевается то число, которое проставлено для этой базы в cn=config
То есть, например, для DN=olcDatabase={3}hdb,cn=config номер базы соответственно равен трём. Для самой cn=config номер всегда равен нулю (т.е. это всегда olcDatabase={0}config,cn=config)

Сборка OpenLDAP для сервера-реплики

  • LDAP
Если нужно собрать реплику на чистом сервере полностью аналогично тому, как был собран мастер, делаем так:

1. Качаем и распаковываем свежую версию сабжа:
wgеt ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.23.tgz -O Download/openldap-2.4.23.tgz
tar -xvf Download/openldap-2.4.23.tgz -С Compile/

(предполагается, что pwd=$HOME, а в $HOME есть каталоги Download и Compile)

2. Устанавливаем зависимости. В yum-based rpm-дистрибутивах это выглядит так:
sudo yum install gcc gcc-c++ libtool-ltdl-devel openssl-devel db4-devel

3. Собираем OpenLDAP
Раз это сервер реплики, то можно и нужно ничего нового не придумывать, а просто скопировать его опции сборки из исходников мастер-сервера:

На мастер-сервере:
cd Compile/openldap-2.4.21
scp config.log <replica_host>:Compile/openldap-2.4.23

На реплике (не путать со слэйвом, реплика может быть и вторым мастер-сервером, если используется multimaster):
cd Compile/openldap-2.4.23
eval `sed -n $(\%\$ \./configure%,/^$/p' config.log | tr -d '\n' | sed -r 's%^.+(\./configure)%\1%')
make depend && make && sudo make install

Как видите, в моём случае версии OpenLDAP для реплики и мастер-сервера не совпадают, но в ничего страшного в этом нет, если, конечно, разница в версиях не слишком велика. В моём случае мастер-сервер довольно активно используется, поэтому обновлять его приходится редко.
Команда «eval ...» извлекает из файла config.log строчку вызова ./configure, использовавшуюся для сборки мастер-сервера, и выполняет получившуюся команду