Я экспериментирую с серверами OpenLDAP с репликацией и мне нужно настроить соответствующие списки контроля доступа, чтобы предоставить пользователю репликации право читать все данные на исходном хосте.
После прочтенияЭта статьясоздал этот набор правил:
olcAccess: {0}to * by dn.base="cn=admin,dc=example,dc=com" manage
olcAccess: {1}to * by dn.base="uid=rpuser,dc=example,dc=com" read
olcAccess: {2}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {3}to attrs=shadowLastChange by self write by * read
olcAccess: {4}to * by users read
Я хотел добиться следующего:
- Администратор может делать все, ограничений нет
- Пользователь репликации может читать все
- Пользователи могут менять свои пароли
- Доступ к каталогу возможен только для зарегистрированных пользователей, анонимный доступ невозможен.
После настройки ACL на сервере, пользователь репликации вообще не может войти. Я не понимаю, почему это происходит, DN пользователя репликации правильный и, насколько я знаю, он должен совпадать...
Логи сервера после попытки входа:
slapd[3475]: => access_allowed: result not in cache (userPassword)
slapd[3475]: => access_allowed: auth access to "uid=rpuser,dc=example,dc=com" "userPassword" requested
slapd[3475]: => acl_get: [1] attr userPassword
slapd[3475]: => acl_mask: access to entry "uid=rpuser,dc=example,dc=com", attr "userPassword" requested
slapd[3475]: => acl_mask: to value by "", (=0)
slapd[3475]: <= check a_dn_pat: cn=admin,dc=example,dc=com
slapd[3475]: <= acl_mask: no more <who> clauses, returning =0 (stop)
slapd[3475]: => slap_access_allowed: auth access denied by =0
slapd[3475]: => access_allowed: no more rules
Если я правильно понимаю, проверяется только первый ACL?
решение1
Эти списки ACL не тестировались, но должны работать:
olcAccess: {0}to * by dn.base="cn=admin,dc=example,dc=com" manage by * break
olcAccess: {1}to * by dn.base="uid=rpuser,dc=example,dc=com" read by * break
olcAccess: {2}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {3}to attrs=shadowLastChange by self write by * read
olcAccess: {4}to * by users read
Вам понадобятся by * break
первые два правила, так что если в определенном предложении нет совпадений, by
будет проверено следующее правило. Вам не нужно by * break
в attrs=userPassword
or attrs=shadowLastChange
-- не должно быть отката к to * by users read
.