Рейтинг
+2.26

LDAP

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

Microhint: Загрузка модуля OpenLDAP требует 2 файла, а не 1!

  • LDAP
Модули, содержащиеся в contrib исходных кодов openldap'а (и любые другие), требуют для своей загрузки не только файл с расширением ".la", но и соответствующий файл с расширением ".so", лежащий в одном каталоге с ".la".

Проблема может возникнуть из-за того, что неторопливсые люди наподобие меня могут получить в результате простого make'а соответствующего модуля файл с расширением ".la", скопировать его в каталог olcModulePath, радостно попытаться модуль подгрузить olcModuleLoad'ом и… получить «file not found» в логах, который по какому-то глупому недоразумению разработчиков OpenLDAP ссылается не на нехватку ".so", а на якобы отсутствие ".la". Но вы-то знаете, что этот файл на самом деле есть!
А в действительности файлик с расширением ".so" создаётся make install'ом, и без него модуль грузится не будет.

Ларчик как всегда просто открывался, но на будущее нужно запомнить :)

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

  • 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 ) )


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

Компиляция OpenLDAP: хватит спотыкаться!

  • LDAP
После того, как я уже в 10-й раз споткнулся об одну и ту же дурацкую проблему, решил наконец записать себе на память и другим на заметку:
При компиляции OpenLDAP с оверлеями и бэкендами в виде модулей недостаточно просто сказать --enable-smth=mod, нужно до этого обязательно упомянуть --enable-modules=yes. Иначе вы просто замучаетесь искать свои модули в логе установки (то есть в сохранённом выводе make install): их там не будет.
Я не знаю, зачем разработчики подложили простым пользователям такую жирную свинью, но забывать о том, что сие животное в самый неподходящий момент может броситься к вам под колёса — совершенно не стоит.

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

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

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

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

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

Интересное за неделю: DogTag

  • LDAP
Поскольку писать полноразмерные статьи не всегда удаётся, да и не всегда есть интересный информационный повод для их напиания, предлагаю вашему вниманию новую рубрику: Интересное за неделю. Собственно, название достаточно красноречиво :)

Итак, DogTag!
DogTag — это не абсолютно новое и даже хороше забытое старое… — ваше и наше светлое будущее. Как часто вам приходится создавать Certification Authority, сталкиваясь с новой IT-инфраструктурой? Думаю, немного чаще, чем всегда. Потому что, строго говоря, именно Certification Authority — это центральный элемент любой системы предоставления доступа для современного web, начиная интранет-сетями студенческих кампусов и заканчивая глобальным и всеведущим OpenID. А что является печальной альтернативой таким интернет-технологиям? Да только Microsoft Solutions с их злыми и своенравными цепными псами kerberos'ами. DogTag же — это OpenSource-проект, который, подобно шампуню и бальзаму в одном флаконе, объединяет две самые открытые, прозрачные и просто технологически прекрасные технологии в одной программе, решая проблему создания CA самым правильным методом из всех возможных. А именно: DogTag использует LDAP-каталог 389 Directory Server в качестве хранилища сертификатов, и если вы раньше не знали об этом, то для вас это должно стать очень хорошей новостью. Потому что OpenCA делает это просто ужасно, а чаще никак, EJBCA правильно публикует сертификаты, но требует минимум магистрской степени бакалавра для понимания принципов своей работы. А вот DogTag прост, удобен, понятен и при этом он — единственный в своём роде (из OpenSource-продуктов) решается признать наконец тот факт, что концепции x500 (DAP) и x509 (PKI/PMI) близкородственны и могут успешно сосуществовать в симбиотических по характеру отношениях!

Схема DUAConfigProfile (RFC4876) для OpenLDAP

  • LDAP
Поскольку уже конвертированной схемы не нашлось, выкладываю свою.
Схема в частности пригодится для интеграции SUDO и LDAP при дословной реализации штатного README на эту тему. Хотя обязательной её назвать нельзя, поскольку в действительности SUDO работает с LDAP-каталогом и без неё.

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

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 явно что-то не так.

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