Project

General

Profile

Support #53685

ldap: traces de plus en plus fréquentes

Added by Serghei Mihai 14 days ago. Updated 11 days ago.

Status:
Nouveau
Priority:
Normal
Assignee:
-
Category:
-
Target version:
-
Start date:
03 May 2021
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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'})

History

#1

Updated by Benjamin Dauvergne 14 days ago

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.

#2

Updated by Serghei Mihai 13 days ago

A priori c'est ça: #53663#note-14

#3

Updated by Benjamin Dauvergne 13 days ago

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.

#4

Updated by Benjamin Dauvergne 13 days ago

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)

#6

Updated by Nicolas Roche 12 days ago

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

#7

Updated by Benjamin Dauvergne 11 days ago

  • Status changed from Nouveau to 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).

#8

Updated by Benjamin Dauvergne 11 days ago

  • Status changed from Résolu (à déployer) to Nouveau

Also available in: Atom PDF