@ Карта сайта News Автора!

Bog BOS: LDAP и OpenLDAP

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS

Последнее изменение файла: 2016.05.10
Скопировано с www.bog.pp.ru: 2024.11.21

Bog BOS: LDAP и OpenLDAP

Протокол LDAP (Lightweight Directory Access Protocol, упрощённый протокол службы каталогов) является развитием (упрощением и адаптацией к TCP/IP) стандарта ISO/ITU X.500 (DAP, 1993 год). Используется во всех службах каталогов (NDS/eDirectory, Active Directory, OpenLDAP, iPlanet, Fedora Directory). Версии LDAP: версия 1 (RFC 1487, 1993, не используется), версия 2 (RFC 1777, 1995; RFC 3494, упразднение в 2003), версия 3 (RFC 2251, 1997; RFC 4511). LDAPv3 предусматривает возможность сортировки информации, разбиения на страницы, расширяемые операции, хранение схемы в каталоге, поддержку интернационализации для имён объектов и значений атрибутов, использование SASL для расширения методов аутентификации, возврат ссылки на другой сервер.

Основные понятия

Сервер LDAP представляет средства доступа к логически иерархической БД (реальное хранилище может быть реализовано по другому) клиентам LDAP. Каталог (БД) состоит из записей (объектов, entry). Тип объекта (класс, objectclass) определяется набором атрибутов: имя (регистронезависимо), синонимы, тип значения (синтаксис указывается с помощью OID из RFC 2252), обязательность, возможность объекта иметь несколько атрибутов с данным именем, правила сравнения, поиска подстроки и упорядочивания. Имя класса также является атрибутом объекта. Строки записываются в кодировке UTF-8. Объект может ассоциироваться с несколькими классами. Классы могут быть структурными (structural, расширение другого класса в пределах дерева наследования, начиная от класса Top), вспомогательными (auxiliary) и абстрактными (abstract, их можно только наследовать, но нельзя использовать непосредственно; например, класс Top является абстактным). Классу назначается уникальный иерархический идентификатор объекта (object identifier, OID, требуется регистрировать в IANA). Кроме простых объектов имеются контейнеры (группировка объектов и контейнеров), псевдонимы (символьные ссылки), переадресация клиента к другому каталогу (переход по ссылкам, chasing referrals). Иерархическая совокупность объектов (вложение контейнеров) определяет дерево каталога. Правила связывания определяются набором правил, который называется схемой каталога (в схему входят также описания классов). Дерево начинается от корневого объекта (Root, класс Top в Active Directory). Поиск объекта в иерархии производится с помощью составного имени. Каждый объект имеет относительное отличительное имя (Relative Distinguished Name). Полное отличительное имя объекта (DN) образуется конкатенацией RDN объекта с DN объекта верхнего уровня (порядок записи - от младшего к старшему, разделитель - точка). Может быть только один объект с указанным DN. RDN уникален на своём уровне. Корневой DN определяет пространство имён дерева (namespace, Directory Information Tree, DIT). LDAP сервер (DSA, Directory System Agent) может обслуживать несколько пространств имён (соответственно, иметь несколько корней). Их список приводится в Root DSE (DSA-Specific Entry). Имеется несколько традиционных способов выстраивания иерархии: по доменному имени (компоненты доменного имени записываются от младшего к старшему - "dc=company,dc=com"), по географической иерархии (o=company,l=moscow,st=moscow,c=ru) и локальное (dc=company). Каждый объект имеет владельца. В качестве идентификатора аутентификации также используется DN (cn=,dc=). Имеется выделенный администратор каталога, обладающий корневыми полномочиями. Для аутентификации используется расширяемый механизм SASL. Имеется возможность анонимного доступа. Права доступа - чтение, запись. ACL не стандартизованы. Поддерживается репликация. Хранение БД LDAP оптимизируют для операций чтения. Транзакций нет.

Общие имена атрибутов:

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

Клиент может:

Стандартный TCP порт сервера LDAP - 389 (возможность использования протокола UDP зарезервирована, но не используется). Для шифрования может использоваться TLS (SSL) (порт 636).

