OpenVPN ενεργεί με βάση ακριβώς μία έξοδο ενός σεναρίου σύνδεσης: την κατάσταση εξόδου. Ό,τι άλλο κάνει το σενάριο είναι διακόσμηση. Ένα hook μπορεί να φτάσει στον σωστό επαληθευτή, να αναλύσει την απάντηση και να εκτυπώσει μια φιλική γραμμή, ενώ επιστρέφει μια κατάσταση που σημαίνει το αντίθετο από αυτό που είχε κατά νου ο συγγραφέας του. Διαβάστε πρώτα το συμβόλαιο και γράψτε τον προσαρμογέα γύρω από αυτό, και ολόκληρη αυτή η κατηγορία σφαλμάτων εξαφανίζεται.

Το συμβόλαιο είναι μικρό: εντοπίστε τον λογαριασμό που υποβλήθηκε, θέστε στον εγκεκριμένο επαληθευτή την προβλεπόμενη ερώτηση και δεχτείτε μόνο το τεκμηριωμένο θετικό αποτέλεσμα αυτού του επαληθευτή για αυτό το αίτημα. Όλα τα άλλα είναι υποδομή.

Οι τρεις καταστάσεις που μπορεί να επιστρέψει το hook

Για auth-user-pass-verify, το εγχειρίδιο του OpenVPN 2.6 ορίζει τον κωδικό εξόδου 0 ως αποδοχή, το 1 ως απόρριψη και το 2 ως αναβαλλόμενη ταυτοποίηση. Αυτές είναι οι μόνες τρεις απαντήσεις που καταλαβαίνει ο διακομιστής, και καθεμία έχει διαφορετική συνέπεια για τη σύνδεση. Ένα σενάριο που εξέρχεται με την κατάσταση της τελευταίας του εντολής έχει στην πράξη αφήσει μια κλήση καταγραφής ή ένα βήμα καθαρισμού να ψηφίσει. Γράψτε την κατάσταση ρητά σε κάθε κλάδο, ακόμη και στους κλάδους που δεν έφτασαν ποτέ στον επαληθευτή.

Η επιτυχία HTTP και η επιτυχία ταυτοποίησης είναι ξεχωριστά επίπεδα, και η σύγχυσή τους είναι ο πιο συνηθισμένος τρόπος που αυτό το hook πάει στραβά. Μια απόκριση 202 σημαίνει ότι το αίτημα έγινε δεκτό για επεξεργασία, όχι ότι επαληθεύτηκε ένας κωδικός πρόσβασης. Ορίστε την αναμενόμενη κατάσταση, τη μορφή της απόκρισης και την τελική ετυμηγορία από το συμβόλαιο API που σας δόθηκε, και μην επινοήσετε όνομα πεδίου επειδή φαίνεται εύλογο.

Αν η απάντηση φτάσει πραγματικά αργότερα, αυτή είναι η αναβαλλόμενη διαδρομή και πρέπει να κατασκευαστεί ως τέτοια. Μια αναβαλλόμενη απόπειρα που δεν ολοκληρώνεται ποτέ κρατά πόρους μέχρι να λήξει το χρονικό όριο.

Διαβάστε το αρχείο διαπιστευτηρίων ακριβώς όπως είναι γραμμένο

Με τη τεκμηριωμένη μέθοδο μέσω αρχείου, ο διακομιστής γράφει το όνομα χρήστη και τον κωδικό πρόσβασης ως τις δύο πρώτες γραμμές ενός προσωρινού αρχείου, περνά αυτή τη διαδρομή στο σενάριο και αφαιρεί το αρχείο όταν το σενάριο επιστρέψει. Διαβάστε αυτές τις δύο γραμμές ως δεδομένα: μην κάνετε ποτέ source το αρχείο, μην το αξιολογήσετε ποτέ και μην επικολλήσετε ποτέ το περιεχόμενό του σε γραμμή εντολών όπου μπορεί να το δει ο πίνακας διεργασιών. Διατηρήστε τον κωδικό πρόσβασης byte προς byte, γιατί η κανονικοποίηση που θα εφαρμόζατε σε ένα όνομα χρήστη αλλάζει σιωπηλά το διαπιστευτήριο. Ο κατάλογος για αυτό το προσωρινό αρχείο είναι απόφαση ανάπτυξης, οπότε επιβεβαιώστε ότι υπάρχει και ότι δεν είναι αναγνώσιμος από όλους στον κεντρικό υπολογιστή.

