Модификация поля, имеющего "номер в фигурных скобочках"

  • LDAP
«Люди часто спрашивают меня», как изменить значение одного из полей объекта, если это поле многозначное?
Ответ на этот вопрос элементарен, как 3 копейки:

dn: cn=object,dc=domain,dc=com
changeType: modify
delete: attrType
attrType: SOME_OLD_VALUE
-
add: attrType
attrType: SOME_NEW_VALUE

Но после этого всё те же люди, которые часто спрашивают, озадачивают меня таким пожеланием: а вот есть поля типа olcAccess, которые хотелось бы изменять, не указывая полностью их старое значение, а указывая один лишь только их «номер», который в фигурных скобочках, то… что же нам делать?

«За чем же дело стало, господа?» — отвечу я им!

dn: cn=object,dc=domain,dc=com
changeType: modify
delete: olcAccess
olcAccess: {2}
-
add: olcAccess
olcAccess: {2}to * by * none


Вот и вся недолга: при модификации поля с автоматически созданным «порядковым номером» можно не указывать его старое значение полностью. И это хорошо :)

Схема для связи объектов в каталоге

  • LDAP
Предлагаю вашему вниманию валидную схему для указания ссылок из объекта на другие объекты (просьба не путать с labeledURI и seeAlso :)).
Соответствующее пространство OID'ов зарегистрировано на моё имя, так что пользуйтесь на здоровье.

dn: cn=link,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: link
olcAttributeTypes: ( 1.3.6.1.4.1.37344.125.11 NAME 'linkedTo' DESC 'DN of another object in catalog which is linked to this entry' SUP distinguishedName )
olcObjectClasses: ( 1.3.6.1.4.1.37344.125.1 NAME 'link' SUP top AUXILIARY MUST ( linkedTo ) )


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

Коллекция интересных (нетривиальных) LDAP-related ссылок

  • LDAP
Данная коллекция будет пополняться время от времени путём непосредственного редактирования мной данного поста.
Нужна в первую очередь мне самому, поскольку кроме собственно ссылок содержит и краткое описание того, о чём в соотв. материалах идёт речь.

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

Три буквы о главном

  • LDAP
Во многих странах уже давно и успешно пользуются технологиями SSO для частных нужд компаний и корпораций. У нас об SSO если и знают, то что-то совсем не то (и часто вообще путают с доменным входом в сеть Windows) и не применяют на практике, а чаще — не знают, не интересуются и знать не желают.
Читать дальше →

Авторизация в Openmeetings с учетной записью Active Directory

  • FreeBSD
Так как Openmeetings напрямую к AD не прикручивается, действовать будем через OpenLDAP.
Итак. Ставим из портов OpenLDAP Server версии не ниже 2.3, так как более младшие версии не могут прозрачно передавать неизвестную схему.

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

Quick Start для аутентификации Linux-систем с использованием LDAP

  • LDAP
Пакеты, которые требуется установить (Ubuntu)

sudo apt-get install lib{{pam,nss}-ldap,nss-db} sudo-ldap nss-updatedb libpam-ccreds


/etc/ldap.conf:

base dc=example,dc=com
uri ldap://soa.example.com/
ldap_version 3
binddn uid=nss,ou=Services,ou=Accounts,ou=DSA
bindpw SomePassword
rootbinddn cn=config
scope sub
timelimit 2
# According to sudoers.ldap(5) this option my be used by sudo
#timeout 2
bind_timelimit 1
bind_policy soft
pam_password exop
nss_base_passwd         ou=people,?one
nss_base_shadow         ou=people,?one
nss_base_group          ou=groups,?sub
# Uncomment this if you dont want to send plaintext passwords over your LAN
#ssl start_tls
#tls_cacertfile /etc/ssl/ca.crt
#tls_cert        /etc/ssl/test-ws.crt
#tls_key         /etc/ssl/test-ws.key
#nss_initgroups_ignoreusers backup,bin,bind,daemon,fetchmail,games,gnats,irc,klog,libuuid,list,lp,mail,man,nagios,news,proxy,root,smmsp,smmta,sshd,sync,sys,syslog,uucp,www-data
# This setting is for use by sudo with LDAP support
#sudoers_base ou=sudo,ou=services,dc=example,dc=com
#sudoers_timed yes
#sudoers_debug 0
##sudoers_debug 2

