OpenLDAP – Benutzer kann sich nach Änderung der ACL-Regeln nicht anmelden

OpenLDAP – Benutzer kann sich nach Änderung der ACL-Regeln nicht anmelden

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:

  1. Der Administrator kann alles machen, keine Einschränkungen
  2. Replikationsbenutzer können alles lesen
  3. Benutzer können ihre Passwörter ändern
  4. 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 * breakwenn es in einer bestimmten Klausel keine Übereinstimmung gibt . Sie benötigen das „oder“ nicht – es sollte keinen Fallback auf geben .byby * breakattrs=userPasswordattrs=shadowLastChangeto * by users read

verwandte Informationen