Το OpenVPN διαβάζει τον κωδικό από το τερματικό, όχι από το stdin
Πού διαβάζει στην πραγματικότητα το OpenVPN έναν κωδικό, γιατί ένα αρχείο στο stdin αποτυγχάνει και οι τρεις υποστηριζόμενες διαδρομές για σύνδεση με σενάριο σε Linux και macOS.
OpenVPN ζητά όνομα χρήστη και κωδικό στο τερματικό ελέγχου, και ένα αρχείο που ανακατευθύνεται στην τυπική είσοδο δεν είναι αυτό το τερματικό. Αυτή η μία λεπτομέρεια εξηγεί το σενάριο που κολλάει με τον κωδικό να βρίσκεται εκεί μέσα στον σωλήνα. Το μήνυμα το σχεδιάζει ο πελάτης και η ανάγνωση γίνεται από τη συσκευή τερματικού, άρα η ανακατεύθυνση του stdin δεν αλλάζει τίποτα. Τροφοδοτήστε τον πελάτη μέσα από μία από τις τεκμηριωμένες εισόδους του και το ίδιο σενάριο θα συνδεθεί με την πρώτη προσπάθεια.
Τρεις είσοδοι καλύπτουν σχεδόν κάθε περίπτωση, και η καθεμία αποτυγχάνει με τον δικό της τρόπο. Διαλέξτε με βάση το μήνυμα που πραγματικά δείχνει ο πελάτης, όχι με βάση την επιλογή που είναι ευκολότερο να μπει σε σενάριο.
Το μήνυμα δεν έρχεται από το stdin
Όταν το OpenVPN χρειάζεται διαπιστευτήρια ανοίγει το τερματικό ελέγχου και διαβάζει εκεί. Γι' αυτό μια διαδραστική δοκιμή φαίνεται καλή, ενώ η ίδια εντολή κάτω από το cron ή ένα αρχείο unit κάθεται άπραγη με το μήνυμα γραμμένο σε ένα αρχείο καταγραφής που κανείς δεν κοιτά. Μερικές εκδόσεις πέφτουν πίσω στην τυπική είσοδο όταν δεν υπάρχει τερματικό, και αυτή η ασυνέπεια είναι χειρότερη από μια σκληρή αποτυχία, γιατί κρύβει το πρόβλημα μέχρι την ανάπτυξη.
Ελέγξτε το περιβάλλον πριν γράψετε οποιονδήποτε κώδικα: τρέξτε τον πελάτη κάτω από τον ίδιο χρήστη, με το ίδιο stdin, όπως θα κάνει ο χρονοπρογραμματιστής ή ο διαχειριστής υπηρεσιών. Αν το μήνυμα δεν εμφανιστεί ποτέ στο αρχείο καταγραφής και η διεργασία δεν προχωρά, κάτι περιμένει ένα τερματικό που δεν υπάρχει.
Πρώτη είσοδος: αρχείο διαπιστευτηρίων δύο γραμμών
Η επιλογή ταυτοποίησης παίρνει μια διαδρομή, και το αρχείο περιέχει ακριβώς δύο γραμμές, πρώτα το όνομα χρήστη και μετά τον κωδικό, τίποτα άλλο. Περάστε τη διαδρομή ρητά αντί να βασίζεστε σε ένα προεπιλεγμένο όνομα αρχείου, γιατί ένα περιπλανώμενο αρχείο διαπιστευτηρίων στον κατάλογο εργασίας είναι ο τρόπος με τον οποίο καταλήγει σε χρήση ο λάθος λογαριασμός. Ρυθμίστε τη λειτουργία σε 0600 και δώστε την κυριότητα στον λογαριασμό που τρέχει τον πελάτη.
Ο πελάτης διαβάζει αυτό το αρχείο μία φορά στην εκκίνηση, άρα η αλλαγή του κωδικού σημαίνει επανεκκίνηση της διεργασίας. Αυτή είναι συνήθως η συμπεριφορά που θέλετε, και ανήκει στο runbook δίπλα στη διαδικασία αλλαγής.
Δεύτερη είσοδος: askpass για τη φράση του κλειδιού
Ένα ιδιωτικό κλειδί προστατευμένο με φράση προκαλεί ένα δεύτερο, διαφορετικό μήνυμα, και έχει τη δική του απάντηση από αρχείο: η επιλογή askpass διαβάζει τη φράση από την πρώτη γραμμή ενός αρχείου. Για σήραγγες βασισμένες σε SSH το αντίστοιχο είναι ένα πρόγραμμα askpass που εκτελεί ο πελάτης, και η τυπική του έξοδος γίνεται το μυστικό.
Καμία από τις δύο μορφές δεν βάζει το μυστικό στη λίστα ορισμάτων, και οι δύο το αφήνουν να υπάρχει ως αρχείο ή ως εκτελέσιμο που το τυπώνει. Η προστασία είναι τα δικαιώματα αρχείου και η κυριότητα της διεργασίας, όχι η αφάνεια. Ένας βοηθός που εκπέμπει μια συμβολοσειρά γραμμένη στον κώδικα είναι ένα μυστικό με επιπλέον βήματα.
Τρίτη είσοδος: το δικό του CLI του πελάτη πύλης
Οι εταιρικοί πελάτες συνήθως παρέχουν ένα σημείο εισόδου γραμμής εντολών που συνδέεται με μια ονομασμένη πύλη χωρίς παράθυρο, και αυτή είναι η υποστηριζόμενη διαδρομή. Στο Linux ο πελάτης GlobalProtect εκθέτει λειτουργίες σύνδεσης και εισαγωγής πιστοποιητικού μέσω του CLI του, και οι πύλες που χρησιμοποιούν ταυτοποίηση με πιστοποιητικό χρειάζονται το βήμα εισαγωγής πριν μπορέσει να δουλέψει μια αυτοματοποιημένη σύνδεση. Προτιμήστε το από συνθετικά πατήματα πλήκτρων: παίρνετε πραγματική κατάσταση εξόδου, καμία εξάρτηση από την εστίαση παραθύρου, και επιβιώνει σε κλειδωμένη οθόνη.
Αν η πρώτη σύνδεση χρειάζεται ακόμη άνθρωπο για να δεχτεί ένα πιστοποιητικό, η αυτοματοποίηση δεν έχει τελειώσει. Κάντε την εισαγωγή κατά την εγκατάσταση και καταγράψτε την ως προαπαιτούμενο.
Όταν η ροή χρειάζεται ψευδο-τερματικό
Μια ακολουθία που ζητά κωδικό και μετά κωδικό μιας χρήσης δεν έχει ένα μόνο αρχείο για ανάγνωση. Ένας οδηγός τερματικού όπως το Expect είναι το σωστό εργαλείο, γιατί περιμένει κάθε μοτίβο με τη σειρά, και χρειάζεται τη διεργασία ξεκινημένη πριν μπορέσει να ταιριάξει οτιδήποτε.
Δύο αποτυχίες κυριαρχούν. Ένα σενάριο που περιμένει μήνυμα χωρίς να ξεκινήσει τον πελάτη περιμένει για πάντα, και η Tcl δεν είναι κέλυφος, άρα αριθμητική κελύφους γραμμένη μέσα σε μπλοκ expect δεν αξιολογείται όπως διαβάζεται. Κρατήστε τη σημαία αποσφαλμάτωσης ανοιχτή όσο χτίζετε τα μοτίβα, μετά κλείστε την.
Μυστικά που διαρρέουν, και πού κρύβονται
Ό,τι περνά ως όρισμα είναι ορατό στη λίστα διεργασιών, άρα τα διαπιστευτήρια ανήκουν σε αρχείο ή πίσω από βοηθό, ποτέ στη γραμμή εντολών. Οι κωδικοί μιας χρήσης καταναλώνονται εκ σχεδιασμού και πρέπει να παράγονται για κάθε προσπάθεια. Τα αρχεία καταγραφής αποτυχιών συχνά κουβαλούν το όνομα χρήστη και μερικές φορές περισσότερα, άρα αποκρύψτε τα πριν τα στείλετε οπουδήποτε, και κρατήστε το μυστικό έξω από το ίδιο το προφίλ, γιατί ένα αρχείο ρυθμίσεων με ενσωματωμένο κωδικό κολλάει σε δελτία και αποθετήρια. Η αλλαγή λογαριασμού τότε σημαίνει κυνήγι κάθε αντιγράφου, και αυτό είναι ακριβώς το κόστος που αποφεύγει αυτή η διάταξη.
Ελέγξτε τις εισόδους που διαλέξατε και μετά συνδέστε τις στο αρχείο unit ή στον χρονοπρογραμματιστή που θα τρέξει πραγματικά τον πελάτη. Η σήραγγα ζει ακριβώς όσο ζει αυτή η διεργασία.