Μόλις έχω ελέγξει το replication σε περιβάλλον AD με 450+ Domain Controllers όπου υπάρχουν μικροπροβλήματα λόγω γραμμών σε κάποια υποκαταστήματα. Εμφανίζεται λοιπόν κάποιος developer ο οποίος παραπονιέται ότι κάνοντας το ίδιο ldap query σε 2 διαφορετικούς DCs παίρνει διαφορετική απάντηση! Δε λέω ακούγεται ενδιαφέρον αλλά σιγά μην ισχύει κάτι τέτοιο.
Ευθύς αμέσως ελέγχω το replication στους 2 ύποπτους DCs με την εντολή
repadmin /replsum <server name>
όπου διαπιστώνω πως δεν υπάρχει κανένα απολύτως πρόβλημα replication. Απαντώ λοιπόν στο συνάδελφο πως δεν υπάρχει κάποιο πρόβλημα αλλά αυτός επιμένει πως σίγουρα υπάρχει θέμα.
Για να βγάλουμε μια άκρη ρωτάω να μάθω τι είναι αυτό που ζητάει μέσω του ldap query και παίρνει διαφορετικές απαντήσεις. Η απάντηση πως ψάχνει για το group membership ενός χρήστη και από τον dcA βλέπει 6 groups ενώ από τον dcB μόνο 1.
Προσπαθώντας να διαπιστώσω τα παραπάνω δίνω την εντολή
dsquery * –s dcA “cn=user,ou=somewhere,dc=root,dc=gr” –attr memberOf
dsquery * –s dcB “cn=user,ou=somewhere,dc=root,dc=gr” –attr memberOf
Στην ουσία με τις παραπάνω εντολές εκτελώ ldap query όπου ζητάω από τους DC/ldap servers να μου επιστρέψουν την τιμή του attribute memberOf όπου κρατείται το group membership για το χρήστη. Προσέξτε τη χρήση των Distinguished Names όπου είναι ο default τρόπος στις εντολές dsquery, dsget dsmod etc. Παρόμοια εντολή είναι η
dsget user –s dcA “cn=user,ou=somewhere,dc=root,dc=gr” –memberOf
Σε όλες τις περιπτώσεις η απάντηση είναι ίδια (6 groups) για τους DCs που το custom utility αποτυγχάνει να πάρει κοινά αποτελέσματα. Οπότε στην επιμονή του τελευταίου δε βλέπω άλλη λύση από το να ζητήσω το tool που χρησιμοποιεί ώστε να το διερευνήσω από πρώτο χέρι.
Εκτελώ λοιπόν το utility και παράλληλα κάνω network trace ώστε να δω τα ldap queries που πραγματοποιούνται. Το πρωτόκολλο ldap αν δεν χρησιμοποιεί ssl (ldaps –> port 636) είναι clear text και μπορούμε να δούμε τα περιεχόμενα χωρίς δυσκολία κάνοντας χρήση του display fitler tcp.port==389.
Μέσω του custom ldap tool ζητάω το group membership του εν λόγω χρήστη από τους 2 DCs και όντως παίρνω διαφορετικά αποτελέσματα!
Μη έχοντας πειστεί θεωρώ πως η απάντηση έρχεται σωστή από τους DCs αλλά για κάποιο λόγο το ldap tool δεν το εμφανίζει. Οπότε γρήγορα ελέγχω το μέγεθος της τελικής απάντησης στις 2 ερωτήσεις.
Εδώ με περιμένει η πρώτη έκπληξη όπως φαίνεται και παρακάτω:

Από τον 1ο DC η απάντηση έχει μέγεθος 1004bytes, ενώ από τον 2ο

η απάντηση έχει μέγεθος 446bytes!!
Πολύ περίεργα πράγματα οπότε πηγαίνω να ελέγξω τα περιεχόμενα των 2 συγκεκριμένων πακέτων (packet details). Εδώ με περιμένει η δεύτερη έκπληξη:

Ο 1ος DC επιστρέφει 6 groups (memberOf) ενώ αντίθετα ο 2ος

μόνο 1!!
Τελικά υπάρχουν φαντάσματα δεν μπορεί να εξηγηθεί αλλιώς! Ο developer του ldap tool έχει δίκιο.
Υπάρχει BUG στο Active Directory!!!
Αποκαλυπτήρια
Όντας δύσπιστος συνεχίζω τη διερεύνηση του όλου ldap query που έγινε από το tool, το οποίο εκτελεί τα βήματα ως εξής:
Βλέπω λοιπόν μέσω του network trace πως εκτελεί μια σειρά από βήματα – ldap queries.
Αρχικά δέχεται το username (samAccountName) ως input και αναζητά με αυτό το cn (canonicalName) του χρήστη. Δηλαδή δίνουμε user01 και ψάχνει για το cn π.χ. Γεώργιου Δ. Κωσταντίνα.

Περίεργο που ο προγραμματιστής αποφάσισε να το χειριστεί έτσι αλλά ας πάμε παρακάτω να δούμε τι συμβαίνει.
Ως απάντηση λοιπόν, λαμβάνει το ονοματεπώνυμο του χρήστη (xxxxxx Δ. Κωνσταντίνα) οπότε το ldap tool συνεχίζει αναζητώντας το group membership του χρήστη με αυτό το ονοματεπώνυμο (CN).
Το cn αποστέλλεται στους 2 διαφορετικούς DCs και περιμένει να δει το attribute memberOf (group membership).

Aυτό που συμβαίνει είναι πως υπάρχει συνωνυμία, υπάρχουν δηλαδή 2 “xxxxxx Δ. Κωνσταντίνα” και οι 2 αυτοί χρήστες δεν ανήκουν στα ίδια groups

Αυτό φαίνεται ξεκάθαρα από το Distinguished Name των 2 users που ναι μεν έχουν το ίδιο όνομα CN αλλά πρόκειται για διαφορετικούς οπότε και ανήκουν σε άλλα OUs.
CN=user01,OU=Users,OU=GrandsUsers,OU=InteractiveUsers,OU=AllUsers,DC=axyz,DC=root,DC=abc12,DC=gr
CN=user01,OU=TemporaryUsersPool,OU=GrandsUsers,OU=InteractiveUsers,OU=AllUsers,DC=axyz,DC=root,DC=abc12,DC=gr
Το παραπάνω επιβεβαιώθηκε επίσης και μέσα από την κονσόλα “Active Directory Users & Computers”
Κλείνοντας..
Φάνηκε λοιπόν πως ο σχεδιασμός της εφαρμογής οδήγησε σε εσφαλμένα συμπεράσματα βασιζόμενοι στη λογική ότι η εφαρμογή (ldap query tool) είναι καθ’ όλα σωστή και σίγουρα το πρόβλημα εντοπίζεται στην μεριά του Active Directory. Το πρόβλημα θα είχε αποφευχθεί αν είχαν επιλεχθεί αντί του CN το Distinguished Name (cn=user01,ou=…,dc=..) ή το samAccountName.
Τέλος για να δώσω ένα αντίστοιχο παράδειγμα σε όσους πιθανόν μπέρδεψα, το παραπάνω είναι σαν να παίρναμε τηλέφωνο στις πληροφορίες καταλόγου και να ζητούσαμε το τηλέφωνου του “Παπαδόπουλου Κώστα” χωρίς να δίναμε καμία επιπλέον πληροφορία (διεύθυνση, τκ, επάγγελμα κλπ)!
Πόσα διαφορετικά αποτελέσματα θα μαζεύαμε; Έτσι ακριβώς λειτουργούν οι κατάλογοι είτε είναι τηλεφωνικοί είτε ldap. 