Введение

На этой странице представлено краткое общее описание структуры каталога пользователей LDAP, используемой компанией TrueOffice. С этой структурой взаимодействует TrueOffice LDAP API, позволяющий как получать любую информацию из LDAP, так и модифицировать ее. Более того, фактически стандартом LDAP компании TrueOffice является то, как работает TrueOffice LDAP API.

Подразумевается, что в качестве реализации протокола LDAP используется  OpenLDAP.

Документ не является исчерпывающим источником информации, однако позволяет понять основное устройство структуры каталога LDAP компании TrueOffice.

Общая информация

В LDAP хранятся три основных вида объектов: пользователи, группы и подразделения.

  • В корне дерева всегда стоит подразделение (вся организация).
  • Объект любого типа может располагаться только в подразделении.
  • Имя объекта уникально в подразделении.
GraphViz image

В примере:

  • Подразделения: example, dev и pr.
  • Пользователи: Василий Пупкин, Петр Иванов, Виталий Петров и Алексей Сидоров.
  • Группы: managers и leaders.

Подразделение

Каждое подразделение состоит из трех объектов: подразделение, домен и структурная группа.

Домен и структурная группа являются частью реализации понятия подразделение (в графическом примере они умышлено не показаны). Они обязательно расположены в подразделении (являются его прямыми потомками). Подразделение может содержать только один домен и только одну структурную группу.

Объект подразделение состоит из системного имени (cn) и описания (description). Системное имя представляет собой слово на английском языке, а описание — текст на русском. Описание не является обязательным (может отсутствовать). Название и номер подразделения — это название и номер его структурной группы.

В примере: системные имена подразделений — example, dev и pr.

Домен

Домен состоит из доменного имени (sambaDomainName) и псевдонимов (trueofficeDomainAlias).

Доменное имя образуется от доменного имени домена родительского подразделения добавлением имени подразделения, к которому относится домен. У корневого подразделения домен создается в момент начальной настройки LDAP-сервера.

Псевдонимы домена образуются от псевдонимов родительского домена (аналогично имени). Кроме обязательных, образованных от родителя, псевдонимов домену можно назначить дополнительные псевдонимы. Дополнительные псевдонимы домена становятся обязательными для доменов всех дочерних подразделений. Добавление и удаление дополнительных псевдонимов осуществляется рекурсивно.

В примере:

  • Подразделение example:
    • название домена: example.com;
    • алиасы: ex.com.ru.
  • Подразделение dev:
    • название домена: dev.example.com;
    • алиасы: dev.ex.com.ru и best-developers.ru.
  • Подразделение pr:
    • название домена: pr.example.com;
    • алиасы: pr.ex.com.ru.

Структурная группа

Структурная группа состоит из системного имени (cn), уникального идентификатора (uid), номера группы (gidNumber), списка пользователей (memberUid и sambaSIDList) и названия (displayName).

Любая структурная группа всегда имеет системное имя users.

Уникальный идентификатор структурной группы является именем домена (этого подразделения).

У корневого подразделения структурная группа создается в момент начальной настройки LDAP-сервера.

В списке пользователей указанны не только все пользователи, находящиеся в подразделении, но и дополнительные пользователи (входящие в подразделение).

Название структурной группы не является обязательным и представляет собой несколько слов на русском языке. Название структурной группы используется как название подразделения.

В примере:

  • Подразделение example:
    • системное имя: users;
    • уникальный идентификатор: example.com;
    • список пользователей: Василий Пупкин.
  • Подразделение dev
    • системное имя: users;
    • уникальный идентификатор: dev.example.com;
    • список пользователей: Петр Иванов и Виталий Петров.
  • Подразделение pr
    • системное имя: users;
    • уникальный идентификатор: pr.example.com;
    • список пользователей: Алексей Сидоров (входит) и Виталий Петров (дополнительно).

Пользователь

Пользователь состоит из множества полей. Основные из них:

  • Имя (givenName);
  • Фамилия (sn);
  • Отчество (initials);
  • Отображаемое имя (displayName) — или ФИ или ФИО, разделенные пробелами.
  • Системное имя (cn) — английское написание, в формате: Имя.Фамилия;
  • Уникальный идентификатор (uid) — образуется от системного имени и домена "основного" подразделения (в качестве разделителя используется символ "@" без кавычек);
  • Номер пользователя (uidNumber).

