Рейтинг
+2.26

LDAP

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

Permission denied при чтении конфигурационной директории OpenLDAP

  • LDAP
Столкнулся с такой загадочной проблемой: при попытке считать свою конфигурационную директорию, а именно файл cn=config.ldif, LDAP-сервер из штатной поставки Ubuntu 11.10 Oneiric страшно ругается Permission denied и спешно завершается.
Никаких объективных предпосылок для этого нет, права на чтение/запись пользователю openldap даны, sudo -u openldap cat <config_path>/cn=config.ldif отрабатывает правильно. И уж совсем странно, что будучи запущенным под рутом без опций -u и -g, slapd точно также не может получить доступ к своей конфигурации. Запустил его с strace'ом: на привилегированный порт 389 биндится, effective user id не меняет, к счастью, никаких chroot'ов без спроса не делает, но… но в итоге slapd всё равно благополучно валится:

open("/etc/openldap/domains/DOMAIN/conf/cn=config.ldif", O_RDONLY) = -1 EACCES (Permission denied)

Проблема решилась очень просто: взял исходники с openldap.org и собрал из исходников, получив совершенно адекватную рабочую версию сервера.
Ещё попробую изучить вопрос, но в любом случае предупреждаю, что в Ubuntu со штатной сборкой slapd явно что-то не так.

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 аля «путешествие Афанасия Никитина за три моря» и массу потенциального геморроя.

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

Динамические списки внутри не "списочных" объектов

  • LDAP
Положим, у вас уже есть объект с описанием отдела фирмы, содержащим массу полезных атрибутов, включая фотографию начальника в костюме деда мороза и ряженных в зайчиков подчинённых с последнего корпоратива. И вот возникла задача собрать ещё и список сотрудников внутри объекта отдела и формировать его, разумеется, не вручную, а, как и положено в лучших домах Лондона и Парижа, динамически.
Читать дальше →

RFC 3062 и метод хеширования паролей

  • LDAP
Все мы знаем или, возможно даже, предстоит нам ещё узнать о том, что в LDAP предусмотрена такая атомарная операция как «LDAP Modify Password». Описана она в RFC3062, реализована во всех известных мне серверах каталогов — разумеется, и в OpenLDAP тоже. Пароли хранятся в атрибуте userPassword, а простейшим типом объекта, включающим данный атрибут, является… ну конечно же simpleSecurityObject (кстати, пусть эта кажущаяся простота не будет для вас обманчивой, ибо этот objectClass AUXILIARY).
Ну да суть не в этом, а в том, что пароли в атрибуте userPassword принято хранить шифрованном виде и при запросе выполнения операции LDAP Modify Password серверу нужно бы выбрать какой-то метод… криптования, хеширования… ну, в общем, превращения пароля во что-то неудобочитаемое и не подлежащее восстановлению. Каким же образом можно сказать, например, серверу OpenLDAP использовать… положим, MD5 вместо SSHA, используемого по умолчанию? Для нужды сией существует атрибут с говорящим названием olcPasswordHash, значение которого должно быть представлено в формате {МЕТОД_ШИФРОВАНИЯ}, т.е. применительно к упомянутому выше гипотетическому случаю наличия потребности иметь все пароли захешированными в MD5, Вам нужно будет изменить глобальную конфигурацию cn=config (ниже)следующим образом:
dn: cn=config
changeType: modify
add: olcPasswordHash
olcPasswordHash: {MD5}

Типичные примеры использования 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

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

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

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. У меня сейчас нет возможности писать полноценную инструкцию, буду очень признателен за ваши комментарии. Если возникнут какие-то вопросы, предложения, если я что-то забыл и т.д. — пишите!

Путь до файла ldap.conf

  • LDAP
В некоторых ситуациях путь до файлов ldap.conf и ldap.secret (настройки модулей nss_ldap и pam_ldap) может быть полезным изменить: например, для объединения настройки клиентских библиотек и утилит из поставки OpenLDAP с настройкой модулей NSS/PAM от padl.com'а (трудно понять, зачем вообще эти файлы с одинаковым синтаксисом и названием опций изначально нужно было разделять), так и, например, для того, чтобы убрать ldap.secret «с глаз долой».
Просто соберите модули поддержки LDAP в NSS/PAM, со следующими опциями configure:

--with-ldap-conf-file=PATH_TO_CONFIG  --with-ldap-secret-file=PATH_TO_PASSWORD_FILE

Кстати, в случае с pam_ldap положение ldap.conf можно указать и динамически — с использованием опции config= в соотв. строке pam.conf или /etc/pam.d/*.

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

  • LDAP
Сервер OpenLDAP для своей работы как правило требует хотя бы более-менее свежую версию Oracle BerkeleyDB. К сожалению, есть такие дистрибутивы, которые очень сложно или вовсе невозможно обновить, не переустанавливая (CentOS) и есть аналогичные энтерпрайз-решения, с которыми в общем таже беда (RedHat ES). При этом