Понимание протокола LDAP, иерархии данных и компонентов ввода

Вступление

LDAP, или облегченный протокол доступа к каталогам, является открытым протоколом, используемым для хранения и извлечения данных из иерархической структуры каталогов. Обычно используемый для хранения информации об организации, ее активах и пользователях, LDAP является гибким решением для определения любого типа объекта и его качеств.

Многим пользователям LDAP может показаться трудным для понимания, поскольку он опирается на специальную терминологию, использует некоторые необычные сокращения и часто реализуется как компонент более крупной системы взаимодействующих частей. В этом руководстве мы познакомим вас с некоторыми основами LDAP, чтобы у вас была хорошая основа для работы с этой технологией.

Что такое служба каталогов?

Служба каталогов используется для хранения, организации и представления данных в формате типа ключ-значение. Как правило, каталоги оптимизированы для поиска, поиска и чтения по сравнению с операциями записи, поэтому они очень хорошо работают с данными, на которые часто ссылаются, но которые изменяются редко.

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

Что такое LDAP?

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

Поскольку LDAP является открытым протоколом, доступно много разных реализаций. Проект OpenLDAP является одним из наиболее поддерживаемых вариантов с открытым исходным кодом.

Основные компоненты данных LDAP

Выше мы обсуждали, как LDAP - это протокол, используемый для связи с базой данных каталогов для запроса, добавления или изменения информации. Однако это простое определение искажает сложность систем, поддерживающих этот протокол. Способ, которым LDAP отображает данные пользователям, очень зависит от взаимодействия и взаимосвязи между некоторыми определенными структурными компонентами.

Атрибуты

Сами данные в системе LDAP в основном хранятся в элементах, называемыхattributes. Атрибуты - это в основном пары ключ-значение. В отличие от некоторых других систем, ключи имеют предопределенные имена, которые определяются объектными классами, выбранными для входа (мы обсудим это немного позже). Кроме того, данные в атрибуте должны соответствовать типу, определенному в начальном определении атрибута.

Установка значения для атрибута выполняется с помощью имени атрибута и значения атрибута, разделенных двоеточием и пробелом. Пример атрибутаmail, который определяет адрес электронной почты, будет выглядеть так:

При обращении к атрибуту и ​​его данным (если он не задан), две стороны вместо этого соединяются знаком равенства:

mail=example.com

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

Записи

Атрибуты сами по себе не очень полезны. Чтобы иметь значение, они должны быть чем-тоassociated. В LDAP вы используете атрибуты в пределахentry. Запись - это набор атрибутов под именем, используемый для описания чего-либо.

Например, вы можете иметь запись для пользователя в вашей системе или для каждого элемента в инвентаре. Это примерно аналогично строке в системе реляционной базы данных или отдельной странице в адресной книге (атрибуты здесь будут представлять различные поля в каждой из этих моделей). В то время как атрибут определяет качество или характеристику чего-либо, запись описывает сам элемент, просто собирая эти атрибуты под именем.

Пример записи, отображаемой в LDIF (формат обмена данными LDAP), будет выглядеть примерно так:

dn: sn=Ellingwood,ou=people,dc=digitalocean,dc=com
objectclass: person
sn: Ellingwood
cn: Justin Ellingwood

Приведенный выше пример может быть допустимой записью в системе LDAP.

DIT

Когда вы начнете знакомиться с LDAP, легко понять, что данные, определяемые атрибутами, представляют только часть доступной информации об объекте. Остальные находят размещение записи в системе LDAP и взаимосвязи, которые это подразумевает.

Например, если возможно иметь записи как для пользователя, так и для элемента инвентаря, как кто-то сможет отличить их друг от друга? Один из способов различать записи разных типов - это установить отношения и группы. Это в значительной степени зависит от того, где находится запись, когда она создается. Все записи добавляются в систему LDAP в виде ветвей на деревьях, называемыхData Information Trees илиDITs.

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

Таким образом, у вас может быть запись для «людей» и запись для «предметов инвентаря». Ваши фактические записи данных могут быть созданы как их потомки, чтобы лучше различать их тип. Ваши организационные записи могут быть произвольно определены для лучшего представления ваших данных.

В примере записи в последнем разделе мы видим одно указание на DIT в строкеdn:

dn: sn=Ellingwood,ou=people,dc=digitalocean,dc=com

Эта строка называется отличительным именем записи (подробнее об этом позже) и используется для идентификации записи. Он функционирует как полный путь к корню DIT. В этом случае у нас есть запись с именемsn=Ellingwood, которую мы создаем. Прямым родителем является запись с именемou=people, которая, вероятно, используется как контейнер для записей, описывающих людей. Родители этой записи являются производными от доменного имениdigitalocean.com, которое функционирует как корень нашего DIT.

Определение компонентов данных LDAP

В последнем разделе мы обсудили, как данные представлены в системе LDAP. Однако мы также должны поговорить о том, как определяются компоненты, хранящие данные. Например, мы упомянули, что данные должны соответствовать типу, определенному для каждого атрибута. Откуда берутся эти определения? Давайте начнем с самого начала с точки зрения сложности и продолжим наш путь.

Определения атрибутов

Атрибуты определяются с использованием довольно сложного синтаксиса. Они должны указывать имя атрибута, любые другие имена, которые могут использоваться для ссылки на атрибут, тип данных, которые могут быть введены, а также множество других метаданных. Эти метаданные могут описывать атрибут, сообщать LDAP, как сортировать или сравнивать значение атрибута, и сообщать, как он относится к другим атрибутам.

Например, это определение атрибутаname:

attributetype ( 2.5.4.41 NAME 'name' DESC 'RFC4519: common supertype of name attributes'
        EQUALITY caseIgnoreMatch
        SUBSTR caseIgnoreSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

'name' - это имя атрибута. Число в первой строке представляет собой глобально уникальный OID (идентификатор объекта), назначенный атрибуту, чтобы отличить его от любого другого атрибута. Остальная часть записи определяет, как запись может сравниваться во время поиска, и имеет указатель, указывающий, где найти информацию для требований к типу данных атрибута.

Одной из важных частей определения атрибута является возможность определения атрибута в записи более одного раза. Например, определение может определять, что фамилия может быть определена только один раз для каждой записи, но атрибут для «племянницы» может позволить этому атрибуту быть определенным несколько раз в одной записи. Атрибуты по умолчанию являются многозначными и должны содержать флагSINGLE-VALUE, если они могут быть установлены только один раз для каждой записи.

Определения атрибутов намного сложнее, чем использование и установка атрибутов. К счастью, по большей части вам не придется определять свои собственные атрибуты, потому что наиболее распространенные из них включены в большинство реализаций LDAP, а другие легко доступны для импорта.

Определения ObjectClass

Атрибуты собираются внутри сущностей, называемыхobjectClasses. ObjectClasses - это просто группы связанных атрибутов, которые были бы полезны при описании конкретной вещи. Например, «человек» - это объектный класс.

Записи получают возможность использовать атрибуты объектного класса, устанавливая специальный атрибут с именемobjectClass, называющий объектный класс, который вы хотите использовать. Фактически,objectClass - единственный атрибут, который вы можете установить в записи без указания дополнительного объектного класса.

Итак, если вы создаете запись для описания человека, включаяobjectClass person (или любой из более конкретных объектных классов person, производных от person - мы рассмотрим это позже), вы можете использовать все атрибуты внутри этого объектного класса:

dn: . . .
objectClass: person

Затем у вас будет возможность установить эти атрибуты в записи:

  • cn: общее имя

  • description: удобочитаемое описание записи

  • seeAlso: ссылка на связанные записи

  • sn: Фамилия

  • telephoneNumber: номер телефона

  • userPassword: пароль для пользователя

АтрибутobjectClass можно использовать несколько раз, если вам нужны атрибуты из разных объектных классов, но есть правила, определяющие, что приемлемо. Классы объектов определены как один из нескольких «типов».

Два основных типа объектных классов - этоstructural илиauxiliary. Записьmust имеет ровно один структурный класс, но может иметь ноль или более вспомогательных классов, используемых для расширения атрибутов, доступных этому классу. Структурный objectClass используется для создания и определения записи, в то время как вспомогательные objectClass добавляют дополнительную функциональность через дополнительные атрибуты.

Определения ObjectClass определяют, являются ли предоставляемые ими атрибуты обязательными (указываются спецификациейMUST) или необязательными (указываются спецификациейMAY). Несколько объектных классов могут предоставлять одни и те же атрибуты, а категоризация атрибутаMAY илиMUST может варьироваться от объектного класса к объектному.

Например, объектный классperson определяется следующим образом:

objectclass ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL
  MUST ( sn $ cn )
  MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

Это определяется как структурный объектный класс, что означает, что его можно использовать для создания записи. Созданная записьmust устанавливает атрибутыsurname иcommonname и может выбрать установкуuserPassword,telephoneNumber,seeAlso илиdescription атрибуты.

Schemas

Определения ObjectClass и определения атрибутов, в свою очередь, сгруппированы вместе в конструкцию, известную какschema. В отличие от традиционных реляционных баз данных, схемы в LDAP являются просто коллекциями связанных объектных классов и атрибутов. Один DIT может иметь много разных схем, так что он может создавать записи и атрибуты, в которых он нуждается.

Схемы часто включают дополнительные определения атрибутов и могут требовать атрибутов, определенных в других схемах. Например, объектный классperson, который мы обсуждали выше, требует, чтобы атрибутsurname илиsn был установлен для любых записей, использующих объектный классperson. Если они не определены на самом сервере LDAP, можно использовать схему, содержащую эти определения, чтобы добавить эти определения в словарь сервера.

Формат схемы, в основном, представляет собой комбинацию приведенных выше записей, например:

. . .

objectclass ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL
  MUST ( sn $ cn )
  MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' )
  DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name )

attributetype ( 2.5.4.4 NAME ( 'cn' 'commonName' )
  DESC 'RFC4519: common name(s) for which the entity is known by' SUP name )

. . .

Организация данных

Мы рассмотрели общие элементы, которые используются для создания записей в системе LDAP, и поговорили о том, как эти строительные блоки определяются в системе. Однако мы пока мало говорили о том, как сама информация организована и структурирована в рамках DIT LDAP.

Размещение записей в DIT

DIT - это просто иерархия, описывающая отношения существующих записей. После создания каждая новая запись должна «подключаться» к существующему DIT, помещая себя в качестве дочернего элемента существующей записи. Это создает древовидную структуру, которая используется для определения отношений и назначения значения.

Вершина DIT - это самая широкая классификация, при которой каждый последующий узел каким-то образом является потомком. Как правило, самая верхняя запись просто используется в качестве метки, указывающей организацию, для которой используется DIT. Эти записи могут относиться к любым нужным объектным классам, но обычно они создаются с использованием компонентов домена (dc=example,dc=com для управляющей информации LDAP, связанной сexample.com), местоположений (l=new_york,c=us для организации или сегмента в NY) или организационные сегменты (ou=marketing,o=Example_Co).

Записи, используемые для организации (используемые как папки), часто используют объектный класс organizationUnit, который позволяет использовать простую описательную метку атрибута под названиемou=. Они часто используются для общих категорий в записи DIT верхнего уровня (распространены такие вещи, какou=people,ou=groups иou=inventory). LDAP оптимизирован для нахождения информации в боковом направлении вдоль дерева, а не вверх и вниз по дереву, поэтому часто лучше сохранять иерархию DIT довольно мелкой, с общими организационными ветвями и дальнейшим подразделением, указанным посредством назначения определенных атрибутов.

Присвоение имен и ссылок на записи в DIT

Мы ссылаемся на записи по их атрибутам. Это означает, что каждая запись должна иметь атрибут или группу атрибутов, которые являются однозначными на своем уровне в иерархии DIT. Этот атрибут или группа атрибутов называетсяrelative distinguished name илиRDN записи и действует как имя файла.

Чтобы однозначно сослаться на запись, вы используете RDN записи в сочетании со всеми RDN родительских записей. Эта цепочка RDN ведет обратно к вершине иерархии DIT и обеспечивает однозначный путь к рассматриваемой записи. Мы называем эту цепочку RDN записьюdistinguished name илиDN. Необходимо указать DN для записи во время создания, чтобы система LDAP знала, где разместить новую запись, и могла гарантировать, что RDN записи уже не используется другой записью.

В качестве аналогии вы можете рассматривать RDN как относительное имя файла или каталога, как вы видели бы в файловой системе. DN, с другой стороны, более аналогичен абсолютному пути. Важное различие заключается в том, что DN LDAP содержат наиболее конкретное значение на сторонеleft-hand, а пути к файлам содержат наиболее конкретную информацию на сторонеright-hand. DN разделяют значения RDN запятой.

Например, запись для человека по имени Джон Смит может быть помещена под записью «Люди» для организации вexample.com. Поскольку в организации может быть несколько John Smiths, идентификатор пользователя может быть лучшим выбором для RDN записи. Запись может быть указана так:

dn: uid=jsmith1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
cn: John Smith
sn: Smith
uid: jsmith1

