AnyConnect σε Linux: ασφαλής σεναριοποίηση της ακολουθίας σύνδεσης
Το δυαδικό vpn του Cisco AnyConnect διαβάζει απαντήσεις από το stdin, και αυτό αρκεί για επαναλήψιμη σύνδεση. Χτίσε την ακολουθία, προστάτευσε το αρχείο, επαλήθευσε και σταμάτα.
Ο vpn πελάτης που συνοδεύει το Cisco AnyConnect συμπεριφέρεται σαν συνομιλία: εκτυπώνει μια προτροπή, περιμένει μια γραμμή και μετά εκτυπώνει την επόμενη. Τροφοδότησε αυτή τη συνομιλία από ένα αρχείο ή έναν σωλήνα και το ίδιο δυαδικό εκτελείται χωρίς επίβλεψη. Η τεχνική είναι μία ανακατεύθυνση συν μια διατεταγμένη λίστα απαντήσεων, και η λίστα, όχι η ανακατεύθυνση, καθορίζει αν το script είναι αξιόπιστο.
Δύο πράγματα το χαλάνε στην πράξη. Η σειρά των προτροπών αλλάζει όταν η πύλη ζητά κάτι επιπλέον, και ένας αποθηκευμένος κωδικός μετατρέπει ένα τυπογραφικό λάθος σε κλείδωμα λογαριασμού. Αντιμετώπισε την ακολουθία ως δεδομένα με εκδόσεις που μπορείς να συγκρίνεις μετά από κάθε αλλαγή της πύλης. Αποτύγχανε ηχηρά αντί να επαναλαμβάνεις, γιατί ο βρόχος είναι ακριβώς ο τρόπος με τον οποίο ένας λανθασμένος κωδικός γίνεται κλειδωμένος λογαριασμός.
Μία ακολουθία, με τη σειρά που ρωτά ο πελάτης
Εκτέλεσε τον πελάτη διαδραστικά μία φορά και κατέγραψε κάθε προτροπή με τη σειρά που εμφανίζεται. Αυτό το αντίγραφο γίνεται το αρχείο απαντήσεων. Όταν ανακατευθύνεις το αρχείο στο δυαδικό, η πρώτη γραμμή πρέπει να είναι η ίδια η εντολή σύνδεσης, και για αυτό η ακολουθία ξεκινά με όνομα κεντρικού υπολογιστή και όχι με όνομα χρήστη.
connect vpn.example.com
0
<username>
<password>
y
exit
Το γυμνό 0 επιλέγει το πρώτο προφίλ σύνδεσης όταν η πύλη προσφέρει λίστα· χρησιμοποίησε όποιο ευρετήριο εκτυπώνει η πύλη σου. Το y δέχεται ένα banner σύνδεσης, οπότε διάγραψε αυτή τη γραμμή αν δεν υπάρχει banner και πρόσθεσε μία όπου η πύλη σου κάνει μια επιπλέον ερώτηση. Το exit στο τέλος είναι αυτό που επιτρέπει στον πελάτη να τερματίσει καθαρά όταν καταναλωθεί η τελευταία απάντηση.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Η μη διαδραστική λειτουργία δεν είναι προαιρετική εδώ. Χωρίς το -s ο πελάτης μπορεί να καταλάβει το τερματικό και να αγνοήσει την ανακατευθυνόμενη είσοδο· με αυτό, οι απαντήσεις διαβάζονται από τη ροή και η διεργασία επιστρέφει. Όπου το δυαδικό χρειάζεται αυξημένα δικαιώματα, τύλιξε την κλήση με sudo -n ώστε το script να αποτυγχάνει αμέσως αντί να μπλοκάρει σε προτροπή κωδικού.
Πού διαρρέει το αρχείο απαντήσεων
Ένα αρχείο που περιέχει κωδικό είναι διαπιστευτήριο, οπότε δώσε του τα δικαιώματα ενός: mode 600, ιδιοκτησία του λογαριασμού που εκτελεί την εργασία, και ποτέ μέσα σε κοινόχρηστο ή συγχρονισμένο κατάλογο. Δημιούργησέ το με το mode ήδη εφαρμοσμένο αντί να το διορθώσεις εκ των υστέρων, γιατί ένα αρχείο είναι στιγμιαία αναγνώσιμο από όλους ανάμεσα στην εγγραφή και στο chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Το άλλο μισό είναι το argv. Ένας κωδικός που περνά ως όρισμα είναι ορατός σε κάθε τοπικό χρήστη που απαριθμεί διεργασίες, και καταλήγει και στο ιστορικό του shell. Διάβασέ τον από περιγραφέα αρχείου ή από μεταβλητή περιβάλλοντος αντί αυτού, και βάλε το φορτίο σε εισαγωγικά ώστε το shell να μην μπορεί να επεκτείνει τίποτα μέσα του.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Πρόσεξε τα εισαγωγικά. Μέσα σε διπλά εισαγωγικά, ένας κωδικός που περιέχει ! μπορεί να επεκταθεί από ένα διαδραστικό shell πριν τον δει ποτέ ο πελάτης, και η αποτυχία φτάνει ως γενικό σφάλμα event-not-found που μοιάζει με πρόβλημα πρωτοκόλλου.
Απόδειξε το τούνελ και μετά κλείσε το
Μια κατάσταση συνδεδεμένου αποδεικνύει μόνο ότι ο πελάτης πιστεύει πως έχει συνεδρία. Διάλεξε έναν κεντρικό υπολογιστή που απαντά μόνο από μέσα στο εταιρικό δίκτυο και δοκίμασέ τον μία φορά πριν κάνεις οτιδήποτε άλλο. Μια αποτυχία εκεί είναι βλάβη δρομολόγησης ή πολιτικής, και η επανεκτέλεση της σύνδεσης δεν θα την αλλάξει.
/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect
Έλεγξε την έξοδο κατάστασης πριν και μετά την αποσύνδεση. Ένας πελάτης που μένει με παλιά συνεδρία μπορεί να αρνηθεί την επόμενη σύνδεση ενώ το script αναφέρει ακόμη επιτυχία, και αυτός ο τρόπος αποτυχίας είναι αόρατος αν κοιτάς μόνο τους κωδικούς εξόδου. Σύγκρινε τις δύο μετρήσεις αντί να εμπιστεύεσαι τη δεύτερη μόνη της. Τα ψευδώνυμα σε ένα προφίλ shell αρκούν για καθημερινή χρήση, ενώ οτιδήποτε προγραμματισμένο αξίζει την ίδια επισκόπηση διαπιστευτηρίων και ταυτότητας με κάθε άλλη εργασία χωρίς επίβλεψη.
Όταν μια σταθερή λίστα πάψει να είναι ασφαλής
Ένα αρχείο απαντήσεων κωδικοποιεί τη σημερινή σειρά προτροπών. Ένα αλλαγμένο banner, μια αναγκαστική αλλαγή κωδικού ή μια πρόκληση δεύτερου παράγοντα το μετατρέπουν σε βρόχο που μπορεί να κλειδώσει τον λογαριασμό, και για αυτό το script πρέπει να βγαίνει στην πρώτη απρόσμενη απάντηση αντί να επανεκκινεί.
Κατέγραψε τι εκτύπωσε ο πελάτης, επέστρεψε κατάσταση διάφορη του μηδενός και άφησε τον καλούντα να αποφασίσει. Όπου η πύλη απαιτεί δεύτερο παράγοντα, η ειλικρινής απάντηση είναι ότι μια σύνδεση χωρίς επίβλεψη δεν είναι διαθέσιμη για αυτό το προφίλ, όχι ότι η ακολουθία χρειάζεται μία γραμμή ακόμη.
Η εναλλαγή ανήκει στην ίδια επισκόπηση. Αν το διαπιστευτήριο αποθηκεύεται, απόφασισε ποιος μπορεί να το διαβάσει, πότε αλλάζει και τι το αφαιρεί όταν ξαναχτιστεί ο κεντρικός υπολογιστής. Ένα script που δουλεύει ένα χρόνο επειδή κανείς δεν άγγιξε τον κωδικό δεν είναι σχεδιασμός, αλλά ατύχημα που περιμένει πολιτική εναλλαγής.
Προφίλ που δεν είναι AnyConnect
Δύο παλαιότερα στυλ διαπιστευτηρίων Cisco μπερδεύονται με αυτό. Ένα προφίλ vpnc ζητά IPSec ID, που στην πραγματικότητα είναι το όνομα ομάδας, μετά ένα μυστικό ομάδας και μετά τα δικά σου διαπιστευτήρια, και τα τρία προέρχονται από όποιον διαχειρίζεται την πύλη. Το παλαιό Cisco IPsec είναι διαφορετικό πρωτόκολλο από το AnyConnect, οπότε το vpnc δεν μπορεί να φτάσει υπηρεσία μόνο AnyConnect· το openconnect --protocol=anyconnect είναι ο ανοιχτός πελάτης για αυτή τη δουλειά.
Ένα αρχείο .pcf περιγράφει το προφίλ του παλαιότερου πελάτη. Ο κεντρικός υπολογιστής, το όνομα ομάδας και ο κωδικός ομάδας μέσα του μπορούν να ξαναεισαχθούν με το χέρι σε πελάτη που μιλά Cisco IPsec, αν και το αρχείο δεν είναι καθολική εισαγωγή και οποιαδήποτε μη προεπιλεγμένη θύρα ή λειτουργία τούνελ συνήθως χάνεται στη μεταφορά.
Ξεκίνα από αυτό που προσφέρει πραγματικά η πύλη και μετά διάλεξε τον πελάτη που μιλά αυτό το πρωτόκολλο. Η αντιγραφή προφίλ από άλλη τοποθεσία είναι ο τρόπος με τον οποίο οι άνθρωποι καταλήγουν να αποσφαλματώνουν διαπιστευτήρια που ποτέ δεν ήταν το πρόβλημα.