Κρατήστε το δικό του διαπιστευτήριο του επαληθευτή χωριστά από του χρήστη: ανήκει στην ενσωμάτωση της πύλης, ζει στο χώρο μυστικών της πλατφόρμας και χρειάζεται μόνο την άδεια επαλήθευσης, οπότε δεν είναι απόδειξη ότι ταυτοποιήθηκε κάποιο συγκεκριμένο άτομο. Μην αφήσετε ούτε το hook να γίνει δεύτερος επαληθευτής κωδικών. Η χειροκίνητη επανυλοποίηση σύγκρισης hash δεν γίνεται ασφαλής βελτιστοποιώντας τον βρόχο, και ένας συντηρούμενος επαληθευτής καταλαβαίνει ήδη το αλατισμένο και δαπανηρό σχήμα της αποθήκης λογαριασμών.

Αποφασίστε τι σημαίνει μια απάντηση που δεν ταξινομείται

Τα χρονικά όρια, τα σφάλματα μεταφοράς, οι παραμορφωμένες απαντήσεις και ένα μη διαθέσιμο backend μοιράζονται μία ιδιότητα: κανένα από αυτά δεν είναι θετική επαλήθευση. Το hook πρέπει να αποτυγχάνει κλειστά για καθένα από αυτά και να καταγράφει έναν λόγο πάνω στον οποίο μπορεί να δράσει ένας χειριστής. Αυτός ο λόγος ανήκει σε προστατευμένο αρχείο καταγραφής, όχι σε μήνυμα που επιστρέφεται στο άτομο που προσπαθεί να συνδεθεί.

Να είστε εξίσου προσεκτικοί με τις διαδρομές που δεν φτάνουν καθόλου στον επαληθευτή. Μια τιμή διαμόρφωσης που λείπει, ένα μυστικό που δεν διαβάζεται ή μια εξάρτηση που δεν έχει εγκατασταθεί πρέπει να παράγουν απόρριψη με ξεχωριστό επιχειρησιακό δείκτη και όχι τυχαία αποδοχή. Δοκιμάστε αυτούς τους κλάδους αφαιρώντας την εξάρτηση σε εργαστήριο αντί να συλλογίζεστε γι' αυτούς. Όπου μια αποτυχία καταγραφής μπορεί να αλλάξει την κατάσταση εξόδου, η καταγραφή έχει γίνει μέρος της απόφασης και πρέπει να γίνει ακίνδυνη.

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

Επαληθεύστε την ετυμηγορία, όχι την εκτυπωμένη γραμμή

Κατασκευάστε ένα τεστ που εξετάζει απευθείας την κατάσταση εξόδου. Γράψτε ένα δείγμα αρχείου διαπιστευτηρίων, εκτελέστε το hook πάνω του με έναν γνωστά καλό και έναν γνωστά κακό λογαριασμό και διαβάστε την κατάσταση που αναφέρει το κέλυφος και όχι το κείμενο που εκτυπώνει το σενάριο. Αυτός ο ένας έλεγχος πιάνει τα περισσότερα σφάλματα συμβολαίου πριν συνδεθεί καν ένας πελάτης.

Στη συνέχεια περάστε τις ίδιες περιπτώσεις από έναν πραγματικό πελάτη απέναντι σε έναν ακροατή εκτός παραγωγής και επιβεβαιώστε τι κατέγραψε ο διακομιστής: αποδεκτό, απορριφθέν ή αναβληθέν. Καλύψτε έναν απενεργοποιημένο λογαριασμό, έναν λάθος κωδικό, μια παραμορφωμένη απάντηση επαληθευτή, ένα χρονικό όριο και έναν μη προσβάσιμο επαληθευτή. Αν κάποια περίπτωση καταλήξει σε κατάσταση που δεν μπορείτε να ονομάσετε, ο προσαρμογέας δεν είναι έτοιμος.

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

Σχετικά άρθρα