Σύνδεση στο Cisco Secure Client από κέλυφος Linux, χωρίς GUI
Ένα here-document δεν είναι πρωτόκολλο σύνδεσης. Καταγράψτε την πραγματική σειρά των προτροπών, χρησιμοποιήστε expect όταν αυτή ποικίλλει, και κρατήστε τον κωδικό έξω από το argv και το ιστορικό.
Η πεποίθηση είναι ότι ένα here-document με τέσσερις γραμμές αποτελεί πλήρη μη διαδραστική σύνδεση, και αντέχει ακριβώς μέχρι η πύλη να προσφέρει δύο ομάδες, να εκτυπώσει ένα banner ή να ζητήσει token μετά τον κωδικό. Τότε το ίδιο σενάριο πληκτρολογεί τον κωδικό σε ένα μενού που περίμενε αριθμό. Ο πελάτης γραμμής εντολών στο Linux μπορεί να δεχθεί σενάριο, αλλά μόνο αν του δώσετε αυτό που πραγματικά περιμένει και όχι αυτό που υπέθεσε το σεμινάριο.
Το σταθερό here-document είναι μύθος
Ο πελάτης Linux της Cisco εγκαθιστά ένα μικρό πρόγραμμα στο /opt/cisco/anyconnect/bin/vpn, και το Secure Client 5 το παρέχει ακόμη. Όταν τρέχει η υπηρεσία vpnagentd, η σημαία -s διαβάζει απαντήσεις από την τυπική είσοδο με τη σειρά που τις ζητά ο πελάτης. Αυτή η σειρά δεν είναι σταθερή μεταξύ διακομιστών.
Ένα μενού ομάδας προσθέτει μία γραμμή. Ένα banner σύνδεσης προσθέτει άλλη μία. Ένα αίτημα token μετά τον κωδικό διαλύει εντελώς ένα σενάριο τεσσάρων γραμμών, γιατί η πέμπτη γραμμή δεν επρόκειτο ποτέ να είναι το token. Η αποτυχία είναι σιωπηλή: ο πελάτης λαμβάνει λάθος συμβολοσειρά, η απόπειρα σύνδεσης τελειώνει και το σενάριο δεν αναφέρει τίποτα χρήσιμο.
Εκτελέστε τον πελάτη μία φορά με το χέρι στην ίδια πύλη και έκδοση, και σημειώστε τις προτροπές με τη σειρά που εμφανίζονται. Αυτό το αρχείο καταγραφής είναι η προδιαγραφή που πρέπει να ικανοποιεί το σενάριό σας.
Τι περιμένει ο πελάτης
Στη συνήθη περίπτωση μίας ομάδας η ακολουθία είναι όνομα χρήστη, κωδικός και μερικές φορές επιβεβαίωση banner. Η πρώτη γραμμή ενός here-document γίνεται δείκτης μενού μόνο όταν ο διακομιστής παρουσιάσει πραγματικά μενού, γι’ αυτό το ίδιο σενάριο λειτουργεί σε ένα σημείο και αποτυγχάνει στο επόμενο.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Διαβάστε το ως τέσσερις απαντήσεις σε τέσσερις πιθανές ερωτήσεις, όχι ως σταθερό πρωτόκολλο. Το μηδέν είναι επιλογή μενού, όχι κωδικός, και το τελικό y αποδέχεται ένα banner που πολλές πύλες δεν στέλνουν ποτέ.
Χρησιμοποιήστε expect όταν η σειρά δεν είναι προβλέψιμη
Όταν η σειρά των προτροπών ποικίλλει, σταματήστε να μετράτε γραμμές και περιμένετε την προτροπή. Ένα σενάριο expect εκκινεί την εντολή connect, περιμένει την προτροπή ονόματος χρήστη, στέλνει, περιμένει την προτροπή κωδικού, στέλνει και μετά περιμένει την κατάσταση συνδεδεμένου. Κάθε αναμονή έχει το δικό της χρονικό όριο.
Αντιμετωπίστε το χρονικό όριο ως αποτυχία και βγείτε. Ένα σενάριο που συνεχίζει να στέλνει είσοδο μετά από μια απρόσμενη προτροπή θα πληκτρολογήσει πρόθυμα τον κωδικό σε ένα κέλυφος, ένα μενού ή ό,τι άλλο τυχαίνει να διαβάζει. Έτσι ένα σενάριο σύνδεσης γίνεται περιστατικό.
Το expect σας δίνει επίσης ένα αρχείο καταγραφής που μπορείτε να τηρείτε με το μυστικό αφαιρεμένο, και αξίζει περισσότερο από τον κωδικό εξόδου όταν μια πύλη αλλάζει τις προτροπές της μετά από αναβάθμιση.
Το μυστικό πρέπει να ζει κάπου
Κάθε εκδοχή αυτού του προβλήματος μοιράζεται μία αδυναμία: ο κωδικός πρέπει να υπάρχει σε μορφή που ο πελάτης μπορεί να διαβάσει. Η μετάδοσή του ως ορίσματος τον εκθέτει στον πίνακα διεργασιών. Η αναπαραγωγή του μέσω σωλήνα τον βάζει συχνά στο ιστορικό του κελύφους. Και τα δύο είναι αναγνώσιμα από άλλους τοπικούς χρήστες σε κοινόχρηστο host αναπήδησης.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Ένα αρχείο με δικαιώματα 600 που ανήκει στον λογαριασμό είναι το ελάχιστο, και παραμένει μυστικό σε απλό κείμενο στον δίσκο. Το secret-tool lookup διαβάζει από το κλειδοθήκη του Linux, και στο macOS την ίδια δουλειά κάνει το security find-generic-password -w. Όπου ο οργανισμός υποστηρίζει έλεγχο ταυτότητας με πιστοποιητικό ή SAML, προτιμήστε το, γιατί ένας αποθηκευμένος κωδικός μαζί με MFA δεν μπορεί ακόμη να ολοκληρώσει σύνδεση χωρίς άνθρωπο.
Επιβεβαιώστε τη σήραγγα και μετά αναλάβετε τον τερματισμό
Μην εμπιστεύεστε την απουσία μηνύματος σφάλματος. Ρωτήστε τον πελάτη για την κατάστασή του και ελέγξτε τη διεπαφή ανεξάρτητα:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Η κατάσταση θα πρέπει να λέει Connected, και μια διεπαφή σήραγγας θα πρέπει να έχει διεύθυνση. Στη συνέχεια ζητήστε έναν πόρο που η σήραγγα πρέπει να φτάνει, γιατί μια συνδεδεμένη κατάσταση χωρίς διαδρομή είναι πραγματικό αποτέλεσμα και εύκολο να περάσει απαρατήρητο.
Αποσυνδεθείτε με vpn disconnect, και αφήστε το σενάριο που ξεκίνησε τη σήραγγα να αναλάβει τον τερματισμό. Μια αποτυχημένη εργασία που αφήνει μια συνεδρία ανοιχτή καταναλώνει μια θέση άδειας και φαίνεται σαν πρόβλημα ταυτοποίησης στον επόμενο που θα δοκιμάσει.
Σειρά εργασιών: επιβεβαιώστε το vpnagentd, καταγράψτε την πραγματική σειρά των προτροπών, επιλέξτε here-document ή expect, κρατήστε το μυστικό έξω από το argv και το ιστορικό, επαληθεύστε την κατάσταση και έναν πόρο, και μετά αποσυνδεθείτε στο ίδιο σενάριο.