Как использовать файлы LDIF для внесения изменений в систему OpenLDAP

Вступление

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

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

Предпосылки

Перед началом работы с этим руководством у вас должен быть доступ к серверу OpenLDAP. Вы можете узнать, как настроить сервер OpenLDAPhere. Вы должны быть знакомы с основной терминологией, используемой при работе со службой каталогов LDAP. This guide можно использовать для более подробного ознакомления с этими темами.

Формат LDIF

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

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

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

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

Добавление записей в DIT

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

Список записей для добавления в DIT

Самый основной метод определения новых записей для добавления в LDAP - это просто перечислить записи в полном объеме, точно так же, как они обычно отображаются с использованием инструментов LDAP. Это начинается с DN (отличительного имени), в котором будет создана запись, после индикатораdn::

dn: ou=newgroup,dc=example,dc=com

В строке выше мы ссылаемся на несколько пар ключ-значение, чтобы построить DN для нашей новой записи. При значениях атрибутаsetting необходимо использовать двоеточие и пробел. Вместо атрибутов / значенийreferencing следует использовать знак равенства.

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

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

Вы можете добавить несколько записей в одном файле. Каждая запись должна быть отделена хотя бы одной полностью пустой строкой:

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=othergroup,dc=example,dc=com
objectClass: organizationalUnit
ou: othergroup

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

Использование «Changetype: Add» для создания новых записей

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

Это очень похоже на метод выше, но мы добавляемchangetype: add непосредственно под спецификацией DN. Например, мы могли бы добавить запись Джона Смита в DIT, которая уже содержит структуруou=People,dc=example,dc=com, используя LDIF следующим образом:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
  manager of the building project, so contact him with any que
 stions.
cn: John Smith
sn: Smith
uid: jsmith1

Это в основном формат, который мы использовали для описания записей до сих пор, за исключением дополнительной строки после спецификации DN. Здесь мы сообщаем LDAP, что внесенное нами изменение является созданием записи. Поскольку мы используем параметрchangetype, эта запись может быть обработана инструментомldapmodify без проблем, что позволяет нам размещать модификации других типов в том же файле LDIF. Параметрchangetype должен стоять сразу после спецификации DN.

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

Как и в последнем разделе, каждая дополнительная запись в том же файле отделена пустой строкой. Комментарии можно использовать, начав строку с символа#. Комментарии должны существовать в отдельной строке. Например, если мы хотим добавить Салли в этот же файл LDIF, мы могли бы разделить две записи следующим образом:

# Add John Smith to the organization
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
  manager of the building project, so contact him with any qu
 estions.
cn: John Smith
sn: Smith
uid: jsmith1

# Add Sally Brown to the organization
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
 e for designing the blue prints and testing the structural int
 egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20

Обработка записей

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

Если вы используете простой формат ввода (без параметраchangetype), вы можете использовать командуldapadd или командуldapmodify с флагом-a, который указывает запись дополнение. Вам нужно будет либо использовать метод SASL для аутентификации с помощью экземпляра LDAP (это выходит за рамки данного руководства), либо связать с учетной записью администратора в вашем DIT и предоставить требуемый пароль.

Например, если бы мы сохранили наши записи из раздела простых записей в файле с именемnewgroups.ldif, команда, которая нам понадобится для обработки файла и добавления новых записей, будет выглядеть примерно так:

ldapadd -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif

Вы также можете использовать комбинациюldapmodify -a для того же результата:

ldapmodify -a -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif

Если вы используете форматsecond с объявлениемchangetype, вы захотите использовать командуldapmodify без флага-a. Поскольку эта команда и формат работает для большинства других модификаций, ее, вероятно, проще использовать для большинства изменений. Если бы мы сохранили два новых пользовательских добавления в файле с именемnewusers.ldif, мы могли бы добавить их в существующее DIT, набрав что-то вроде этого:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newusers.ldif

Это позволит вам добавлять записи в ваш DIT по желанию. Вы можете легко хранить множество записей в одном файле LDIF и заполнить свой DIT одной командой.

Удаление записей из DIT

Мы впервые познакомились с опциейchangetype в последнем разделе. Эта опция предоставляет метод для указания высокоуровневого типа модификации, которую мы хотим сделать. Для удаления записи значение этой опции - «удалить».

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

Например, если мы хотим удалить записьou=othergroup из нашего DIT, наш файл LDIF должен содержать только это:

dn: ou=othergroup,dc=example,dc=com
changetype: delete

Чтобы обработать изменение, вы можете использовать тот же формат, что и дляldapmodify выше. Если мы вызовем файл с запросом на удалениеrmothergroup.ldif, мы применим его следующим образом:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f rmothergroup.ldif

Это немедленно удалит записьou=othergroup из системы.

Изменение атрибутов записи

Изменение атрибутов записи - очень распространенное изменение, которое можно сделать, указавchangetype: modify после DN записи. Типы изменений, которые вы можете вносить в атрибуты, в основном отражают изменения, которые вы можете внести в саму запись. Из-за этого подробности типа запрашиваемого изменения атрибута указываются впоследствии с использованием дополнительных директив.

Добавление атрибута в запись

Например, вы можете добавить атрибут, используя командуadd: послеchangetype: modify. Это должно указать атрибут, который вы хотите добавить. Затем вы должны установить значение атрибута, как обычно. Таким образом, основной формат будет:

dn: entry_to_add_attribute
changetype: modify
add: attribute_type
attribute_type: value_to_set

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

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]
mail: [email protected]

Как видно из второй записи, вы можете указать несколько дополнений одновременно. Атрибутmail допускает несколько значений, поэтому это допустимо.

Вы можете обработать это с помощьюldapmodify как обычно. Если изменение находится в файлеsbrownaddmail.ldif, вы можете ввести:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownaddmail.ldif

Замена значения атрибута в записи

Другим распространенным изменением является изменение существующего значения для атрибута. Мы можем сделать это с помощью параметраreplace: нижеchangetype: modify.

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

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: [email protected]

Имейте в виду, что это заменитevery экземплярmail в записи. Это важно для многозначных атрибутов, которые могут быть определены более одного раза для каждой записи (например,mail). Если вы хотите заменить только одно вхождение атрибута, вам следует использовать опцию attributedelete: (описанную ниже) в сочетании с опцией attributeadd: (описанную выше).

Если это изменение было сохранено в файле с именемsbrownchangemail.ldif, мы можем заменить электронную почту Салли, набрав:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif

Удалить атрибуты из записи

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

Например, это удалит все атрибуты описания в записи Джона Смита:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: description

Однако это приведет к удалению только указанного адреса электронной почты:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
mail: [email protected]

Поскольку ранее мы дали Джону два адреса электронной почты, этот адрес должен быть оставлен без изменений.

Если бы эти изменения были в файлах с именамиjsmithrmdesc.ldif иjsmithrmextramail.ldif, мы могли бы применить их, набрав:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmextramail.ldif

Указание нескольких изменений атрибутов

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

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

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
-
replace: cn
cn: Johnny Smith
-
add: l
l: New York

Чтобы применить все эти изменения в одной команде, мы будем использовать тот же форматldapmodify, который мы использовали все время:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f multichange.ldif

Переименование и перемещение записей

Параметрchangetype: modrdn позволяет переименовывать или перемещать существующие записи. После указанияdn:, на которое вы хотите настроить таргетинг, установите параметрchangetype: modrdn.

Переименование записи

Допустим, мы неправильно набрали имя пользователя Салли, когда изначально вводили его в систему. Поскольку он используется в DN записи, его нельзя просто заменить параметрамиchangetype: modify иreplace:, поскольку RDN записи будет недействительным. Если ее настоящее имя пользователяsbrown200, мы могли бы изменить DN записи, создав любые необходимые атрибуты по пути, с помощью файла LDIF, подобного этому:

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown200
deleteoldrdn: 0

Мы могли бы применить это изменение с этой командой:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fixsallydn.ldif

Это сделало бы полную запись похожей на это:

dn: uid=sbrown200,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
 e for designing the blue prints and testing the structural int
 egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20
uid: sbrown200
mail: [email protected]

Как видите, наше DN было настроено для использования новой пары атрибут / значение. Атрибут был добавлен в запись, чтобы сделать это возможным.

