Поиск по сайту:

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


Введение

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

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

Предпосылки

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

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 для нашей новой записи. При установке значений атрибутов необходимо использовать двоеточие и пробел. При ссылке на атрибуты/значения вместо них следует использовать знак равенства.

В простейшем формате 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. Например, мы можем добавить запись John Smith в 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), вы можете использовать команду ldapdd или команду ldapmodify с параметром -a, который указывает добавление записи. Вам потребуется либо использовать метод SASL для аутентификации в экземпляре LDAP (это выходит за рамки данного руководства), либо привязаться к учетной записи администратора в своем DIT и указать требуемый пароль.

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

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

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

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

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

  1. 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, мы применим его так:

  1. 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: sbrown@example.com

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: jsmith1@example.com
mail: johnsmith@example.com

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

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

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

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

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

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

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: sbrown2@example.com

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

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

  1. 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: jsmith1@example.com

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

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

  1. ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
  2. 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, который мы использовали все это время:

  1. 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

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

  1. 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: sbrown2@example.com

Как видите, наше 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

Примените файл следующим образом:

  1. 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, мы могли бы применить следующие изменения:

  1. 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 каталог. Сгенерированное имя файла будет указано в результатах.

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

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

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

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. Также важно знать, как изменять записи с помощью этих методов в целях администрирования, при настройке исходной службы каталогов и при устранении проблем, которые могут препятствовать правильному доступу клиентов к вашим данным.