LDIF (LDAP Data Interchange Format, RFC 2849) - стандарт на экспорт каталога в текстовый файл с целью дальнейшего импорта файла на другой сервер. Описания объектов также разделяются пустой строкой. Текстовый файл в каждой строке содержит имя и значение одного атрибута. Если атрибут имеет несколько значений, то они записываются на нескольких строчках. Имя атрибута 'dn' используется для задания DN имени объекта. Имя атрибута objectClass используется для определения класса (типа) объекта. Имя атрибута отделяется от значения строкой ': ' (значение в кодировке UTF-8), строкой ':: ' (значение в кодировке base64), строкой ':< ' (указывается URI, по которому находится значение; обычно file:///...). Строки, начинающиеся с '#', являются комментариями. Продолжение строки обозначается пробелом или табуляцией в первой позиции следующей строки. Формат LDIF позволяет изменять объекты с помощью псевдоатрибута changetype и его значений (каждое изменение завершается символом "-" вместо пустой строки):

OpenLDAP

Разрабатывается OpenLDAP Foundation. Лицензия своя (BSD-like). Стабильная версия - 2.3.39 (20071118); RHEL 4.5 - версия 2.2.13; RHEL 5 - 2.3.43; RHEL 6 - 2.4.23. Пакеты - openldap, openldap-devel, openldap-clients, openldap-servers (openldap-servers-overlays, openldap-servers-sql). В качестве внутреннего хранилища используется Berkeley DB (Sleepycat Software, куплена Oracle в 2006 году, /var/lib/ldap, каждый атрибут в отдельном файле имя-атрибута.bdb, права доступа к каталогу - ldap:ldap 700).

Клиентские программы и библиотеки (ldap - LDAP, lber - кодировка BER/DER). Файл настройки - /etc/openldap/ldap.conf (ldap.conf.5) и ~/.ldaprc или ~/ldaprc или ./ldaprc (перекрывают общесистемные настройки). Переменная окружения LDAPNOINIT отключает все установки по умолчанию. С помощью переменных LDAPCONF (абсолютный или относительный путь) и LDAPRC (имя файла в текущем или домашнем каталоге) можно задать имена дополнительных файлов настройки. Значение опции XYZ можно установить с помощью переменной окружения LDAPXYZ. Опции:

Опции SASL аутентификации:

Опции TLS:

Настройки сервера (документация в /usr/share/doc/openldap-servers-2.3.43/guide.html и slapd.8) в файле /etc/openldap/slapd.conf (должен иметь права доступа root:ldap 640). Опции (комментарий начинается с '#'; начинающаяся с пробела строка является продолжением):

Модули схемы находятся в каталоге /etc/openldap/schema (берутся командами include из slapd.conf). Сертификат SSL/TLS - /etc/pki/tls/certs/slapd.pem.

Параметры запуска сервера (можно задать в /etc/sysconfig/ldap с помощью переменных окружения SLAPD_OPTIONS, SLURPD_OPTIONS, SLAPD_LDAPS, SLAPD_LDAPI; сервис ldap в /etc/init.d/ldap; эффективный пользователь ldap):

Скрипт запуска сервера - /etc/rc.d/init.d/ldap (можно использовать стандартные команды chkconfig и service, имя сервиса - ldap)

slurpd - сервер репликации.

Утилиты для работы с каталогом

Утилита slappasswd позволяет создавать хеш пароля для дальнейшего использования в качестве значения атрибута userPassword или опции rootpw файла slapd.conf. Параметры:

Клиентские утилиты для работы с файлами в формате LDIF и доступа к каталогу:

Модуль аутентификации для SASL (cyrus-sasl-ldap).

Наполнение каталогов для нескольких доменов

Редактируем slapd.conf для работы с несколькими доменами:

...
allow bind_v2
...
database        bdb
suffix          "dc=company1"
rootdn          "cn=root,dc=company1"
rootpw          {SSHA}хешированный-пароль
directory       /var/lib/ldap-company1
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

...

Создаём объекты верхнего уровня для каждого домена:

cat << EOF | ldapadd  -v -x -D 'cn=root,dc=company1' -W
dn: dc=company1
objectClass: top
objectClass: domain
#objectClass: dcObject
#objectClass: organization
dc: company1
o: название организации
description: дополнительная информация
l: местность (город)
st: область
street: улица и номер дома
postalCode: почтовый индекс
postalAddress: почтовый адрес
telephoneNumber: номер рабочего телефона
facsimileTelephoneNumber: номер факса
EOF

Создаём объекты ou=people для каждого домена:

cat << EOF | ldapadd  -v -x -D 'cn=root,dc=company1' -W
dn: ou=people,dc=company1
objectClass: top
objectClass: organizationalUnit
ou: people
EOF

Можно разбить адресную книгу по подразделениям:

cat << EOF | ldapadd  -v -x -D 'cn=root,dc=company1' -W
dn: ou=IT,ou=people,dc=company1
objectClass: top
objectClass: organizationalUnit
ou: IT
EOF

Создаём объекты для каждого сотрудника (значения атрибутов не наследуются):

cat << EOF | ldapadd  -v -x -D 'cn=root,dc=company1' -W
dn: uid=vasiliy_pupkin,ou=people,dc=company1
uid: vasiliy_pupkin
cn: Пупкин Василий
sn: Пупкин
gn: Василий
initials: В.И.
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
#objectClass: residentialPerson
#objectClass: newPilotPerson
objectClass: userSecurityInformation
telephoneNumber: номер рабочего телефона
mobile: номер сотового телефона
homePhone: номер домашнего телефона
faximileTelephoneNumber: номер факса
mail: адрес электронной почты
description: дополнительная информация
title: название должности (номер комнаты)
departmentNumber: название отдела
ou: название отдела
physicalDeliveryOfficeName: 
roomNumber: 
employeeNumber:
employeeType: permanent
jpegPhoto:
o: название организации
street: улица и номер дома
streetAddress: улица и номер дома
l: местность (город)
st: регион
postalCode: почтовый индекс
postalAddress: почтовый адрес
postOfficeBox: почтовый адрес
EOF

Для редактирования можно использовать LDAPTLS_CACERT=файл gq.

Использование в адресных книгах

Thunderbird использует LDAPv3. Добавление LDAP-сервера в адресную книгу: выбрать в меню Address Book -> File -> New -> LDAP, настроить имя книги , имя (адрес) хоста , DN базы (dc=company1 ). Результаты в prefs.js. Поиск производится при введении строки поиска в поле (ничего нажимать не надо, поиск производится по мере ввода) по cn, givenName, sn и считывает следующий список атрибутов: modifytimestamp, xmozillausehtmlmail, description, notes, custom4, custom3, custom2, custom1, birthyear, homeurl, workurl, nscpaimscreenname, countryname, company, o, departmentnumber, department, orgunit, ou, title, zip, postalcode, region, st, locality, l, streetaddress, postofficebox, carphone, cellphone, mobile, pagerphone, pager, facsimiletelephonenumber, fax, homephone, telephonenumber, xmozillasecondemail, mail, xmozillanickname, displayname, commonname, cn, surname, sn, givenname.

Mozilla имеет возможности расширенного поиска (например, по имени отдела и т.д.).

The Bat использует LDAPv2, делает поиск по cn и считывает следующий список атрибутов: display-name, cn, commonName, mail, otherMailbox, givenName, sn, surname, st, c, l, co, organizationName, o, ou, organizationalUnitName, URL, homePhone, facsimileTelephoneNumber, otherFacsimileTelephoneNumber, OfficeFax, mobile, otherPager, OfficePager, pager, info, title, telephoneNumber, homePostalAddress, postalAddress, streetAddress, street, department, comment, postalCode, physicalDeliveryOfficeName, initials, objectClass, uid, uniqueIdentifier, userCertificate, userSMIMECertificate.

Outlook Express. Добавление LDAP-сервера в адресную книгу: выбрать в меню Адрес -> Сервис -> Учётные записи -> Добавить. Сервер каталогов: имя или адрес хоста. Затем изменить свойства (имя книги, основа поиска). Поиск производится по нажатию кнопки "Поиск людей", вводу параметров и нажатию кнопки "Найти". Предварительно опрашивается список возможносте сервера: subschemaSubentry, dsServiceName, namingContexts, defaultNamingContext, schemaNamingContext, configurationNamingContext, rootDomainNamingContext, supportedControl, supportedLDAPVersion, supportedLDAPPolicies, supportedSASLMechanisms, dnsHostName, ldapServiceName, serverName, supportedCapabilities. По умолчанию поиск по атрибутам cn, givenName, sn, но можно искать по "имя и адрес" (cn), "электронная почта" (mail), имени (givenName), фамилии (sn), организации (o). Считывает следующий список атрибутов: display-name, cn, commonName, mail, otherMailbox, givenName, sn, surname, st, c, co, organizationName, o, ou, organizationalUnitName, URL, homePhone, facsimileTelephoneNumber, otherFacsimileTelephoneNumber, OfficeFax, mobile, otherPager, OfficePager, pager, info, title, telephoneNumber, l, homePostalAddress, postalAddress, streetAddress, street, department, comment, postalCode, physicalDeliveryOfficeName, initials, conferenceInformation, userCertificate;binary, userSMIMECertificate;binary, labeledURI, Manager, Reports, IPPhone.

Чтобы сохранять всю необходимую информацию о человеке его запись должна иметь классы: top, person, organizationalPerson, inetOrgPerson, residentialPerson.

gq

gq представляет собой графический визуализатор каталогов LDAP и схем. Имеется поиск и возможность внесения изменений. После изменения параметров сервера необходимо перезапустить программу. Довольно удобно. Отсутствует в новых дистрибутивах.

lbe

lbe представляет собой графический визуализатор каталогов LDAP. Имеется поиск и возможность внесения изменений. Отсутствует в новых дистрибутивах.

ldapvi

Терминальный интерактивный LDAP клиент. Позволяет сделать запрос к LDAP-серверу, отредактировать (vi) результат и отослать обратно:

если имеются общесистемные настройки ldap клиентов:

ldapvi -D 'cn=root,dc=имя-домена' '(uid=имя-пользователя)' 

если ldap клиент не настроен:

LDAPTLS_CACERT=имя-файла ldapvi --host имя-хоста --user cn=root,dc=имя-домена
       --bind simple --base dc=имя-домена --starttls --tls strict
Directory administrator is a smart LDAP directory management tool. It can be
used to manage UNIX and SAMBA user accounts and groups in a single sign-on
setup, corporate address book information, host-based access control and
advanced mail routing. It's extremely easy to install and use, yet powerful
at the same time. Along with popular software, it's the preferred solution
for single sign-on maintenance.

cpu.i386                                 1.4.3-0.1.fc3.rf       dag
Matched from:
CPU is an LDAP user management tool written in C and loosely based on
FreeBSD's pw(8). The goal of CPU is to be a suitable replacement of
the useradd/usermod/userdel utilities for administrators using an LDAP
backend and wishing to have a suite of command line tools for doing
the administration.

lat-1.2.3-4.fc10.x86_64 - MONO
URL         : http://dev.mmgsecurity.com/projects/lat/
Summary     : LDAP Administration Tool
Description :
LAT stands for LDAP Administration Tool. The tool allows you to browse
LDAP-based directories and add/edit/delete entries contained within. It can
store profiles for quick access to different servers. There are also
different views available such as Users, Groups and Hosts that allow you to
manage objects easily without having to deal with the intricacies of LDAP.


LDAP, NSS и PAM (и немножко SSSD)

LDAP можно использовать при выборе сервисов имён с помощью NSS и аутентификации с помощью PAM (пакет nss_ldap, nss_ldap.5, pam_ldap.5).

Запись пользователя должна иметь класс posixAccount с заполненными атрибутами uid, cn, loginShell, uidNumber, gidNumber, homeDirectory и gecos.

Необходимо завести специального пользователя для чтения шифрованных паролей (предлагается proxyuser)

cat << EOF | ldapadd  -v -x -D 'cn=root,dc=company1' -W
dn: cn=proxyuser,dc=company1
cn: proxyuser
sn: proxyuser
objectclass: top
objectclass: person
userPassword: результат-slappasswd
EOF

Права доступа в slapd.conf

access to attrs=userPassword
  by self write
  by anonymous auth
  by dn="cn=proxyuser,dc=имя" read
# если мы хотим, чтобы пользователи могли менять себе пароль (ставить выше правила для root!)
#  by dn="cn=proxyuser,dc=имя" write
  by dn="cn=root,dc=имя" write
  by * none
access to *
  by dn="cn=root,dc=имя" write
  by * read

Скрипты миграции (/usr/share/openldap/migration из пакета openldap-servers) помогают перейти от хранения информации о пользователях, группах, переадресации почты и пр. в текстовых файлах (/etc/groups, /etc/passwd и др.) к хранению её в LDAP. Процесс миграции:

В CentOS 7.1 почти всё работает сразу после (добавить "enumerate = true" в секцию "[domain/default]" файла /etc/sssd/sssd.conf)

authconfig - -enableshadow - -passalgo=sha512 - -enableldap - -enableldapauth - -enableldaptls - -ldaploadcacert=ftp://ftp.cs.niisi.ras.ru/pub/local/ca.crt - -ldapserver=ldap.cs.niisi.ras.ru - -ldapbasedn=dc=ORVS - -enablecache - -enablesssd - -enablesssdauth - -enablecachecreds - -enablelocauthorize

В прочих надо помучиться.

Разложить /etc/openldap/cacerts/ca.crt.

Конфигурационный файл на клиентских хостах для обращения к серверу LDAP - /etc/openldap/ldap.conf

Пароль proxyuser в /etc/ldap.secret, mode 0600.

Конфигурационный файл на клиентских хостах (не для CentOS6! Там есть упомянутые выше /etc/openldap/ldap.conf и ниже /etc/nslcd.conf (/etc/pam_ldap.conf)) для обращения к серверу LDAP для NSS и PAM - /etc/ldap.conf. В нём надо настроить параметры

Для sssd настроить /etc/sssd/sssd.conf (root:root 0600) и запустить службу sssd (service и chkconfig) (как-то здесь обходится без proxyuser, в /etc/ssh/sshd_config необходимо "UsePAM yes"):

[sssd]
config_file_version = 2
services = nss, pam
domains = default

[nss]
filter_groups = root
filter_users = root

[pam]

[domain/default]
auth_provider = ldap
ldap_id_use_start_tls = False
chpass_provider = ldap
cache_credentials = True
ldap_search_base = dc=компания
id_provider = ldap
ldap_uri = ldaps://имя-сервера/
ldap_tls_cacert = /etc/openldap/cacerts/ca.crt # положить файл сюда!
enumerate = true # замедляет работу, но без него не работает "getent passwd"

В CentOS6 /etc/ldap.conf (/etc/openldap/ldap.conf) переехал в /etc/nslcd.conf (/etc/pam_ldap.conf).

authconfig-tui корёжит /etc/ldap.conf и /etc/nsswitch.conf, так что настроить вручную на клиентских хостах

В CentOS6 пытается найти /etc/pam_ldap.secret вместо /etc/ldap.secret.

Возможно, что после перехода на LDAP придётся перезапустить некоторые службы, например, gdm, crond и sge_execd.

Использование LDAP в exim

Cyrus-IMAP должен подхватывать LDAP автоматически при использовании saslauthd в режиме pam (после перехода необходимо перезапустить saslauthd). Однако на одном из хостов столкнулся с тем, что эта связка работает, если запускать "saslauthd -a pam -m /var/run/saslauthd" вручную (или через cron), но не работает если запускать через service или rc.local. Этот забавный эффект получился в результате работы SELinux: рассылал /etc/ldap.conf командой scp без сохранения контекста безопасности, напустить "restorecon -rvv" на /etc.

Сервер jabber настроен на использование PAM и настраивается на использование LDAP автоматически.

Теперь можно почистить /etc/passwd, /etc/shadow и /etc/group. Проверить результат можно с помощью "getent passwd" (не работает в CentOS6).

При большой нагрузке необходимо добавить в /etc/sysconfig/ldap

ULIMIT_SETTINGS="-n 4096"

phpLDAPadmin

LDAP клиент phpLDAPadmin (пакет phpldapadmin 1.0.1) для apache позволяет просматривать и изменять данные LDAP сервера. Есть русский интерфейс.

Настройка соединения с LDAP сервером в /etc/phpldapadmin/config.php: (пароль шифрования кук, язык, ограничения на поиск, имя сервера LDAP, URI сервера LDAP, порт, базовый DN, метод авторизации (где хранить пароль доступа к серверу LDAP), использовать ли STARTTLS и SASL, метод хеширования пароля в userPassword, правила привязывания при обращении к LDAP).

Настройки Apache в /etc/httpd/conf.d/phpldapadmin.conf и по аналогии в /etc/httpd/conf.d/ssl.conf.

Потребовалось поставить "TLS_REQCERT never" в /etc/openldap/ldap.conf (TLS_CACERTDIR и TLS_CACERTFILE не воспринимаются).

При смене пароля необходимо выбирать md5crypt.

Fedora Directory Server (aka Red Hat Directory Server, aka 389 server)

В 2005 году фирма Red Hat приобрела Netscape Directory Server и выпустала его открытую часть под названием Red Hat Directory Server. После переписывания закрытых частей был выпущен Fedora Directory Server, затем переименованный в 389 Directory Server (389-ds-base, 389-ds, 389-adminutil). Позднее из Fedora Directory Server получился Red Hat Directory Server 8.0 (известен также как CentOS Directory Server: centos-ds-base, centos-ds, adminutil). Fedora Directory Server послужил основой freeIPA.

Ссылки

@ Карта сайта News Автора!

Bog BOS: LDAP и OpenLDAP

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru