.

Схема AD определяет структуру данных, сохраненных в каталоге. Изначально AD поддерживает много типов объектов (например, пользователи) и атрибутов (например, имя и фамилия). Если базовая схема AD плохо согласуется с данными, которые требуется хранить в каталоге, ее можно дополнить пользовательскими объектами и атрибутами.

Обычно схему AD расширяют по нескольким причинам, самой распространенной из которых во многих организациях является внедрение приложения, требующего расширения схемы. Наглядный пример — Microsoft Exchange. Иногда поставщики программного обеспечения требуют расширить схему для совместимости со своими приложениями. Часто схему расширяют для приложений собственной разработки или для удобства хранения данных компании в AD.

Варианты хранения данных

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

Если данные не соответствуют этим критериям, но все же должны размещаться в каталоге LDAP, оптимален второй вариант. Службы каталогов AD Lightweight Directory Services (AD LDS, в прошлом ADAM) — автономная версия AD, которая может функционировать в качестве службы на сервере, члене домена (или контроллере домена — DC), и, подобно AD, обрабатывать запросы, направляемые к LDAP. Необходимость размещать контроллеры домена AD для проверки подлинности и поддержки приложений — не досадное ограничение, а возможность строго контролировать круг лиц, имеющих право читать данные, и направление репликации данных путем размещения экземпляров AD LDS в соответствующих местах.

Примитивы хранения данных

Ключевую роль для понимания схемы AD играют два термина: класс и атрибут. Все элементы AD, в том числе схема, определяются в рамках классов и атрибутов. Классы — это типы данных, которые требуется хранить. Например, пользователь (user) — класс в AD, как и компьютер (computer). Атрибуты — свойства классов. Класс «пользователь» имеет атрибут «имя» (givenName) и атрибут «фамилия» (sn). Класс «компьютер» имеет атрибут «операционная система». Схема AD определяется в терминах двух классов: classSchema для классов и attributeSchema для атрибутов.

Проводя аналогию с типичной базой данных, можно сравнить классы с таблицами в базе данных, а атрибуты — со столбцами внутри таблицы. Но имейте в виду, что структура базы данных AD Directory Information Tree (DIT) в действительности имеет существенные отличия.

Решая задачу сохранения данных нового типа в AD, необходимо продумать сопоставление данных классам и атрибутам. В наиболее типичных случаях достаточно добавить атрибут к существующему классу (например, пользователю или группе). Если требуется просто сохранить новый фрагмент данных об объекте существующего типа (таком, как пользователь), сначала постарайтесь найти подходящие атрибуты среди имеющихся в AD. Схема содержит тысячи атрибутов, большинство из которых не задействовано. Поэтому, например, чтобы сохранить сведения о почтовом адресе пользователя, можно применить атрибут physicalDeliveryOfficeName.

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

Но иногда возможен только подход на основе классов. В двух случаях удобнее добавить в схему новый класс, нежели использовать атрибуты. Первый из них: необходимость отслеживать новый тип данных в каталоге. Если, например, требуется отслеживать в AD автомобили компании, можно определить в схеме новый класс «автомобиль». Другой случай — сопоставление «один ко многим».

Идеальным примером может служить Microsoft Exchange Server 2010. Каждое мобильное устройство, синхронизированное с Exchange с помощью ActiveSync, сохраняется как экземпляр специального класса объектов msExchActiveSyncDevice в каталоге. Эти мобильные устройства хранятся как дочерние объекты пользователя, владельца устройства. Такая структура обеспечивает сопоставление большого числа атрибутов (для каждого устройства) одному пользователю.

Входные данные для расширения схемы

Чтобы подготовить расширение схемы, необходимо собрать ряд входных данных. Только после этого можно реализовать особый атрибут или класс в среде разработки. Многие входные данные должны быть глобально уникальны, поэтому важно выполнить необходимую подготовку. Небрежность при этом грозит опасными последствиями.

В первую очередь выберите имя класса или атрибута. Самая важная часть имени — префикс. Имена атрибутов и классов в схеме (и в схеме покупателя стороннего приложения) должны быть уникальны, поэтому добавление префикса обеспечит отсутствие конфликтов между идентификаторами атрибутов.

Обычно в качестве префикса применяется сокращенное название компании. Например, я использую bdcLLC в качестве префикса для атрибутов нашей компании Brian Desmond Consulting LLC. Для корпорации ABC можно использовать префикс abcCorp. Обязательно позаботьтесь об уникальности префикса, так как общего реестра префиксов не существует. Если у компании типичное или сокращенное название, придумайте, как придать ему уникальные черты.

После того как имя выбрано, нужно назначить атрибуту или классу идентификатор объекта Object Identifier (OID). Идентификаторы OID — дополнительный компонент, который должен быть глобально уникален. AD (более обобщенно, LDAP) — не единственная структура, в которой OID используется в качестве идентификатора, поэтому организация Internet Assigned Numbers Authority (IANA) назначает уникальные деревья OID по запросам компаний. Запрос номера Private Enterprise Number, который представляет собой часть дерева OID, уникальную для компании, бесплатно обслуживается примерно за 10 минут. Получить его нужно прежде, чем приступить к созданию пользовательских расширений схемы. Запросить номер Private Enterprise Number можно на сайте по адресу www.iana.org/cgi-bin/assignments.pl.

Получив номер Private Enterprise Number, можно создать практически неограниченное количество уникальных идентификаторов OID и упорядочить их. На рисунке показана структура дерева OID для номера Private Enterprise Number нашей компании. Идентификаторы OID строятся путем добавления ветвей к дереву, поэтому многие компании начинают с создания ветви AD Schema (1.3.6.1.4.1.35686.1 на рисунке), а затем под ней формируется ветвь классов и ветвь атрибутов. Под каждой из этих ветвей назначаются идентификаторы OID каждому новому атрибуту или классу. На рисунке показан OID (1.3.6.1.4.1.35686.1.2.1), выделенный пользовательскому атрибуту myCorpImportantAttr. Очень важно подготовить внутренний механизм отслеживания (например, электронную таблицу Excel или список SharePoint), обеспечивающий уникальность идентификаторов OID.

 

Рисунок. Иерархия OID

Компания Microsoft предоставляет сценарий, с помощью которого можно сформировать OID со случайным значением, но нет гарантий, что он окажется уникальным. Лучший способ — запросить уникальную ветвь в организации IANA и задействовать ее для расширений схемы. Этот процесс настолько прост, что использовать сценарий формирования OID компании Microsoft не требуется.

Оставшиеся два входных параметра специфичны для атрибутов и зависят от их типа. Чрезвычайно полезные связанные атрибуты используются для хранения ссылок между объектами в AD. Они хранятся как указатели в базе данных AD, поэтому ссылки своевременно обновляются в соответствии с местоположением объекта в лесу. Два типичных примера связанных атрибутов — членство в группах (member и memberOf) и отношение менеджер/сотрудник (manager/directReports). К связанным атрибутам применяются концепции ссылок вперед и обратных ссылок. Ссылка вперед — редактируемая часть связи между атрибутами. Например, в случае членства в группе атрибут member для группы представляет собой ссылку вперед; атрибут memberOf для пользователя — обратная ссылка. При редактировании членства в группе изменения вносятся в атрибут member (ссылка вперед), а не атрибут memberOf объекта-члена (обратная ссылка).

Чтобы определить связанные атрибуты в AD, необходимо определить два атрибута (ссылку вперед и обратную ссылку) и присоединить идентификатор ссылки (linkID) к каждому из этих атрибутов. Идентификаторы ссылки должны быть уникальными внутри леса, а поскольку идентификаторы ссылок необходимы и другим приложениям, требующим расширения схемы, их нужно сделать глобально уникальными. В прошлом компания Microsoft издавала идентификаторы ссылок для сторонних организаций, но начиная с Windows Server 2003 вместо этого в AD появился специальный указатель, позволяющий формировать уникальные идентификаторы ссылок при дополнении схемы, связанной парой атрибутов.

В AD предполагается, что идентификаторы ссылок являются последовательными числами. В частности, атрибут ссылки вперед — четное число, а следующее за ним число назначается атрибуту обратной ссылки. Например, для member и memberOf (членство в группе) идентификатор ссылки для member равен 4, а идентификатор ссылки для memberOf — 5. Если расширенная схема должна быть совместима с лесом Windows 2000, необходимо определять идентификаторы статических ссылок описанным способом. В противном случае следует использовать процесс автоматического формирования идентификаторов ссылок, реализованный в Windows Server 2003. Для использования автоматического процесса создания идентификаторов ссылок следуйте приведенным ниже рекомендациям, определяя расширение схемы. В процессе расширения схемы, как описано далее в статье, приведенные шаги необходимы для конструирования связанных атрибутов (если они являются частью расширения).

Сначала подготовьте ссылку вперед, используя идентификатор ссылки 1.2.840.113556.1.2.50. Обратите внимание, что, хотя данное значение идентификатора ссылки представляет собой OID, компания Microsoft просто резервирует это значение OID для создания идентификатора автоссылки.

Затем перезагрузите кэш схемы. После этого создайте атрибут обратной ссылки, используя идентификатор ссылки имени атрибута ссылки вперед, и перезагрузите кэш схемы.

Второй уникальный (и также необязательный) элемент атрибутов — идентификатор MAPI. Идентификаторы MAPI — особенность Exchange Server. В отсутствие Exchange или необходимости показывать атрибут в списке глобальных адресов (Global Address List, GAL) этот раздел можно пропустить. Идентификаторы MAPI используются для отображения атрибутов на одной из страниц свойств в адресной книге, такой как шаблон общих деталей пользователя (см. экран). Например, если нужно показать классификацию сотрудников (штатный сотрудник или работник по договору) в списке GAL, назначьте соответствующий атрибут как идентификатор MAPI. После того как идентификатор MAPI назначен атрибуту, можно использовать редактор Exchange Details Templates Editor для ввода данных атрибута в представление в списке GAL внутри Office Outlook.

 

Экран. Общий шаблон пользовательских данных

Идентификаторы MAPI должны быть уникальны, так же как идентификаторы OID и ссылок. В прошлом было невозможно формировать уникальные идентификаторы MAPI, так что эти идентификаторы всегда оказывались слабым местом при расширении схемы. К счастью, в Windows Server 2008 появился способ автоматического формирования уникальных идентификаторов MAPI в каталоге, чтобы уменьшить риск дублирования идентификаторов MAPI. Чтобы воспользоваться этой функцией, присвойте значение 1.2.840.113556.1.2.49 атрибуту идентификатора MAPI при создании атрибута. AD формирует уникальный идентификатор MAPI для атрибута после перезагрузки кэша схемы. Обратите внимание, что, хотя это значение представляет собой OID, оно зарезервировано в AD для указания автоматического формирования идентификаторов MAPI, подобно автоматическому формированию идентификаторов ссылок, описанному выше.

Подведем итог. При планировании расширения схемы необходимо учитывать три важнейших входных параметра. Первый — имя класса или атрибута; второй — уникальный префикс, назначаемый всем классам и атрибутам; третий — OID. Для формирования OID необходимо запросить уникальную ветвь OID в организации IANA. Если предстоит создать связанную пару атрибутов, требуется уникальная пара идентификаторов ссылок. Если нужно показать атрибут в списке GAL Exchange, необходимо задействовать уникальный идентификатор MAPI. Как в случае с идентификаторами ссылок, так и в случае с идентификаторами MAPI, использование процесса автоматического формирования внутри AD предпочтительнее статических значений.

Планирование внедрения

При внедрении пользовательского расширения схемы или расширении схемы с атрибутами и классами поставщика необходимо предпринять предварительные шаги по планированию для защиты целостности леса AD. Первый шаг — проверка расширения схемы.

При подготовке пользовательского расширения схемы используйте временную среду разработки. Службу AD Lightweight Directory Service (AD LDS) можно бесплатно загрузить на рабочие станции Windows XP и Windows 7. На рабочей станции можно создать экземпляр AD LDS, построить расширение схемы в изолированной среде, а затем экспортировать это расширение для последующего импорта в тестовый лес AD. Схема AD LDS совместима с AD, поэтому для экспорта можно использовать LDIFDE. Готовое расширение схемы можно импортировать в тестовый лес AD, а затем убедиться, что импорт выполнен успешно, и важнейшие приложения не пострадали. В отношении AD следует запланировать проверку успешности импорта и правильности репликации в тестовой среде.

Если предстоит проверить расширение схемы в тестовом лесу AD, его схема должна совпадать с производственным лесом. В этом случае тестирование будет полноценным. Можно воспользоваться инструментом AD Schema Analyzer (из состава AD LDS) для обнаружения различий в схеме между двумя лесами AD. В статье «Export, Compare, and Synchronize Active Directory Schemas» на сайте TechNet (http://technet.microsoft.com/en-us/magazine/2009.04.schema.aspx) описан порядок импорта и экспорта расширений схемы, а также способы использования инструмента AD Schema Analyzer. Обратите внимание, что при сравнении схем возможны некоторые различия, в зависимости от пакетов обновления и версий Windows, в частности в индексации атрибутов и хранении отметок об удалении.

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

  • поставляемые в файле LDIF (нескольких файлах LDIF);
  • правильность префиксов атрибутов;
  • зарегистрированные OID;
  • зарегистрированные/автоматически формируемые идентификаторы ссылок;
  • автоматически формируемые идентификаторы MAPI.

LDIF-файлы представляют собой отраслевой стандарт: все расширения схемы должны поставляться в этом формате. Допускается, чтобы в приложениях использовался особый механизм импорта вместо LDIFDE для расширений схемы. Но если расширение поставляется в ином формате, возникают сомнения относительно его корректности и надежности поставщика. В листинге показан образец LDIF для создания атрибута в схеме AD с целью хранения сведений о размере обуви пользователя. Необходимо отметить следующие особенности этого образца расширения схемы.

  • Атрибут снабжен префиксом на основе имени компании-поставщика (Brian Desmond Consulting, LLC: bdcllc).
  • Уникальный OID для атрибута издан с использованием номера Private Enterprise Number, зарегистрированного поставщиком.
  • Атрибут индексирован (search Flags: 1) и доступен в глобальном каталоге (isMemberOfPartialAttributeSet: TRUE).

Также необходимо проверить доступность атрибута в глобальном каталоге Partial Attribute Set (PAS) и правильность индексов, созданных для атрибута, если атрибут будет использоваться в фильтрах поиска LDAP. Кроме того, полезно убедиться, что данные, хранимые в атрибуте, приемлемы для AD в контексте рассмотренных выше ограничений и рекомендаций.

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

Планомерный подход

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

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

Брайан Десмонд (brian@briandesmond.com) — старший консультант компании Moran Technology Consulting в Чикаго. Имеет сертификат Directory Services MVP. Автор книги «Active Directory», ведет блог www.briandesmond.com

Листинг. Пример записей LDIF
dn: CN=bdcllcShoeSize,CN=Schema,CN=Configuration,DC=X
changetype: add
objectClass: top
objectClass: attributeSchema
cn: sfsuLiveServiceEntitlements
attributeID: 1.3.6.1.4.1.35686.100.1.1.2
attributeSyntax: 2.5.5.12
isSingleValued: FALSE
showInAdvancedViewOnly: TRUE
adminDisplayName: bdcllcShoeSize
adminDescription:
 Stores a user’s shoe size
oMSyntax: 64
searchFlags: 1
lDAPDisplayName: bdcllcShoeSize
name: bdcllcShoeSize
schemaIDGUID:: Js+e3rEsAUWMazlPm5hb6w==
isMemberOfPartialAttributeSet: TRUE