Я новичок в LDAP и, вероятно, совершаю действительно глупую ошибку, так что, надеюсь, кто-нибудь сможет указать мне правильное направление. Я запускаю slapd из openldap 2.4.23 под Linux. Проблема, с которой я столкнулся, заключается в том, что из учетной записи управления, которую я установил в slapd.conf (cn = Manager, dc = example, dc = com), я могу без проблем установить пароль конечного пользователя:
# ldappasswd -D 'cn=Manager,dc=example,dc=com' -W -S 'uid=tsuraan,ou=People,dc=example,dc=com'
Однако с точки зрения конечного пользователя я могу выполнять поиск и тому подобное, но я не могу изменить пароль:
$ ldapsearch -x -D "uid=tsuraan,ou=People,dc=example,dc=com" -W
Enter LDAP Password:
<results>
$ ldappasswd -D 'uid=tsuraan,ou=People,dc=example,dc=com' -W -S 'uid=tsuraan,ou=People,dc=example,dc=com'
New password:
Re-enter new password:
Enter LDAP Password:
Result: Insufficient access (50)
Я также пробовал использовать ldapmodify для прямого изменения атрибута userPassword, и он дает то же сообщение «Недостаточный доступ» (50). Мой раздел ACL slapd выглядит так:
access to *
by dn="uid=root,ou=People,dc=example,dc=com" write
by users read
by self write
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
access to attrs="userPassword"
by dn="uid=root,ou=People,dc=example,dc=com" write
by anonymous auth
by self write
by * none
И у меня есть пользователь без полномочий root, чей LDIF выглядит так:
dn: uid=tsuraan,ou=People,dc=example,dc=com
uid: tsuraan
cn: tsuraan
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}x
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/tsuraan
Сегодня Google не любит меня, и я не понимаю, почему мой пользователь не может писать на свой собственный LDAP-узел, учитывая, что у меня везде есть «самопишущий», так что, надеюсь, кто-нибудь сможет мне помочь.
Lists of access directives are evaluated in the order they appear in
slapd.conf. When a <what> clause matches the datum whose access is
being evaluated, its <who> clause list is checked. When a <who> clause
matches the accessor's properties, its <access> and <control> clauses
are evaluated. Access control checking stops at the first match of the
<what> and <who> clause, unless otherwise dictated by the <control>
clause.
Первое совпадение <what>
и <who>
для попытки смены пароля:
access to *
by users read
Если вы переместите предложение «доступ к *» в конец списка, все должно работать нормально. Или просто поменяйте местами «читают пользователи» и «самостоятельно пишут».
ACL - это самая сложная часть конфигурации OpenLDAP, поэтому прочтите slapd.access(5)
внимательно и убедитесь, что вы полностью поняли, как работают ACL, прежде чем писать что-нибудь нетривиальное.