Μήπως παρατηρείτε αργό authentication στο δίκτυό σας?

March 26, 2014 Chris Spanougakis

UPDATE: Υπάρχει η δυνατότητα να εντοπίσετε το πρόβλημα χρησιμοποιώντας το τελευταίο  Server Management Pack (version 6.0.7026.0) του System Center Operations Manager. Δείτε περισσότερες πληροφορίες εδώ: http://blogs.technet.com/b/ad/archive/2013/05/14/maxconcurrentapi-detection-in-updated-scom-management-pack.aspx

———————————————————————————

Είναι Δευτέρα πρωί και ξαφνικά οι χρήστες σας παραπονιούνται για αργή πρόσβαση στο δίκτυο. Αδυναμία για authentication στους domain controllers, access denied μηνύματα από τους servers, ένας κακός χαμός με λίγα λόγια. Πριν αρχίσετε να βρίζετε τους πάντες, θα ήταν καλό να ενημερωθείτε για κάτι που υπάρχει στα Windows δίκτυα εδώ και χρόνια και ονομάζεται “MaxConcurrentAPI”.

Πολύ συχνά το πρόβλημα εντοπίζεται σε εταιρίες που έχουν παλιές εφαρμογές, οι οποίες τυχαίνει να χρησιμοποιούν NTLM authentication. Το NTLM authentication είναι κακό, δεν προσφέρει ασφάλεια, έχουμε πει ότι είναι καλό να το ξεφορτωθούμε, αλλά αυτό είναι μια άλλη κουβέντα. Καλώς ή κακώς το έχουμε και πρέπει κάτι να κάνουμε.

Σε αντίθεση με το Kerberos authentication, το NTLM δεν χρησιμοποιεί access granting tickets (τα οποία έχουν μια διάρκεια ζωής και ξαναχρησιμοποιούνται κάθε φορά που θέλετε να αποκτήσετε πρόσβαση σε ένα file share), αλλά δημιουργεί ένα authentication thread στο λειτουργικό ΚΑΘΕ ΦΟΡΑ. Αποκτήσατε πρόσβαση στο file share, δημιουργείται ένα thread. Μετά από λίγο αν επιχειρήσετε να δείτε το ίδιο file share, δημιουργείται καινούριο thread, κλπ κλπ κλπ. Άρα το NTLM δεν είναι μόνο επισφαλές, κοστίζει και σε resources.

gina

Θυμάστε το netlogon; Τότε θα θυμάστε και το process των Windows το οποίο είναι υπεύθυνο για κάθε είδους authentication, το Local Security Authority Subsystem (lsass.exe). Όπως όλα τα processes, έτσι και αυτό χρησιμοποιεί threads. Δημιουργείστε πολλά threads και αρχίζουν τα παρατράγουδα. Αυτό γίνεται γιατί τα λειτουργικά έχουν ένα όριο από NTLM threads, με πρωταρχικό υπεύθυνο το MaxConcurrentAPI. Ακριβώς επειδή όλα τα λειτουργικά έχουν ένα όριο σε MaxConcurrentAPI, δηλαδή threads για NTLM authentication, ίσως κάπου να δείτε και το μήνυμα “0xC000005E (STATUS_NO_LOGON_SERVERS)”.

Ευτυχώς μπορείτε να παραμετροποιήσετε την τιμή για τα MaxConcurrentAPI, αν και θα ήταν καλύτερα να χρησιμοποιήσετε Kerberos authentication, αν οι εφαρμογές σας το υποστηρίζουν. Μπορείτε να αλλάξετε την τιμή του MaxConcurrentAPI αν πάτε στη registry και δημιουργήσετε μια εγγραφή της μορφής DWORD (μέσα στο HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\. Η default ρύθμιση είναι 1 για τους member servers και 2 για τους domain controllers. Για τον Windows Server 2003 και 2008 μπορείτε να βάλετε την τιμή 10, ενώ στον 2008 R2 μπορείτε να βάλετε την τιμή 150. Για τον Server 2008 υπάρχει σχετικό hotfix από την Microsoft που μπορείτε να το βρείτε εδώ και θα ανεβάσει την τιμή επίσης στο 150: “You are intermittently prompted for credentials or experience time-outs when you connect to Authenticated Services”, http://support.microsoft.com/kb/975363

Πιθανά συμπτώματα

Το κακό είναι ότι δεν βλέπετε απολύτως τίποτα στα logs. Πιθανά συμπτώματα είναι:

1. Ζητείται από τον χρήστη username και password ξανά και ξανά
2. Αργό authentication, ειδικά κατά τις ώρες αιχμής
3. Τυχαία συμπτώματα σε χρήστες, άλλοι συνδέονται κανονικά και άλλοι όχι
4. Καθόλου authentication σε εφαρμογές Microsoft και τρίτων κατασκευαστών
5. Καθόλου authentication σε όλους τους χρήστες
6. Το restart του netlogon Service δείχνει να λύνει προσωρινά το πρόβλημα

Πως το φτιάχνω; Ενεργοποιήστε πρώτα το debug logging για το Netlogon Service, δείτε το άρθρο με κατατοπιστικές οδηγίες εδώ: “Enabling debug logging for the Net Logon service”, http://support.microsoft.com/kb/109626 Το επόμενο βήμα είναι να χρησιμοποιήσετε τους Netlogon Performance counters. Οι counters που χρειαζόμαστε υπάρχουν από default στον Windows Server 2008 και πάνω, για τον Windows Server 2003 δείτε το σχετικό άρθρο εδώ: http://support.microsoft.com/kb/928576 Για να βρούμε την βέλτιστη τιμή για το MaxConcurrentAPI των server μας, θα πρέπει να λάβουμε υπόψη μας τα παρακάτω:

  • Net Logon semaphore acquires
  • Net Logon semaphore time-outs
  • Net Logon average semaphore hold time
  • Διάρκεια του performance logging μετρημένο σε δευτερόλεπτα

Αφού μετρήσετε τις τιμές, θα πρέπει να χρησιμοποιήσετε τον παρακάτω τύπο: (semaphore_acquires + semaphore_time-outs) * average_semaphore_hold_time / time_collection_length = < New_MaxConcurrentApi_setting Παράδειγμα:

  • semaphore acquires = 10.153
  • semaphore time-outs = 1200
  • average semaphore hold time = 1 (ένα δευτερόλεπτο).
  • Διάρκεια μέτρησης = 120 δευτερόλεπτα.

Το αποτέλεσμα είναι: (10.153 + 1200) * 1 / 120 =< 94,608 Αν η τιμή είναι πάνω από 150, θα πρέπει να προσθέσετε επιπλέον servers, ενώ αν είναι κάτω από 150, ρυθμίζετε την τιμή στη registry όπως είπαμε παραπάνω, δηλώνοντας δεκαδική τιμή μέχρι το 150 που είναι το όριο. Για να ενεργοποιηθεί η αλλαγή αρκεί να σταματήσετε και να ξεκινήσετε πάλι το Netlogon Service.