Здравствуйте! У меня похожая задача. Требуется разрешить пользователям менять пароли, админу ветки разрешить создавать, удалять пользователей в своей ветке, менять им пароли. Структура дерева такая
dn: dc=energy,dc=kz
objectClass: top
objectClass: dcObject
objectclass: organization
o: energy
dc: energy
dn: cn=ldaproot,dc=energy,dc=kz
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: ldaproot
userPassword: xxxxxxxx
dn: ou=ellipseast,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseast
dn: ou=staff,ou=ellipseast,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
dn: ou=ellipsepe,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseast
dn: ou=staff,ou=ellipsepe,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
dn: ou=ellipseskz,dc=energy,dc=kz
objectClass: organizationalUnit
ou: ellipseskz
dn: ou=staff,ou=ellipseskz,dc=energy,dc=kz
objectClass: organizationalUnit
ou: staff
В каждой ветке есть админ, который должен иметь права на создание, удаление пользователей в своей ветви, смену их паролей
#dn: uid=ldapadminskz,ou=staff,ou=ellipseskz,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminskz
sn: ldapadminskz
uid: ldapadminskz
userPassword: ххх
dn: uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminast
sn: ldapadminast
uid: ldapadminast
userPassword: ххх
dn: uid=ldapadminpe,ou=staff,ou=ellipsepe,dc=energy,dc=kz
objectClass: person
objectClass: uidObject
objectClass: simpleSecurityObject
objectClass: top
cn: ldapadminpe
sn: ldapadminpe
uid: ldapadminpe
userPassword: ххх
Для начала я сделал ACL для одной ветки
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to to dn.subtree="ou=ellipseast,dc=energy,dc=kz" attrs=userPassword
by self write
by dn.base="uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz" write
by anonymous auth
by * none
olcAccess: {1}to attrs=userPassword
by self write
by anonymous auth
by * none
olcAccess: {2}to dn.subtree="ou=ellipseast,dc=energy,dc=kz"
by dn.base="uid=ldapadminast,ou=staff,ou=ellipseast,dc=energy,dc=kz" write
by * read
olcAccess: {3}to *
by * read
Текущие ACL такие
# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcAccess=*)' olcAccess olcSuffix
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={1}monitor,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
dn: olcDatabase={2}hdb,cn=config
olcSuffix: dc=energy,dc=kz
olcAccess: {0}to * by * read
Когда пытаюсь его загрузить получаю ошибку
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ./2.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
additional info: <olcAccess> handler exited with 1
По ошибке нашёл следующее:
ldap_add: Other (e.g., implementation specific) error (80)
additional info: <olcModuleLoad> handler exited with 1
You are trying to load the same module twice, e.g. you already ran ldapadd on db.ldif once and now you're doing it again.
Я ни как не могу понять, что я гружу дважды. Помогите пожалуйста!
Да, и ещё я не могу понять смысла этого выражения:
olcAccess: to to dn.subtree
Директива to повторяется 2 раза. Это ошибка или нет?