Возможно, вы заметили две вещи в примере выше. Сначала мы устанавливаем опциюdeleteoldrdn равной «0». Во-вторых, результирующая запись содержит какuid: sbrown20, так иuid: sbrown200.

Опцияdeleteoldrdn должна быть установлена ​​при изменении DN записи. Установкаdeleteoldrdn в «0» заставляет LDAP сохранять старый атрибут, используемый в DN, вместе с новым атрибутом в записи. Иногда это то, что вы хотите, но часто вы захотите полностью удалить старый атрибут из записи после изменения DN. Вы можете сделать это, установив вместоdeleteoldrdn значение «1».

Давайте представим, что мы снова сделали ошибку и что настоящее имя пользователя Салли -sbrown2. Мы можем установить дляdeleteoldrdn значение «1», чтобы удалить экземплярsbrown200, который в настоящее время используется в DN, из записи после переименования. Мы продолжим и включим дополнительную паруchangetype: modify иdelete:, чтобы избавиться от другого случайного имени пользователя,sbrown20, поскольку мы сохранили его во время первого переименования:

dn: uid=sbrown200,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 1

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modify
delete: uid
uid: sbrown20

Примените файл так:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fix2sallydn.ldif

Эта комбинация не добавит новое имя пользователя с изменением (sbrown200 будет удалено), а вторая модификация записи удалит исходное значение имени пользователя (sbrown20).

Перемещение записи

Если вам нужно переместить запись в новое место, дополнительной настройкой дляchangetype: modrdn является опцияnewsuperior:. Используя эту опцию, вы можете указать новое местоположение в DIT для перемещения записи в. Это поместит запись под указанным родительским DN во время изменения.

Например, если мы хотим переместить Салли под записьou=superusers, мы могли бы добавить эту запись, а затем переместить ее в нее, набрав:

dn: ou=superusers,dc=example,dc=com
changetype: add
objectClass: organizationalUnit
ou: superusers

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 0
newsuperior: ou=superusers,dc=example,dc=com

Предполагая, что это хранится в файле с именемmksuperuser.ldif, мы можем применить следующие изменения:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f mksuperuser.ldif

Это приводит к движению, а не к копии.

В этом случае мы не хотели фактически изменять RDN записи, поэтому мы установили значениеnewrdn: на то же значение, которое оно имеет в настоящее время. Мы могли бы также легко переименовать во время переезда, если бы мы этого пожелали. В этом случае настройкаnewsuperior: - единственная строка второго изменения, которая фактически влияет на состояние записи.

В сторону: добавление двоичных данных в запись

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

LDAP имеет возможность хранить двоичные данные для определенных атрибутов. Например, классinetOrgPerson позволяет использовать атрибутjpegPhoto, который может использоваться для хранения фотографии человека или значка пользователя. Другой атрибут этого объектного класса, который может использовать двоичные данные, - это атрибутaudio.

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

Например, если у вас есть файл с именемjohn.jpg в каталоге/tmp, вы можете добавить этот файл в запись Джона с помощью файла LDIF, который выглядит следующим образом:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///tmp/john.jpg

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

Это будет работать так же с аудио файлом:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: audio
audio:< file:///tmp/hellojohn.mp3

После обработки файла LDIF фактический файл будет закодирован в вашей службе каталогов LDAP. Это важно иметь в виду, потому что добавление значительного числа таких файлов будет влиять на размер и производительность вашего сервиса.

Когда вам нужно получить закодированные данные с помощью инструментаldapsearch, вам нужно будет добавить флаг-t, который позволит записать файл в каталог/tmp. Сгенерированное имя файла будет указано в результатах.

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

ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"

Результат поиска будет выглядеть так:

вывод ldapsearch

dn: uid=jsmith1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
sn: Smith
uid: jsmith1
cn: Johnny Smith
l: New York
audio:< file:///tmp/ldapsearch-audio-n5GRF6

Если мы перейдем в каталог/tmp, мы сможем найти файл. Он может быть переименован по мере необходимости и должен быть в том же состоянии, в котором он находился до ввода его в каталог.

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

Заключение

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