В примере:

  • Пользователь Василий Пупкин:
    • имя: Василий
    • фамилия: Пупкин;
    • системное имя: Vasily.Pupkin;
    • уникальный идентификатор: Vasily.Pupkin@example.com.
  • Пользователь Петр Иванов:
    • имя: Петр;
    • фамилия: Иванов;
    • системное имя: Petr.Ivanov;
    • уникальный идентификатор: Petr.Ivanov@dev.example.com.
  • Пользователь Виталий Петров:
    • имя: Виталий;
    • фамилия: Петров;
    • системное имя: Vitaly.Petrov;
    • уникальный идентификатор: Vitaly.Petrov@dev.example.com.
  • Пользователь Алексей Сидоров:
    • имя: Алексей;
    • фамилия: Сидоров;
    • системное имя: Alexey.Sidorov;
    • уникальный идентификатор: Alexey.Sidorov@pr.example.com.

Почтовые адреса

Почтовые адреса пользователя бывают:

  • Внешние.
  • Внутренние (обслуживаемые сервером организации):
    • обязательные — образуются от системного имени пользователя и всех доменов всех подразделений пользователя (в качестве разделителя используется символ "@" без кавычек);
    • дополнительные — любые свободные почтовые адреса в любом домене, существующем в LDAP.

Внутренние адреса хранятся в атрибуте trueofficeUserMailAlias.

Полный список всех почтовых адресов пользователя (и внешних и внутренних) содержится в атрибуте mail.

Другие данные

Кроме описанного выше, объект пользователя содержит (или может содержать):

  • пол пользователя (trueofficeUserSex);
  • день рождения (trueofficeUserBirthday);
  • район и станцию метро проживания (trueofficeUserDistrict и trueofficeUserSubway);
  • фотографию (аватару) (jpegPhoto);
  • занимаемую должность или должности (employeeType);
  • мобильные и домашние номера телефонов (mobile и homePhone).

Группа

Группа состоит из системного имени (cn), уникального идентификатора (uid), номера группы (gidNumber), списка пользователей (memberUid и sambaSIDList) и названия (displayName).

Системное имя группы — это слово на английском языке.

Уникальный идентификатор группы образуется от системного имени группы и домена (в качестве разделителя используется символ "@" без кавычек).

Группа может иметь описание (description) — текст на русском языке.

В примере:

  • Группа managers:
    • системное имя: managers;
    • уникальный идентификатор: managers@example.com.
  • Группа leaders:
    • системное имя: leaders;
    • уникальный идентификатор: leaders@dev.example.com.

Создателям новых сервисов

Проектирование

При создании новых сервисов, использующих информацию из каталога пользователей, следует исходить из следующих соображений:

  • Каждый сервис использует свои логин и пароль для получения информации из LDAP (анонимный доступ запрещен).
  • При проектировании сервиса необходимо помнить, что единственным постоянным (даже при смене имени и фамилии) атрибутом в пользовательской учетной записи является атрибут uidNumber. Именно на этом атрибуте должна быть основана идентификация пользователя.
  • Информация о пользователях (группах и подразделениях) должна запрашиваться напрямую из LDAP (возможен локальный кэш). В случае невозможности реализации правильного алгоритма работы данные могут храниться локально, при этом должно быть обеспечено регулярное (и автоматическое) обновление информации из LDAP.

Помните, что аутентифицировать пользователя можно на основании практически любого атрибута (uid, ФИО, cn, mail), но после аутентификации необходимо получить uidNumber пользователя и в дальнейшем использовать только его внутри системы для идентификации пользователя.

При проектировании баз данных оптимальным вариантом будет:

  • использование uidNumber в качестве идентификатора пользователя;
  • использование gidNumber в качестве идентификатора группы;
  • использование gidNumber структурной группы в качестве идентификатора подразделения.

При проектировании файлового сервера рекомендуется исходить из следующих соображений:

  • путь к директории, содержащей данные пользователя, генеририруется на основании uidNumber;
  • путь, по которому отображаются данные пользователя, генерируется на основании пути к основному подразделению и системного имени пользователя;
  • на основании путей к дополнительным подразделениям и системного имени пользователя генерируются пути, с которых осуществляется переадресация на основной (по которому данные отображаются);
  • путь к подразделению является конкатенацией системных имен всех подразделений на пути от корня (с разделителем косая черта).

Интерфейс программирования (API)

Для удобства и унификации работы с LDAP создан API для языка программирования PHP.

В Gentoo Linux API может быть установлен с использованием оверлея TrueOffice следующим образом:

# emerge TrueOffice_LDAP

Во всех остальных случаях API может быть установлен с помощью pear:

# pear channel-discover pear.trueoffice.org
# pear install trueoffice/TrueOffice_LDAP-beta

