1

Я использую ldapadd и хочу добавить тип атрибута в хранилище, чтобы он мог использоваться другими записями.

У меня есть несколько вопросов. Вот мой файл ldif.

dn: dc=myorg,dc=co,dc=uk
changetype: add
add: attributetypes
attributetype: ( 2.2.980.1.1 NAME ( 'ecdvisibility' 'ecdvis' ) DESC 'The visibility of the object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE userApplications )

После проверки строк на наличие пробелов в конце я вижу, что все в порядке:

dn: dc=myorg,dc=co,dc=uk$
changetype: add$
add: attributetypes$
attributetype: ( 2.2.980.1.1 NAME ( 'ecdvisibility' 'ecdvis' )$
  DESC 'The visibility of the object'$
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15$
  SINGLE-VALUE$
  USAGE userApplications )$

то, что я вижу, является таинственной ошибкой, подобной следующей:

ldap_add: неопределенный тип атрибута (17) дополнительная информация: add: тип атрибута не определен

Я не понимаю эту ошибку, тип атрибута не определен, я пытаюсь добавить его ! Также перед этой строкой написано:

добавление новой записи "dc = myorg, dc = co, dc = uk"

Почему это добавляет это, это уже существует. Я также не уверен, должен ли я использовать ldapadd или ldapmodify.

Моя типичная команда:

sudo ldapadd -D cn = admin, dc = myorg, dc = co, dc = uk -w пароль -v -f attributeType.ldif

Я также позаботился о том, чтобы в конце файла была пробная пустая строка, хотя это, похоже, не имеет никакого значения.

Каков наилучший способ добавить такой атрибут, который может использоваться любым пользователем?

Обновить

Я также попробовал следующее:

dn: cn=schema
changetype: modify
add: attributeTypes
##
## The new attribute type
##
attributeTypes: ( ecdvisibility.oid NAME ( 'ecdvisibility' 'ecdvis' ) DESC 'The visibility of the object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE userApplications )

Но на этот раз я получаю эту ошибку:

ldap_modify: неверный синтаксис (21) дополнительная информация: attributeTypes: значение # 0 недопустимо для синтаксиса

Обновление 2:

Прежде чем я смог внести какие-либо изменения, мне пришлось обновить системный пароль, который openldap, кажется, устанавливает в фоновом режиме:

dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: password

Это работало нормально, поэтому я попытался обновить атрибуты.

1-я попытка:

dn: cn=schema,cn=config
changetype: add
olcAttributeTypes: ( ecdvisibility.oid
  NAME ( 'ecdvisibility' 'ecdvis' )
  DESC 'The visibility of the object'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE
  USAGE userApplications )
olcRootDN: cn=config
olcRootPW: password
#objectClass: top

ldap_add: нарушение класса объекта (65) дополнительная информация: нет атрибута objectClass

Комментируя в классе объекта, выдал мне следующую ошибку:

ldap_add: нарушение класса объекта (65) дополнительная информация: класс структурного объекта не предоставлен

Хорошо, так что я попробую inetOrgPerson

ldap_add: нарушение класса объекта (65) дополнительная информация: класс объекта 'inetOrgPerson' требует атрибута 'sn'

Стоп, я не хочу этого делать, я просто хочу добавить тип атрибута, который доступен для ldap, и который может быть добавлен к объекту, когда и при необходимости. Я не хочу указывать отдельный объект или запись в этой точке. Это возможно? Если так, как? Любые дальнейшие советы действительно приветствуются.

Благодаря @grawity, окончательное решение выглядит следующим образом:

dn: cn=test,cn=schema,cn=config
changetype: add
olcAttributeTypes: ( 2.25.247072656268950430024439664556757516066
  NAME ( 'ecdvisibility' 'ecdvis' )
  DESC 'The visibility of the object'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE
  USAGE userApplications )
objectClass: olcSchemaConfig

Я изменил номер OID на один из открытых уникальных номеров, так как использовал недопустимый общедоступный. Тип атрибута был успешно добавлен и может использоваться в другом месте.

1 ответ1

1

Основы

то, что я вижу, является таинственной ошибкой, подобной следующей:

ldap_add: Undefined attribute type (17) additional info: add: attribute type undefined

Я не понимаю эту ошибку, тип атрибута не определен, я пытаюсь добавить его!

Это не говорит о твоих качествах. Речь идет о строке add: attributetypes - она не знает атрибута с именем add .

В LDIF атрибуты add: replace: delete: необходимы только при изменении записи (т. Е. С changetype: modify). Но если вы хотите добавить новую запись, вам нужно только предоставить необработанные данные, ничего больше.

См. Справочную страницу "ldif" для примеров и различий между "добавить" LDIF и "изменить" LDIF.

Также перед этой строкой написано:

adding new entry "dc=myorg,dc=co,dc=uk"

Почему это добавляет это, это уже существует.

Поскольку вы использовали changetype: add - другими словами, вы попросили ldapmodify создать новую запись.

Чтобы уточнить, "добавить новую запись" полностью отделен от «изменить запись, добавив новые атрибуты». Возможные действия:

  • changetype: add - создает новую запись, в точности как указано.
  • changetype: modify - редактирует атрибуты существующей записи, принимает комбинацию из:
    • add: ... - добавить новый атрибут (или добавить больше значений)
    • replace: ... - добавить или полностью перезаписать атрибут
    • delete: ... - удалить атрибут (или определенные значения)
  • changetype: modrdn - изменяет DN (переименовывает или перемещает запись)
  • changetype: delete - удаляет всю запись

Смотрите эту документацию.

Я также не уверен, должен ли я использовать ldapadd или ldapmodify.

Единственная разница между ними заключается в том, какой changetype они используют, если вы не указали их. То есть, ldapadd будет по умолчанию changetype: add и ldapmodify будет по умолчанию changetype: modify

Если вы вручную указываете changetype: в вашем LDIF обе команды становятся идентичными.

Теперь схема

Конфигурация схемы сильно различается между серверами LDAP, и ваш LDIF совершенно не подходит для OpenLDAP. Фактическое описание атрибута хорошо, но его нужно хранить в другом DN, в другом атрибуте.

Начнем с того, что вы не добавляете схему непосредственно в свою обычную базу данных, а в специальное дерево конфигурации - OpenLDAP использует вложенные записи ниже cn=schema,cn=config , с одной olcSchemaConfig на схему.

Атрибуты также начинаются с olc то есть olcAttributeTypes и olcObjectClasses .

Таким образом, чтобы добавить новую схему с 1 атрибутом и нулевыми объектными классами, используйте:

dn: cn=ecd,cn=schema,cn=config
changetype: add
objectClass: olcSchemaConfig
olcAttributeTypes: ( 2.2.980.1.1
  NAME ( 'ecdvisibility' 'ecdvis' )
  DESC 'The visibility of the object'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE
  USAGE userApplications )

Обратите внимание, что OpenLDAP автоматически добавит номер в RDN, например, cn={5}ecd . После этого вы можете добавить больше атрибутов или классов к той же схеме:

dn: cn={5}ecd,cn=schema,cn=config
changetype: modify
add: olcAttributeTypes
olcAttributeTypes: ( 4.5.6.7 NAME 'foo' ... )
olcAttributeTypes: ( 4.5.6.8 NAME 'bar' ... )
-
add: olcObjectClasses
olcObjectClasses: ( 4.5.6.9
  NAME 'ecdwhatever'
  AUXILIARY
  MAY ( ecdvisibility $ foo $ bar ) )
-

(Ли 2.2.980.* OID действительно принадлежит тебе? Если этого не произойдет, то лучше получить свой собственный от IANA.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .