Πώς να αυτοματοποιήσετε μια σύνδεση VPN που περιμένει κωδικό token
Ένας πελάτης VPN γραμμής εντολών που ζητά δεδομένα σε τερματικό μπλοκάρει ένα σενάριο που διοχετεύει μόνο κωδικό πρόσβασης. Κάντε αυτούς τους πέντε ελέγχους πριν καταφύγετε στο expect.
Ένα σενάριο που ξεκινά έναν πελάτη VPN προμηθευτή κολλάει μέχρι να λήξει το χρονικό όριο, και το αρχείο καταγραφής δείχνει τον πελάτη να ζητά κωδικό επαλήθευσης που δεν πληκτρολόγησε κανείς. Ο κωδικός πρόσβασης είχε δοθεί, άρα το προφανές συμπέρασμα είναι ότι ο κωδικός είναι λάθος. Δεν είναι. Το αίτημα κωδικού είναι ξεχωριστή συνομιλία σε ξεχωριστό κανάλι, και το σενάριό σας δεν το άνοιξε ποτέ.
Περάστε τους πέντε ελέγχους παρακάτω με τη σειρά. Σταματήστε στον πρώτο που αποτυγχάνει, γιατί κάθε επόμενο βήμα προϋποθέτει ότι ισχύουν τα προηγούμενα.
Έλεγχος 1: διαβάζει ο πελάτης καθόλου την τυπική είσοδο?
Δοκιμάστε πριν γράψετε οποιαδήποτε αυτοματοποίηση: διοχετεύστε ένα ψεύτικο μυστικό στον πελάτη και δείτε τι συμβαίνει. Αν εκτυπώσει το αίτημά του και μετά περιμένει, δεν διαβάζει τον σωλήνα.
Πολλοί πελάτες ανοίγουν τη συσκευή τερματικού απευθείας ή αρνούνται να πάρουν μυστικό από ροή που δεν είναι τερματικό, ώστε ένας περιπλανώμενος σωλήνας να μην μπορεί να διαρρεύσει κωδικό. Το OpenVPN είναι η τεκμηριωμένη εξαίρεση, επειδή το --auth-user-pass δέχεται διαδρομή αρχείου. Οι πελάτες προμηθευτών που ζητούν κωδικό μίας χρήσης συνήθως δεν έχουν αντίστοιχη παράμετρο, και το αίτημά τους περιμένει τερματικό που το σενάριό σας δεν παρείχε ποτέ.
Έλεγχος 2: έχει το θυγατρικό τερματικό?
Ένα pty εκχωρεί τερματικό στο θυγατρικό, κάτι που μετατρέπει τα αιτήματα σε αναγνώσιμη έξοδο την οποία μπορείτε να απαντήσετε με σειρά.
import pexpect
child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)Οι συμβολοσειρές αιτημάτων παραπάνω είναι ενδεικτικές· αντιγράψτε το ακριβές κείμενο που εκτυπώνει ο πελάτης σας, μαζί με πεζά και κεφαλαία και στίξη. Κάθε προσδοκία φέρει χρονικό όριο, και ένα κλειστό θυγατρικό πετά εξαίρεση αντί να επιστρέψει κατάσταση, άρα τυλίξτε την ακολουθία και θεωρήστε το τέλος αρχείου αποτυχία. Προσέξτε τι δεν κάνει αυτό το τμήμα: το θυγατρικό πεθαίνει μαζί με το σενάριο, γιατί το pty δεν είναι μηχανισμός αποκόλλησης και το disown είναι ενσωματωμένη εντολή κελύφους που δεν φτάνει σε διεργασία που δημιούργησε το σενάριό σας.
Έλεγχος 3: υπάρχει υποστηριζόμενη μη διαδραστική είσοδος?
Η απόξεση οθόνης σπάει στις αναβαθμίσεις του πελάτη, άρα αναζητήστε πρώτα τεκμηριωμένη παράμετρο.
Ελέγξτε την έξοδο βοήθειας για επιλογή token ή κωδικού μίας χρήσης, και ελέγξτε αν η υπηρεσία δέχεται τον κωδικό προσαρτημένο στο πεδίο κωδικού πρόσβασης. Όπου ο πελάτης διαβάζει αρχείο διαπιστευτηρίων, δώστε του το αρχείο αντί για αίτημα:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Η αντικατάσταση διεργασίας δίνει στον πελάτη αναγνώσιμη διαδρομή σε συστήματα που παρέχουν /dev/fd. Το μυστικό παραμένει μυστικό από την πλευρά του πελάτη, άρα κρατήστε το έξω από αρχεία καταγραφής, ιστορικό κελύφους και λίστες διεργασιών. Αν ο πελάτης απορρίπτει το /dev/fd ή ανοίγει τη διαδρομή διαπιστευτηρίων περισσότερες από μία φορές, γράψτε πραγματικό αρχείο με περιοριστικά δικαιώματα και διαγράψτε το στο ίδιο σενάριο.
Έλεγχος 4: θα επιβιώσει η σήραγγα πέρα από το σενάριο?
Από προεπιλογή η σήραγγα πεθαίνει με τον γονέα της, που είναι το αντίθετο από αυτό που χρειάζεται ένα σενάριο εκκίνησης.
Το disown -h βοηθά μόνο όταν εκκινήσατε τον πελάτη ως εργασία κελύφους, γιατί επεξεργάζεται τον πίνακα εργασιών αυτού του κελύφους και δεν φτάνει σε διεργασία που δημιούργησε το σενάριό σας μέσω pty. Ένας διαχειριστής υπηρεσιών είναι το καλύτερο σπίτι για οτιδήποτε πρέπει να επανασυνδέεται χωρίς επίβλεψη, γιατί επανεκκινεί τον πελάτη και καταγράφει γιατί πέθανε. Σε κάθε περίπτωση, περιμένετε νέο κωδικό μετά από κάθε επανασύνδεση: το token μίας χρήσης αναλώνεται από την πρώτη επιτυχή ταυτοποίηση.
Προσέξτε τι κάνει το sudo στην ακολουθία. Το αίτημα κωδικού του sudo δεν είναι το αίτημα του VPN, και το να το απαντήσετε με τον κωδικό του VPN είναι ο συνηθέστερος τρόπος να αποτύχει μια κατά τα άλλα σωστή σειρά προσδοκιών.
Έλεγχος 5: πρέπει ο κωδικός ενός ανθρώπου να βρίσκεται σε σενάριο?
Αυτός είναι ο έλεγχος που οι άνθρωποι παραλείπουν. Ένα token ανήκει σε άνθρωπο, ενώ μια σήραγγα που πρέπει να σηκώνεται με πρόγραμμα ανήκει στη μηχανή.
Αν μια εργασία πρέπει να επανασυνδέεται χωρίς επίβλεψη, ρωτήστε αν ένα πιστοποιητικό μηχανής ή λογαριασμός υπηρεσίας μπορεί να αντικαταστήσει τη διαδραστική σύνδεση. Η αυτοματοποίηση του κωδικού μίας χρήσης κάποιου μετατρέπει δεύτερο παράγοντα σε αποθηκευμένο μυστικό, που είναι αλλαγή πολιτικής και όχι ευκολία σεναρίου. Όπου η υπηρεσία υποστηρίζει και τα δύο, επιλέξτε το διαπιστευτήριο που ταιριάζει με το πώς εκτελείται πραγματικά η εργασία. Γράψτε την απάντηση, γιατί ο επόμενος άνθρωπος θα ρωτήσει γιατί το σενάριο κρατά token.
Πώς μοιάζει ένα σενάριο που δουλεύει
Το σενάριο εκτυπώνει το βήμα στο οποίο έφτασε, ποτέ το μυστικό, και εξέρχεται με μη μηδενικό κωδικό σε κάθε αποτυχημένη προσδοκία.
Δοκιμάστε το σπάζοντάς το επίτηδες: λάθος κωδικός, λάθος ομάδα, ληγμένο token. Κάθε αποτυχία πρέπει να σταματά σε ονομασμένο βήμα αντί να κολλά. Έπειτα τρέξτε το μία φορά απέναντι στην πραγματική υπηρεσία και ελέγξτε τη σήραγγα από έξω από το σενάριο, όχι από μέσα του.