Нам пришлось использовать объектный классinetOrgPerson, чтобы получить доступ к атрибутуuid в этом экземпляре (у нас все еще есть доступ ко всем атрибутам, определенным в объектном классеperson, как мы увидим в следующий раздел).

Наследование LDAP

Когда дело доходит до этого, большая часть того, как данные в системе LDAP связаны друг с другом, зависит от иерархии, наследования и вложенности. LDAP изначально кажется необычным для многих людей, потому что он реализует некоторые объектно-ориентированные концепции в своем дизайне. В основном это происходит из-за использования классов, как мы уже обсуждали ранее, и наличия наследования, о котором мы сейчас поговорим.

ObjectClass Inheritance

Каждый объектный класс - это класс, который описывает характеристики объектов этого типа.

Однако, в отличие от простого наследования, объекты в LDAP могут быть и часто являются экземплярами нескольких классов (некоторые языки программирования предоставляют аналогичные функциональные возможности посредством множественного наследования). Это возможно, потому что концепция класса LDAP - это просто набор атрибутов, которые он ДОЛЖЕН или МОЖЕТ иметь. Это позволяет указать несколько классов для записи (хотя может и должен присутствовать только один объектный классSTRUCTURAL), в результате чего объект просто имеет доступ к объединенной коллекции атрибутов с самым строгим объявлением MUST или MAY, имеющим приоритет.

В своем определении objectClass может идентифицировать родительский objectClass, от которого наследуются его атрибуты. Это делается с помощьюSUP, за которым следует объектный класс, от которого следует наследовать. Например, объектный классorganizationalPerson начинается так:

objectclass ( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL
 . . .

ObjectClass, следующий за идентификаторомSUP, является родительским objectClass. Родительский класс должен разделять тип objectClass определяемого объектного класса (например,STRUCTURAL илиAUXILIARY). Дочерний объектный класс автоматически наследует атрибуты и требования к атрибутам родителя.

При назначении objectClass в записи, вам нужно только указать наиболее специфический потомок цепочки наследования, чтобы иметь доступ к атрибутам на всем пути вверх. В последнем разделе мы использовали это, чтобы указатьinetOrgPerson как единственный объектный класс для нашей записи Джона Смита, сохраняя при этом доступ к атрибутам, определенным в объектных классахperson иorganizationalPerson. Иерархия наследованияinetOrgPerson выглядит так:

inetOrgPerson -> organizationalPerson -> person -> top

Почти все деревья наследования objectClass заканчиваются специальным objectClass, который называется top. Это абстрактный objectClass, единственная цель которого состоит в том, чтобы требовать установки самого objectClass. Он используется для обозначения вершины цепочки наследования.

Наследование атрибутов

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

Это часто используется для создания более определенных версий общего атрибута. Например, фамилия является типом имени и может использовать все те же методы для сравнения и проверки на равенство. Он может наследовать эти качества, чтобы получить общую форму атрибута «имя». На самом деле фактическое определение фамилии может содержать чуть больше, чем указатель на родительский атрибут.

Это полезно, поскольку позволяет создавать определенный атрибут, который будет полезен для людей, интерпретирующих элемент, даже если его общая форма остается неизменной. Наследование атрибутаsurname, которое мы обсуждали здесь, помогает людям различать фамилию и более общее имя, но кроме значения значения, существует небольшая разница между фамилией и именем в системе LDAP.

Варианты протокола LDAP

Вначале мы упоминали, что LDAP - это всего лишь протокол, который определяет интерфейс связи для работы со службами каталогов. Обычно это называется протоколом LDAP или ldap.

Стоит отметить, что вы можете увидеть несколько вариантов в обычном формате:

  • ldap://: это основной протокол LDAP, который обеспечивает структурированный доступ к службе каталогов.

  • ldaps://: этот вариант используется для указания LDAP через SSL / TLS. Обычный трафик LDAP не зашифрован, хотя большинство реализаций LDAP поддерживают это. Этот метод шифрования соединений LDAP фактически устарел, и вместо этого рекомендуется использовать шифрование STARTTLS. Если вы используете LDAP по небезопасной сети, настоятельно рекомендуется шифрование.

  • ldapi://: используется для обозначения LDAP через IPC. Это часто используется для безопасного соединения с локальной системой LDAP в административных целях. Он связывается через внутренние сокеты, а не через открытый сетевой порт.

Все три формата используют протокол LDAP, но последние два указывают дополнительную информацию о том, как он используется.

Заключение

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

Related