pam_ldap
não deve estar tentando ler o valor userPassword para efetuar o login. Ele faz o login fazendo uma ligação LDAP com o DN recuperado.
É possível que os parâmetros de pesquisa que os usos pam_ldap sejam mais abrangentes & ele tenta puxar userPassword como resultado, mas se sua ACL estiver configurada corretamente (parece bem para mim), ela não terá esse valor em seus resultados.
Apenas para o caso de suas ACLs não serem bem (eu sou conhecido por perder coisas estupidamente óbvias antes), aqui está a lista de ACL funcional do meu ambiente LDAP de produção:)
# Access and Security Restrictions
# (Most restrictive entries first)
access to attrs=userPassword
by self write
by dn.sub="ou=sync,dc=mydomain,dc=com" read
by anonymous auth
by users none
access to * by * read
O trailing access to * by * read
é importante, não o vi nos seus exemplos, por isso não tenho a certeza se está em falta ou foi apenas omitido do seu fragmento.
A linha sync
é para meu serviço de sincronização LDAP e não é necessária se você não estiver fazendo replicação ...