OpenVPN username-as-common-name: γιατί ο έλεγχος CN σας είναι κενός
Ένα σκριπτ client-connect που συγκρίνει το common_name με το username μπορεί να συγκρίνει ένα όνομα με τον εαυτό του. Δέστε το πιστοποιητικό στον λογαριασμό πριν εκτελεστεί η αντικατάσταση.
Προσθέτετε ένα σκριπτ client-connect που απορρίπτει κάθε σύνδεση όπου το common_name διαφέρει από το username, και μοιάζει με δέσμευση μεταξύ πιστοποιητικού και λογαριασμού. Σε διακομιστή που τρέχει με username-as-common-name, αυτή η σύγκριση έχει ήδη χάσει το νόημά της μέχρι να εκτελεστεί το σκριπτ. Και οι δύο τιμές είναι η ίδια συμβολοσειρά, οπότε ο έλεγχος περνά για πιστοποιητικό που έχει εκδοθεί σε εντελώς άλλο πρόσωπο.
Ο έλεγχος δεν είναι λάθος επειδή το σκριπτ είναι κακογραμμένο. Είναι λάθος επειδή η τιμή που διαβάζει αντικαταστάθηκε νωρίτερα στην ίδια σύνδεση.
Τι φαίνεται να αποδεικνύει η σύγκριση
Η πιστοποίηση με πιστοποιητικό και η πιστοποίηση με κωδικό πρόσβασης είναι δύο ξεχωριστές αποδείξεις, και ένας διακομιστής μπορεί να απαιτεί και τις δύο χωρίς να απαιτεί να ανήκουν στο ίδιο πρόσωπο. Το κενό είναι πραγματικό: ένα έγκυρο πιστοποιητικό συσκευής μαζί με οποιονδήποτε έγκυρο λογαριασμό είναι διαφορετικός ισχυρισμός από το ίδιο πιστοποιητικό μαζί με έναν ονομαστικό λογαριασμό. Ένα σκριπτ που συγκρίνει το common_name με το username διαβάζεται σαν τον κρίκο που λείπει ανάμεσα στα δύο. Και θα ήταν, αν το common_name σήμαινε ακόμη αυτό που έλεγε το πιστοποιητικό.
Το αν ισχύει εξαρτάται από μία επιλογή του διακομιστή, και αυτή η επιλογή συνήθως ενεργοποιείται για έναν άσχετο λόγο, όπως το να γίνεται ευκολότερη η ονομασία αρχείων ρυθμίσεων ανά χρήστη.
Τι κάνει το username-as-common-name στο όνομα
Με ενεργοποιημένο το username-as-common-name, το OpenVPN αντικαθιστά το κοινό όνομα του πιστοποιητικού με το πιστοποιημένο όνομα χρήστη μόλις επαληθευτούν το όνομα χρήστη και ο κωδικός πρόσβασης. Το άγκιστρο επαλήθευσης που εκτελείται κατά τη διάρκεια αυτού του ελέγχου εξακολουθεί να λαμβάνει το κοινό όνομα του πιστοποιητικού, επειδή η αντικατάσταση δεν έχει συμβεί ακόμη. Ό,τι ακολουθεί, συμπεριλαμβανομένου του client-connect, βλέπει το όνομα χρήστη. Έτσι η μεταγενέστερη κλήση λαμβάνει μία ταυτότητα δύο φορές και δεν μπορεί να τη συγκρίνει με το πιστοποιητικό που παρουσιάστηκε.
| Stage | What common_name holds |
|---|---|
| Username and password verification hook | The certificate common name, for example bob-device |
| After the replacement | The authenticated account, alice |
| client-connect callback | The account again, alice |
Ακολουθήστε μια ενδεικτική σύνδεση: πιστοποιητικό εκδομένο για το bob-device, επιτυχής σύνδεση καταλόγου ως alice και η επιλογή ενεργοποιημένη. Το στάδιο επαλήθευσης μπορεί ακόμη να δει δύο διαφορετικές συμβολοσειρές. Το στάδιο σύνδεσης βλέπει το alice και το alice.
Αυτό το παράδειγμα δείχνει γιατί η σύγκριση είναι κενή. Δεν δείχνει ότι η σύνδεση θα γινόταν δεκτή διαφορετικά, αφού η επικύρωση πιστοποιητικού και η επαλήθευση κωδικού εκτελούνται ακόμη μόνες τους.
Τοποθετήστε τη δέσμευση εκεί όπου υπάρχουν ακόμη και οι δύο ταυτότητες
Ο κανόνας πρέπει να επιβάλλεται σε στάδιο που βλέπει την ταυτότητα του πιστοποιητικού και τον λογαριασμό ταυτόχρονα, που στην πράξη σημαίνει το άγκιστρο επαλήθευσης ονόματος χρήστη και κωδικού ή ένα πρόσθετο που φορτώνεται εκεί. Ένα υποστηριζόμενο πρόσθετο που εκτελεί ήδη επαλήθευση κωδικού είναι συνήθως το σωστό σημείο για να προσθέσετε κανόνα αντιστοίχισης, γιατί η αντικατάστασή του με σύγκριση ονομάτων θα άφηνε τελείως έξω τον έλεγχο κωδικού.
Ορίστε την αντιστοίχιση πριν γράψετε κώδικα, γιατί η ισότητα σπάνια είναι η πραγματική πολιτική. Ένα πιστοποιητικό συχνά προσδιορίζει μια συσκευή ενώ η σύνδεση προσδιορίζει ένα πρόσωπο, και μια συσκευή μπορεί νόμιμα να εξυπηρετεί πολλά πρόσωπα. Αποθηκεύστε τη σχέση σε μορφή της οποίας την έκδοση ελέγχετε, και αποφασίστε τι γίνεται στη μετονομασία, στην επανέκδοση και στα ονόματα με προσδιοριστικό τομέα. Η μετατροπή ενός προθέματος τομέα σε πεζά ή η αφαίρεσή του χωρίς κατανόηση του καταλόγου μπορεί να συνενώσει δύο λογαριασμούς που έπρεπε να μείνουν χωριστοί.
Θυμηθείτε ότι η επιλογή αλλάζει επίσης ποια ρύθμιση ανά πελάτη ισχύει, γιατί το client-config-dir ευρετηριάζεται με το κοινό όνομα.
Δοκιμάστε την αντιστοίχιση με δύο έγκυρα διαπιστευτήρια
Ξεκινήστε με το ζεύγος που επιτρέπει η πολιτική σας και επιβεβαιώστε ότι συνδέεται. Μετά παρουσιάστε το ίδιο έγκυρο πιστοποιητικό με διαφορετικό αλλά κατά τα άλλα έγκυρο λογαριασμό: αυτή η απόπειρα πρέπει να αποτύχει, και πρέπει να αποτύχει εξαιτίας του κανόνα αντιστοίχισης, όχι εξαιτίας κωδικού που πληκτρολογήθηκε λάθος. Ένας λάθος κωδικός αποδεικνύει ότι ο έλεγχος κωδικού λειτουργεί και δεν λέει τίποτα για τον κανόνα μεταξύ πιστοποιητικού και λογαριασμού.
Ελέγξτε επίσης τις διαδρομές απούσαντος και μη έγκυρου πιστοποιητικού, και επιβεβαιώστε ποια ταυτότητα χρησιμοποιεί ο διακομιστής για τις ρυθμίσεις ανά πελάτη. Αν ο μόνος τρόπος να δουλέψει η σύγκριση είναι να απενεργοποιήσετε το username-as-common-name, υπολογίστε πρώτα το κόστος αυτής της αλλαγής, γιατί μεταφέρει την αναζήτηση ρυθμίσεων κάθε πελάτη πίσω στο όνομα του πιστοποιητικού.