У меня следующая конфигурация сервера openldap:
access to attrs=userPassword
by self write
by anonymous auth
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * none
# Allow everybody adding and changing Contacts
access to dn.subtree="ou=Contacts,dc=my-company,dc=de"
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
access to *
by self write
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
Что он должен делать, так это:
Проблема в том, что системные администраторы не могут изменить пароль пользователя. Есть подсказки?
Цитируя Руководство администратора OpenLDAP:
Порядок оценки директив доступа делает важным их размещение в файле конфигурации. Если одна директива доступа более конкретна, чем другая, с точки зрения выбираемых записей, она должна появиться первой в файле конфигурации. Точно так же, если один селектор более конкретен, чем другой, он должен стоять первым в директиве доступа.
Короче говоря, попробуйте следующее:
access to attrs=userPassword
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by self write
by anonymous auth
by * none
# Allow everybody adding and changing Contacts
access to dn.subtree="ou=Contacts,dc=my-company,dc=de"
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
access to *
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by self write
by * read
Кстати, вы действительно хотите предоставить всем пользователям доступ ко всем атрибутам их собственного объекта ('доступ к * ... путем самостоятельной записи')? Поскольку вы ограничиваете доступ на запись к атрибуту userPassword только в первом ACL, я бы сказал, что это не то, что вы хотели.
IIRC slapd использует первое правило сопоставления. Поскольку первый блок соответствует userPassword, но не позволяет системным администраторам изменять, им не разрешается изменять.
Что произойдет, если вы это сделаете?
access to dn.subtree"[cn=users,ou=Group,dc=my-company,dc=de]"
by self write
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read