ОБратите внимание: в директивах nss_base_passwd, nss_base_shadow, nss_base_group база поиска соответственно аккаунтов и групп указана в сокращённом виде, о чём свидетельствует «запятая» в конце. В соответствии с документацией, база поиска будет автоматически дополнена посредством подстановки после терминирующей запятой значения, указанного в директиве base. Разумеется, при необходимости вы можете указывать и полную базу поиска.

/etc/pam.d/*:
common-auth:

auth    [success=4 default=ignore]   pam_unix.so nullok_secure try_first_pass debug
auth    [authinfo_unavail=ignore success=1 default=2] pam_ldap.so use_first_pass debug
auth    [default=done]  pam_ccreds.so action=validate use_first_pass debug
auth    [default=done]  pam_ccreds.so action=store debug
auth    [default=bad]   pam_ccreds.so action=update debug
auth    required        pam_permit.so debug

common-account:

account [success=2 new_authtok_reqd=done default=ignore]        pam_unix.so debug
account [success=1 default=ignore]                              pam_ldap.so debug
account requisite                                               pam_deny.so debug
account required                                                pam_permit.so debug

common-password:

password    sufficient    pam_unix.so md5 obscure min=4 max=12 nullok try_first_pass
password    sufficient    pam_ldap.so
password    required      pam_deny.so


common-session:

# Это не весь файл, недостающие строки из приведённых ниже нужно вставлять в конец файла, соблюдая порядок следования
session     required        pam_unix.so 
session     [success=ok default=ignore]     pam_ldap.so minimum_uid=1000
session     optional                        pam_mkhomedir.so skel=/etc/skel umask=0077

NOTE: Безусловно очень важный и полезный, модуль pam_mkhomedir.so по прихоти разработчиков дистрибутивов может входить, а может и не входить в установку PAM по умолчанию, поэтому обязательно проверьте его наличие прежде, чем прописывать соотв. настройку в файле /etc/pam.d/common-session

/etc/nsswitch.conf:

passwd:         compat ldap [NOTFOUND=return] db
group:          compat ldap [NOTFOUND=return] db
shadow:         compat ldap
# Uncomment following line and comment line next to it if you're plan to use SUDO+LDAP
#sudoers:        ldap files
sudoers:        files
hosts:          files dns
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis


/etc/ldap.secret:

echo -n 'ROOT_PASS' | sudo tee /etc/ldap.secret &>/dev/null

где ROOT_PASS пароль rootbinddn'а, прописанного в /etc/ldap.conf. LDAP-объект с dn=rootbinddn используется при BIND'е в LDAP подсистем NSS и PAM, вызываемых из процессов с EUID=0.

Crontab:

5 */2 * * * /usr/sbin/nss_updatedb ldap

(выберите удобную для вас частоту обновления локального кеша данных NSS, получаемых из LDAP)

What to do after all:
  1. После установки всех нужных пакетов и настройки конфигов, выполните первичную закачку данных в кеш NSS (/usr/sbin/nss_updatedb ldap)
  2. Остановите демон кеширования NSS (sudo service nscd stop), выполните getent passwd, запустите демон кеширования снова
  3. Если вы хотите использовать один домашний каталог для какой-либо локальной учётной записи и аккаунта из LDAP, нет ничего проще: переименуйте при необходимости домашний каталог локального пользователя в соотв. с homeDirectory в LDAP, поменяйте локальному пользователю uidNumber на тот, что прописан в LDAP — и пользуйтесь двумя формально разными учётными записями с одним домашним каталогом и одинаковыми правами доступа к ФС

Полезные ссылки:

P.S. У меня сейчас нет возможности писать полноценную инструкцию, буду очень признателен за ваши комментарии. Если возникнут какие-то вопросы, предложения, если я что-то забыл и т.д. — пишите!