Документация к API отсутствует, однако API содержит подробные примеры использования, которые являются достаточными для понимания всех основных аспектов работы с ним.

Фильтры

При настройке любого программного обеспечения для работы с LDAP стоит использовать перечисленные ниже фильтры.

Получение списка подразделений:

(objectClass=trueofficeOrganizationalUnit)

Получение списка обычных групп:

(objectClass=trueofficeAuxiliaryGroup)

Получение списка структурных групп:

(objectClass=trueofficeStructuralGroup)

Получение списка пользователей:

(objectClass=trueofficeUser)

Получение групп, в которые входит пользователь:

(&(objectClass=trueofficeAuxiliaryGroup)(memberUid=Vasily.Pupkin@example.com))

Дополнительная схема

Компонент OID номера (33335), используемый в схеме, зарегистрирован в  IANA.

# trueoffice.schema
# LDAPv3 enterprise schema made and heavily used by TrueOffice.
# Tested on OpenLDAP 2.3.41.
#
# Copyright (C) 2009 CJSC TrueOffice (www.trueoffice.ru)
# Written by Dmitry Stolyarov <Dmitry.Stolyarov@trueoffice.ru>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version
# 3 of the License, or (at your option) any later version.


attributeType (
 1.3.6.1.4.1.33335.1.1.1
 NAME 'trueofficeUserSex'
 DESC 'User’s sex'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{1}
 SINGLE-VALUE )

attributeType (
 1.3.6.1.4.1.33335.1.1.2
 NAME 'trueofficeUserBirthday'
 DESC 'User’s date of birth'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64}
 SINGLE-VALUE )

attributeType (
 1.3.6.1.4.1.33335.1.1.3
 NAME 'trueofficeUserDistrict'
 DESC 'User’s administrative (geographical) district of the city'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )

attributeType (
 1.3.6.1.4.1.33335.1.1.4
 NAME 'trueofficeUserSubway'
 DESC 'User’s nearest metro stations'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )

attributeType (
 1.3.6.1.4.1.33335.1.1.5
 NAME 'trueofficeUserMailSystem'
 DESC 'User’s system email address (used by mail server)'
 SUP mail
 SINGLE-VALUE )

attributeType (
 1.3.6.1.4.1.33335.1.1.6
 NAME 'trueofficeUserMailPrimary'
 DESC 'User’s primary email address'
 SUP mail
 SINGLE-VALUE )

attributeType (
 1.3.6.1.4.1.33335.1.1.7
 NAME 'trueofficeUserMailAlias'
 DESC 'User’s email address alias'
 SUP mail )

attributeType (
 1.3.6.1.4.1.33335.1.1.8
 NAME 'trueofficeUserMailNotify'
 DESC 'User’s email address for notifications'
 SUP mail
 SINGLE-VALUE )

attributetype (
 1.3.6.1.4.1.33335.1.1.9
 NAME 'trueofficeDomainAlias'
 DESC 'Domain’s alias'
 SUP sambaDomainName )

objectClass (
 1.3.6.1.4.1.33335.1.2.1
 NAME 'trueofficeUser'
 DESC 'User’s LDAP account'
 AUXILIARY
 MUST ( trueofficeUserSex $ trueofficeUserMailSystem $ trueofficeUserMailPrimary $ trueofficeUserMailAlias $ trueofficeUserMailNotify $ givenName $ displayName $ sambaAcctFlags $ mail $ loginShell )
 MAY ( trueofficeUserBirthday $ trueofficeUserDistrict $ trueofficeUserSubway ) )

objectClass (
 1.3.6.1.4.1.33335.1.2.2
 NAME 'trueofficeOrganizationalUnit'
 DESC 'Organizational unit'
 AUXILIARY )

objectClass (
 1.3.6.1.4.1.33335.1.2.3
 NAME 'trueofficeSambaDomain'
 DESC 'Samba domain name'
 AUXILIARY
 MAY trueofficeDomainAlias 
 MUST ( sambaNextRid $ sambaNextGroupRid $ sambaNextUserRid ) )

objectClass (
 1.3.6.1.4.1.33335.1.2.4
 NAME 'trueofficeAuxiliaryGroup'
 DESC 'Auxiliary (secondary) group'
 AUXILIARY )

objectClass (
 1.3.6.1.4.1.33335.1.2.5
 NAME 'trueofficeStructuralGroup'
 DESC 'Structural (primary) group'
 AUXILIARY )

objectClass (
 1.3.6.1.4.1.33335.1.2.6
 NAME 'trueofficeUnixIdPool'
 DESC 'Pool of UNIX IDs used for users and groups'
 AUXILIARY )