Estoy jugando con servidores OpenLDAP con replicación y necesitaba configurar las ACL apropiadas para que el usuario de replicación pueda leer todo en el host de origen.
Despues de leerEste artículocreó este conjunto de reglas:
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
Lo que quería lograr era:
- El administrador puede hacer todo, sin límites
- El usuario de replicación puede leer todo.
- Los usuarios pueden cambiar sus contraseñas
- Cualquier acceso al directorio solo es posible para usuarios registrados, no acceso anónimo.
Después de configurar las ACL anteriores en el servidor, el usuario de replicación no puede iniciar sesión en absoluto. No entiendo por qué sucede esto, el DN del usuario de replicación es correcto y, hasta donde yo sé, debería coincidir...
Registros del servidor después del intento de inicio de sesión:
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
Si entiendo correctamente, ¿solo se verifica la primera ACL?
Respuesta1
Esas ACL no se prueban pero deberían funcionar:
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
Necesitará by * break
las dos primeras reglas, de modo que si no hay coincidencia en by
una cláusula específica, se verificará la siguiente regla. No es necesario by * break
el attrs=userPassword
o attrs=shadowLastChange
; no debería haber ningún recurso alternativo to * by users read
.