Estou brincando com servidores OpenLDAP com replicação e preciso definir ACLs apropriadas para permitir que o usuário de replicação leia tudo no host de origem.
Depois de lerEste artigocriou este conjunto de regras:
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
O que eu queria alcançar era:
- O administrador pode fazer tudo, sem limites
- O usuário de replicação pode ler tudo
- Os usuários podem alterar suas senhas
- Qualquer acesso ao diretório é possível apenas para usuários logados, sem acesso anônimo.
Depois de definir as ACLs acima para o servidor, o usuário de replicação não consegue fazer login. Não entendo por que isso acontece, o DN do usuário de replicação está correto e, pelo que sei, deve corresponder...
Logs do servidor após tentativa de login:
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
Se bem entendi, apenas a primeira ACL é verificada?
Responder1
Essas ACLs não foram testadas, mas devem 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
Você precisará by * break
das duas primeiras regras, portanto, se não houver correspondência na by
cláusula específica, a próxima regra será verificada. Você não precisa by * break
do attrs=userPassword
ou attrs=shadowLastChange
- não deve haver substituto para to * by users read
.