Назад | Перейти на главную страницу

Как разрешить группе менять пароли пользователей?

У меня следующая конфигурация сервера 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

Что он должен делать, так это:

  1. позволить каждому менять свой пароль
  2. разрешить всем пользователям добавлять и изменять контакты
  3. разрешить всем в группе "sysadm" изменять все

Проблема в том, что системные администраторы не могут изменить пароль пользователя. Есть подсказки?

Цитируя Руководство администратора 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