Внесение изменений в систему OpenLDAP с помощью файлов LDIF

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

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

Требования

Формат LDIF

LDIF (или LDAP Data Interchange Format) – это текстовый формат для представления данных и команд LDAP. При использовании системы LDAP вы, скорее всего, будете использовать формат LDIF для указания данных и изменений, которые вы хотите внести в LDAP DIT.

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

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

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

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

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

Перечисление записей в DIT

Самый простой способ определения новых записей для LDAP – это просто перечислить все записи целиком, точно так же, как они обычно отображаются инструментами LDAP. Запись начинается с DN (distinguished name, отличительное имя).

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

Это похоже на метод, который мы рассмотрели выше, но непосредственно под спецификацией DN нужно указать changetype: add. Например, чтобы добавить запись 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. Поскольку следующие строки начинаются с пробела, они будут объединены, а пробелы удалены. Первая дополнительная строка в данном примере содержит еще один пробел, но это часть самого предложения, разделяющая слова «project» и «manager».

Ккаждая дополнительная запись в том же файле разделяется пустой строкой. Комментарии должны начинаться с символа # и находиться в отдельной строке. Например, чтобы добавить в этот же 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 с флагом -а, который обрабатывает добавление записи. Вам нужно либо использовать метод 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

Если вы используете второй формат, с объявлением 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. Этот параметр – метод для указания типа модификации высокого уровня. Для удаления записи нужно установить здесь значение delete

Удаление записи – это фактически самое простое изменение, которое вы можете выполнить, потому что единственной необходимой информацией является 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: 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, вы можете ввести:

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

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

Если изменение хранится в файле sbrownchangemail.ldif, почту можно заменить с помощью:

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

Удаление атрибутов из записи

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

Например, это приведет к удалению каждого атрибута description в этой записи:

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

Поскольку в этой записи указано два атрибута mail, второй атрибут останется в ней.

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

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

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

Как видите, теперь DN использует новую пару «ключ-значение». Для этого атрибут был добавлен в запись.

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

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

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

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

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

Например, чтобы переместить Sally в запись 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, который может использоваться для хранения фотографии или значка пользователя. Другим атрибутом objectClass, который может использовать бинарные данные, является атрибут 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"
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, вы сможете найти файл. По мере необходимости его можно переименовать.

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

Tags: , ,