Ich spiele mit OpenLDAP-Servern mit Replikation herum und musste entsprechende ACLs festlegen, damit der Replikationsbenutzer alles im Quellhost lesen kann.
Nach dem LesenDieser Artikeldiesen Regelsatz erstellt:
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
Was ich erreichen wollte, war:
- Der Administrator kann alles machen, keine Einschränkungen
- Replikationsbenutzer können alles lesen
- Benutzer können ihre Passwörter ändern
- Jeder Zugriff auf das Verzeichnis ist nur für angemeldete Benutzer möglich, kein anonymer Zugriff.
Nach dem Einstellen der oben genannten ACLs auf dem Server kann sich der Replikationsbenutzer überhaupt nicht anmelden. Ich verstehe nicht, warum das passiert. Der DN des Replikationsbenutzers ist korrekt und meines Wissens sollte er übereinstimmen ...
Serverprotokolle nach dem Anmeldeversuch:
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
Verstehe ich das richtig, wird nur die erste ACL geprüft?
Antwort1
Diese ACLs wurden nicht getestet, sollten aber funktionieren:
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
Sie benötigen die ersten beiden Regeln, sodass die nächste Regel geprüft wird, by * break
wenn es in einer bestimmten Klausel keine Übereinstimmung gibt . Sie benötigen das „oder“ nicht – es sollte keinen Fallback auf geben .by
by * break
attrs=userPassword
attrs=shadowLastChange
to * by users read