ACL OpenLDAP не работает — Код ошибки 50 — Нет доступа на запись к родительскому

#ldap #acl #openldap #apache-directory

#ldap #acl #openldap #apache-каталог

Вопрос:

Я построил пару серверов OpenLDAP для службы приложений. Оба сервера кажутся совершенно нормальными на стороне конфигурации, и я могу управлять ими с помощью Apache Directory Studio как RootDN cn= admin, dc= somedomain, dc = com. И репликация между ними тоже работает. Они построены на RHEL8 путем компиляции исходного кода OpenLDAP, поскольку серверные пакеты OpenLDAP больше не предоставляются. Версия OpenLDAP — 2.4.52.

Я могу создавать подразделения, а также пользователей через Directory Studio и использовать одно из них в приложении для целей аутентификации в качестве учетной записи службы. В этом случае пользователь — uid = svc-admin, ou = Admins, ou = People, dc = somedomain, dc = com и подразделения, как показано ниже:

  • ou=Администраторы, ou= Люди, dc=somedomain, dc= com
  • ou= Читатели, ou= Люди, dc= somedomain, dc= com
  • ou=Пользователи, ou= Люди, dc=somedomain, dc=com

Теперь требуется, чтобы пользователь svc-admin должен иметь права на запись / полные права для вышеуказанных подразделений, поскольку приложение предназначено для предоставления новых пользователей, и оно будет записывать данные в вышеуказанные подразделения, используя svc-admin в качестве учетной записи службы. Он должен иметь возможность создавать пользователей и изменять их атрибуты.

Я создал ACL и смог применить его с помощью ldapmodify, однако, когда я подключаюсь к серверу LDAP в качестве svc-администратора в Apache DS, я могу читать, но не могу изменять или создавать новых пользователей. Когда я это делаю, я получаю сообщение об ошибке как через Apache DS, так и в оболочке. Недостаточно прав — Ошибка 50 — Нет доступа на запись к родительскому.

Вот список ACL, который я использовал:

 dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to dn.subtree="ou=People,dc=somedomain,dc=com" by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write
olcAccess: to dn.subtree="ou=Users,ou=People,dc=somedomain,dc=com" by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write
olcAccess: to dn.subtree="ou=Readers,ou=People,dc=somedomain,dc=com" by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write
 

Это не работает. А вот мои конфигурационные файлы olcDatabase={1}mdb и olcDatabase={0}. Я очистил списки управления доступом, так как от них нет никакой пользы.

База данных OLCD={1}mdb

 # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 54063f10
dn: olcDatabase={1}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap
olcSuffix: dc=somedomain,dc=com
olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowExpire by self wr
 ite by anonymous auth by dn.subtree="gidNumber=0 uidNumber=0,cn=peercred,cn
 =external,cn=auth" manage  by * none
olcAccess: {1}to dn.subtree="dc=somedomain,dc=com" by dn.subtree="gidNumber=
 0 uidNumber=0,cn=peercred,cn=external,cn=auth" manage by users read by * re
 ad
olcRootDN: cn=admin,dc=somedomain,dc=com
olcRootPW:: e1NTSEF9dkc0ZkIyYkZrYVduNU1BbTdkAHQ5ZXE0WlFEUHBSSGk=
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn pres,eq,approx,sub
olcDbIndex: mail pres,eq,sub
olcDbIndex: objectClass pres,eq
olcDbIndex: loginShell pres,eq
olcDbIndex: entryCSN eq
olcDbIndex: entryUUID eq
olcDbMaxSize: 42949672960
structuralObjectClass: olcMdbConfig
entryUUID: 3b57a8aa-b1d8-103a-87d6-7198db52aeab
creatorsName: gidNumber=0 uidNumber=0,cn=peercred,cn=external,cn=auth
createTimestamp: 20201103042439Z
olcSyncrepl: {0}rid=003 provider=ldaps://ldapserver01.somedomain.com binddn="
 cn=admin,dc=somedomain,dc=com" bindmethod=simple credentials="TestCreds" s
 earchbase="dc=somedomain,dc=com" type=refreshAndPersist timeout=0 network-t
 imeout=0 retry="30 5 300  "
olcSyncrepl: {1}rid=004 provider=ldaps://ldapserver02.somedomain.com binddn="
 cn=admin,dc=somedomain,dc=com" bindmethod=simple credentials="TestCreds" s
 earchbase="dc=somedomain,dc=com" type=refreshAndPersist timeout=0 network-t
 imeout=0 retry="30 5 300  "
olcMirrorMode: TRUE
entryCSN: 20210202222100.054442Z#000000#001#000000
modifiersName: gidNumber=0 uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20210202222100Z
 

olcDatabase={0}конфигурация:

 # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 f2b26838
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to dn.base="" by * read
olcAccess: {1}to dn.base="cn=Subschema" by * read
olcAccess: {2}to *  by dn.base="gidNumber=0 uidNumber=0,cn=peercred,cn=exter
 nal,cn=auth" manage  by self write by users read by anonymous auth
olcRootDN: cn=config
structuralObjectClass: olcDatabaseConfig
entryUUID: f1608708-b1d7-103a-8934-b724f0ebd8c8
creatorsName: cn=config
createTimestamp: 20201103042234Z
olcRootPW:: e1NTSEF9dkc0ZkIyYkZrYVduNU1BbTdkAHQ5ZXE0WlFEUHBSSGk=
olcSyncrepl: {0}rid=001 provider=ldaps://ldapserver01.ugo-wallet.com binddn="
 cn=config" bindmethod=simple credentials="TestCreds" searchbase="cn=config
 " type=refreshAndPersist timeout=0 network-timeout=0 retry="30 5 300  "
olcSyncrepl: {1}rid=002 provider=ldaps://ldapserver02.ugo-wallet.com binddn="
 cn=config" bindmethod=simple credentials="TestCreds" searchbase="cn=config
 " type=refreshAndPersist timeout=0 network-timeout=0 retry="30 5 300  "
olcMirrorMode: TRUE
entryCSN: 20210202221926.832349Z#000000#001#000000
modifiersName: gidNumber=0 uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20210202221926Z
 

Как я могу это решить. Любая помощь в решении этой проблемы приветствуется.

Комментарии:

1. Я не вижу, где вы успешно применили LDIF к olcDatabase={1} базе данных. Эти olcAccess записи должны появиться в нем, но они этого не делают.

2. Я знаю. Я упоминал в сообщении. Я удалил эти списки управления доступом, поскольку они не работали.

3. Так в чем же смысл публикации файла конфигурации, который не используется?

Ответ №1:

Я думаю, что это может быть неподходящий подход, но он сработал для меня. Я удалил приведенные ниже списки управления доступом из olcDatabase={1}mdb..

 olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowExpire by self wr
 ite by anonymous auth by dn.subtree="gidNumber=0 uidNumber=0,cn=peercred,cn
 =external,cn=auth" manage  by * none
olcAccess: {1}to dn.subtree="dc=somedomain,dc=com" by dn.subtree="gidNumber=
 0 uidNumber=0,cn=peercred,cn=external,cn=auth" manage by users read by * re
 ad
 

.. и добавьте приведенные ниже в файл LDIF, и теперь учетная запись пользователя svc-admin может делать все, что требуется в этом приложении.

 dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword by self write by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write by * read
olcAccess: {2}to dn.subtree="ou=People,dc=somedomain,dc=com" by dn.exact="uid=svc-admin,ou=Admins,ou=People,dc=somedomain,dc=com" write
olcAccess: {3}to * by * read