Компиляция BerkeleyDB для сборки OpenLDAP из исходников

  • LDAP
Сервер OpenLDAP для своей работы как правило требует хотя бы более-менее свежую версию Oracle BerkeleyDB. К сожалению, есть такие дистрибутивы, которые очень сложно или вовсе невозможно обновить, не переустанавливая (CentOS) и есть аналогичные энтерпрайз-решения, с которыми в общем таже беда (RedHat ES). При этом на BerkeleyDB завязаны многие дистрибутивные пакеты, а взаимодействие с этим движком файловых БД реализовано столь грамотно и удобно, что простая смена минорного номера версии запросто приводит к неработоспособности всего софта, который был скомпилирован для версии более старой. Так что же делать?
Ответ очевиден и прост до гениальности одновременно: компилировать движок BerkeleyDB отдельно так, чтобы только OpenLDAP его и «увидел».
Для начала установим BerkeleyDB (простейший вариант, без переопределения PREFIX'а установки — ибо ну и пусть себе следует прямой наводкой в /usr/local):


[[ -d ~/Compile ]] || mkdir ~/Compile
tar -xvf ~/Downloads/db-5.2.36.tar.gz -C ~/Compile
cd ~/Compile/db-5.2.36/build_unix
../dist/configure --enable-posixmutexes --with-mutex=POSIX/pthreads
make && su -c 'make install'


Ну а теперь компилируем OpenLDAP, не забыв показать скрипту configure, где лежит заветный BerkeleyDB:

CFLAGS=-L/usr/local/BerkeleyDB.5.2/lib CPPFLAGS=-I/usr/local/BerkeleyDB.5.2/include ./configure <здесь_могли_быть_ваши_опции>

Собственно, всё, с новым OpenLDAP'ом вас, господа!

P.S. Идея довольно простая, но тем не менее многие люди, включая и меня до недавнего времени, не решаются компилировать BerkeleyDB напрямую или пытаются обновить BDB, упираясь в непроходимы(й идиотизм)е дебри системы обновления своего дистрибутива: ведь даже в Gentoo пересобрать BDB для одного-единственного приложения не так-то просто…

Проект Pro-LDAP.ru

  • LDAP
Хочу представить свой проект Pro-LDAP.ru (Про LDAP по-русски), http://pro-ldap.ru/. О целях проекта рассказано на его главной странице, если коротко, хотелось бы собрать в одном месте максимум информации на русском языке, которая могла бы принести реальную пользу системным администраторам, занимающимся службами каталогов.
В ближайших планах: в 2011 году закончить перевод OpenLDAP 2.4 Admin Guide (текущий вариант перевода http://pro-ldap.ru/tr/admin24/), в 2012 — перевести man-страницы OpenLDAP.
Хотелось бы услышать Вашу оценку (критическую, разумеется) качества перевода, а также предложения по дальнейшему развитию проекта, нужен ли на сайте форум и т. п.
Если есть желание помочь с переводом, либо предоставить хорошие статьи/материалы, пишите, адреса есть на главной странице сайта проекта. Буду благодарен за любую помощь!

Что стало с OpenDS?

  • LDAP
OpenDS продолжает развиваться, но под новым именем. Теперь он называется OpenDJ. Недавно вышла его свежая версия — OpenDJ 2.4. Разработку ведёт Людовик Пуату в рамках своих трудовых обязанностей, которые он исполняет в компании ForgeRock. OpenDS, поменяв название на OpenDJ остаётся одним из лучших открытых серверов каталогов промышленного уровня, при этом OpenDJ является неотъемлемой частью инфраструктуры IDM-продуктов ForgeRock, что в купе с наблюдаемым высоким темпом его разработки вселяет определённый оптимизм относительно определённости перспектив данного ПО.

Чем отличается AD от "нормальных" LDAP каталогов?

Распространнным заблуждением является то, что Active Directory — вроде бы какой-то особый LDAP-сервер с присущими ему «волшебными» таинственно-проприетарными свойствами.
Вкратце скажу, что это не так: Active Directory вполне обычный LDAP-каталог, со своими плюсами и минусами и способы доступа к нему тоже вполне обычны.
Например, возьмём операцию BIND. BiND — это не только самый популярный DNS-сервер в мире от известной компании ISC, но ещё и операция аутентификации пользователя на LDAP-сервере, ассоциирующая его с тем или иным DN, либо же, в случае, если пользователь предпочёл оставаться инкогнито, он будет ассоциирован с таким всеобъемлющим понятием как «anonymous»
Читать дальше →

BASH Tips&Tricks #0004: Как получить "читабельный" LDIF-вывод

  • BASH
Что нам потребуется:
ldapsearch из поставки OpenLDAP 2.4.24, потому что начиная с этой версии появилась возможность отключить автоформатирование вывода с переносом строк благодаря опции ldif-wrap=no;
base64 — утилита из состава coreurils. Вероятнее всего, что она у вас уже есть;
bash — как известно, жизнь без него в Linux уныла и скучна :)

Как это делается:
ldapsearch ВАШИ_ОПЦИИ -o ldif-wrap=no ФИЛЬТР_ПОИСКА АТРИБУТЫ | \
while read l; do echo $l | grep '^\([^:]\+: \|$\)' || echo "${l%%:: *}: $(base64 -d <<<${l#*:: })"; done

Советую облегчить себе жизнь и не копировать каждый раз код из статьи, а добавить соотв. функцию в свой «домашний» ~/.bashrc. Выполните данный код в командной строке, в конце (после EOF) нажмите ENTER:

cat <<'EOF' >> ~/.bashrc

un64ldif () {
 while read l; do
  echo $l | grep '^\([^:]\+: \|$\)' || \
   echo "${l%%:: *}: $(base64 -d <<<${l#*:: })"
 done
 return 0
}
EOF

Сделав это единожды, вы теперь сможете творить чудеса, передавая вывод ldapsearch своей функции по трубе вводы-вывода:
ldapsearch ВАШИ_ОПЦИИ -o ldif-wrap=no ФИЛЬТР_ПОИСКА АТРИБУТЫ | un64ldif

Принудительный 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

Порты контроллера домена

Список портов используемых Active Directory, необходимы для корректной работы клиента и контроллера домена:
UDP 88 — Авторизация Kerberos
UDP/TCP 135 — Операции контроллером домена и контроллером домена или клиентом и контроллером домена.
TCP 139 / UDP 138 — Репликация файлов между контроллерами домена.
UDP 389 — LDAP запросы к контроллеру домена.
TCP/UDP 445 — Служба репликации файлов
TCP/UDP 464 — Смена паролей Kerberos
TCP 3268,3269 — Доступ к глобальному каталогу.
TCP/UDP 53 — DNS запросы от контроллера домена к контроллером домена или клиента к контроллеру домена.
TCP 123 — NTP сервис синхронизирующий время
Для корректного функционирования Active Directory потребуется открывать на файрволе эти порты, если он установлен между клиентом и контроллером домена.
Если все порты открыты, а доступа к домену все равно нет, проверьте, возможно одно из устройств на пути от контроллера домена до клиента по умолчанию блокирует один из портов. Был подобный опыт с модемом от Zyxel.

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

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

BASH Tips&Tricks #0002: Форматируем вывод ldapsearch

  • BASH
Если вам случалось писать на BASH скрипты, работающие с LDAP, то вы наверное уже в курсе, что клиентская утилита ldapsearch, входящая в поставку OpenLDAP, а потому имеющаяся в комплекте большинства дистрибутивов Linux, из каких-то своих соображений (оказывается, это требование RFC 2045) выводит результирующий LDIF со строками, длина которых не превышает 78 символов. Соответственно, те строки, что оказываются длиннее 78-и символов, попросту разбиваются по правилам формата LDIF: в начале продолжения предыдущей строки ставится один пробельный символ.
Анализ такого LDIF на языке оболочки bash может быть затруднительным, гораздо удобнее, когда значение атрибута умещается в одной строке.
Читать дальше →

Беспарольная авторизация на сервере 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