Development #53685
ldap: traces de plus en plus fréquentes
0%
Description
On en reçoit de plus en plus souvent depuis les recettes et prods ces derniers temps:
Report unable to retrieve attributes of dn 'cn=xxxxx,ou=users,ou=espc,ou=OU,dc=domaine,dc=DC': OPERATIONS_ERROR({'desc': 'Operations error', 'info': '000004DC: LdapErr: DSID-0C0907E9, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580'})
Fichiers
Révisions associées
ldap: on INVALID_CREDENTIALS, try to rebind before looking up the user (#53685)
On a bind failure, the current bind context is lost, if we want to
lookup the user whose bind failed we must first rebind with the service
credentials.
Historique
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
Il me semble que ça viendrait de gens utilisant le reset de mot de passe pour un compte LDAP ou la modification du mot de passe n'est pas possible. On se retrouve alors avec un compte bancal qui ne peut pas lire ses propres informations. À vérifier.
Mis à jour par Serghei Mihai (congés, retour 15/05) il y a environ 3 ans
A priori c'est ça: #53663#note-14
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
Ce qui est signalé là c'est autre chose que je n'avais pas identifié mais qui doit aussi arriver, le mot de passe étant conservé en session pour les prochaines connexions au LDAP et éviter d'utiliser le mot de passe admin (surtout pour un changement de mot de passe) ça va générer cette erreur, par contre ça ne peut pas bloquer la navigation de l'utilisateur comme dans le ticket pointé, l'erreur est gérée :
@classmethod def get_ldap_attributes(cls, block, conn, dn): ... try: results = conn.search_s(dn, ldap.SCOPE_BASE, u'(objectclass=*)', attributes) except ldap.LDAPError as e: log.error('unable to retrieve attributes of dn %r: %r', dn, e) return None <- ici tout va bien
Le problème dans le ticket pointé me semble relatif aux soucis de désactivation des LDAPs orphelins; je ne vois pas comment un compte usager pourrait être désactivé sauf manuellement.
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
Benjamin Dauvergne a écrit :
Ce qui est signalé là c'est autre chose que je n'avais pas identifié mais qui doit aussi arriver, le mot de passe étant conservé en session pour les prochaines connexions au LDAP et éviter d'utiliser le mot de passe admin (surtout pour un changement de mot de passe) ça va générer cette erreur, par contre ça ne peut pas bloquer la navigation de l'utilisateur comme dans le ticket pointé, l'erreur est gérée :
Non ce n'est pas ça, si le mot de passe change alors on aura une erreur de bind et la connection ne sera pas retournée, dans ce cas on aura une erreur de ce type :
log.warning('ldap: get_attributes failed, could not get a connection')(et là on peut se dire que si pose celle-ci en warning on pourrait poser l'autre)
Mis à jour par Nicolas Roche il y a environ 3 ans
De mon côté j'ai l'impression que cette erreur correspond à Villejuif avec la mise en place de la synchronisation des membres des groupes présents dans l'OU (je dit ça parce que j'ai eu l'impression que ça coïncidait quand j'ai vu apparaître cette trace, mais ça daterait de 3 mois).
https://dev.entrouvert.org/issues/50881#note-33
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Statut changé de Nouveau à Résolu (à déployer)
J'ai trouvé, ça vient de ce commit :
commit 57ded4fd8fe8fbd388390aaf845567ff636abab7 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Mar 25 11:37:54 2021 +0100 authenticators: attach login failure record to user (#51626) diff --git a/src/authentic2/backends/ldap_backend.py b/src/authentic2/backends/ldap_backend.py index c252b638..a967174e 100644 --- a/src/authentic2/backends/ldap_backend.py +++ b/src/authentic2/backends/ldap_backend.py @@ -720,6 +720,10 @@ class LDAPBackend(object): except ldap.INVALID_CREDENTIALS as e: if block.get('use_controls') and len(e.args) > 0 and 'ctrls' in e.args[0]: self.process_controls(request, authz_id, DecodeControlTuples(e.args[0]['ctrls'])) + attributes = self.get_ldap_attributes(block, conn, authz_id) + user = self.lookup_existing_user(authz_id, block, attributes) + if user and hasattr(request, 'failed_logins'): + request.failed_logins.add(user) user_login_failure(authz_id) pass else: @@ -1238,7 +1242,7 @@ class LDAPBackend(object): for lookup_type in block['lookups']: if lookup_type == 'username': return self.lookup_by_username(username) - elif lookup_type == 'external_id': + elif lookup_type == 'external_id' and attributes: return self.lookup_by_external_id(block, attributes) def update_user_identifiers(self, user, username, block, attributes):
Sur une erreur de mot de passe on essaie tout de même trouver l'utilisateur concerné via une récupération des attributs et une conversion de ceux-ci en external_id_tuple; soit ça ne marche pas avec le bind admin soit il y a un souci (genre les mauvais crédentiels sont conservés entre temps).
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Statut changé de Résolu (à déployer) à Nouveau
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
- Fichier 0001-ldap-do-not-trace-when-SEARCH-return-no-attributes-5.patch 0001-ldap-do-not-trace-when-SEARCH-return-no-attributes-5.patch ajouté
- Fichier 0002-ldap-on-INVALID_CREDENTIALS-try-to-rebind-before-loo.patch 0002-ldap-on-INVALID_CREDENTIALS-try-to-rebind-before-loo.patch ajouté
- Tracker changé de Support à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
J'ai ajouté un bind avec les credentials admin et ça passe (les tests sans code foire avec 'unable to retrive attributes').
Mis à jour par Serghei Mihai (congés, retour 15/05) il y a presque 3 ans
- Statut changé de Solution proposée à Solution validée
Go dès que jenkins est vert.
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 7050db8b4ec9ffef31a4e6a942dcb1b5449d74e7 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Aug 3 11:09:38 2021 +0200 ldap: on INVALID_CREDENTIALS, try to rebind before looking up the user (#53685) On a bind failure, the current bind context is lost, if we want to lookup the user whose bind failed we must first rebind with the service credentials. commit c9b626d614af23f4f0b043a12ae3fa5a60ac3f4c Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Aug 3 11:51:55 2021 +0200 ldap: do not trace when SEARCH return no attributes (#53685)
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
ldap: do not trace when SEARCH return no attributes (#53685)