Αρχείο διαπιστευτηρίων ή υποδοχή διαχείρισης του OpenVPN: τι να δεσμεύσετε με σενάριο
Το auth-user-pass καλύπτει την προτροπή λογαριασμού· η υποδοχή διαχείρισης καλύπτει και τις τέσσερις. Συγκρίνετε την έκθεση, το κόστος σεναρίου και πώς αποτυγχάνει το καθένα σε μια υπηρεσία.
Ένα σενάριο που ξεκινά το OpenVPN και δεν συνδέεται ποτέ συνήθως δεν είναι πρόβλημα δικτύου: ο πελάτης κάθεται σε μια προτροπή χωρίς τερματικό για να τη σχεδιάσει. OpenVPN έχει ακριβώς δύο υποστηριζόμενους τρόπους να απαντήσει σε αυτή την προτροπή χωρίς άνθρωπο, ένα αρχείο διαπιστευτηρίων πίσω από το auth-user-pass και την υποδοχή διαχείρισης, και δεν είναι ανταλλάξιμοι. Το αρχείο κοστίζει μία οδηγία και απαντά σε μία προτροπή· η υποδοχή απαντά σε κάθε προτροπή και δίνει σε οτιδήποτε μπορεί να ανοίξει θύρα loopback ένα κανάλι ελέγχου χωρίς έλεγχο ταυτότητας. Ποιο από τα δύο ανήκει στην ανάπτυξή σας εξαρτάται από το ποια προτροπή μπλοκάρει στην πραγματικότητα και από το ποιο μυστικό μπορείτε να αφήσετε σε ηρεμία.
Ονομάστε την προτροπή πριν επιλέξετε μηχανισμό
Τέσσερις προτροπές φαίνονται ίδιες σε ένα τερματικό. Το ζεύγος λογαριασμού προέρχεται από τη ρύθμιση PAM ή auth-user-pass-verify του διακομιστή και απαντάται από το auth-user-pass. Μια φράση πρόσβασης ιδιωτικού κλειδιού ανήκει στο αρχείο κλειδιού και διαβάζεται μέσω --askpass ή πληκτρολογείται με το χέρι. Ένα πακέτο PKCS#12 ζητά δικό του κωδικό. Ο έλεγχος ταυτότητας διαμεσολαβητή χρησιμοποιεί το αρχείο auth που παίρνει το --http-proxy, όχι τα διαπιστευτήρια λογαριασμού.
Όταν το OpenVPN τρέχει ως παιδί του systemd, της PHP ή του Node δεν υπάρχει τερματικό, οπότε οποιαδήποτε από αυτές μπλοκάρει σιωπηλά. Η διεργασία κάθεται εκεί, το αρχείο καταγραφής σταματά μετά τη γραμμή κρυπτογράφησης και η μονάδα τελικά λήγει σε χρονικό όριο· αυτή η σιωπή είναι ο λόγος που οι άνθρωποι προσθέτουν βρόχο επανάληψης ή sleep αντί να κοιτάξουν ποια προτροπή εκκρεμεί. Μόνο η υποδοχή διαχείρισης μπορεί να απαντήσει και στις τέσσερις. Το αρχείο διαπιστευτηρίων απαντά στην πρώτη και σε τίποτα άλλο.
auth-user-pass: ένα αρχείο, μία προτροπή
Το αρχείο κρατά το όνομα χρήστη στην πρώτη γραμμή και τον κωδικό στη δεύτερη, και τίποτα άλλο: χωρίς εισαγωγικά, χωρίς ονόματα κλειδιών, χωρίς σχόλιο. Ορίστε λειτουργία 600 και κάντε ιδιοκτήτη τον λογαριασμό που εκτελεί το openvpn, που για μια υπηρεσία είναι συχνά ένας ειδικός χρήστης και όχι η σύνδεσή σας. Ένα αρχείο που ανήκει στο root κάτω από το /root είναι η διαφορά ανάμεσα σε μια εντολή που δουλεύει στο κέλυφός σας και σε μια μονάδα που αποτυγχάνει στην εκκίνηση.
Δύο λεπτομέρειες μετατρέπουν ένα σωστό αρχείο σε προτροπή. Ένας επεξεργαστής που αποθηκεύει CRLF αφήνει μια επιστροφή φορέα κολλημένη στον κωδικό, οπότε ο διακομιστής απορρίπτει κωδικό που στο αρχείο φαίνεται σωστός· ελέγξτε με cat -A ή od -c αντί με το μάτι. Και ένα auth-user-pass χωρίς όρισμα μέσα στο προφίλ σημαίνει «ρώτησε τον χρήστη» εξ ορισμού, κάτι που μια δεύτερη οδηγία στη γραμμή εντολών μπορεί να μην παρακάμψει, γιατί το προφίλ αναλύεται εκεί που βρίσκεται.
Η σειρά των επιλογών είναι η τρίτη παγίδα και εξαρτάται από την έκδοση. Κάποιες εκδόσεις του OpenVPN 2.4 αγνοούν το --auth-user-pass όταν εμφανίζεται πριν από το --config, οπότε οι ίδιες δύο επιλογές με την άλλη σειρά συνδέονται. Βάλτε την οδηγία μέσα στο προφίλ ή μετά το --config στη γραμμή εντολών, και κάντε grep στο προφίλ για κάθε εμφάνιση πριν αλλάξετε οτιδήποτε άλλο.
auth-nocache ανήκει σε αυτόν τον μηχανισμό αλλά δεν παρέχει τίποτα. Περιορίζει πόσο καιρό ο πελάτης κρατά το διαπιστευτήριο στη μνήμη, που βοηθά μετά από κατάρρευση και καθόλου όταν λείπει το αρχείο. Μια επανασύνδεση μετά από λήξη συνεδρίας στην πλευρά του διακομιστή ξαναδιαβάζει το αρχείο, οπότε διαπιστευτήριο που δούλευε στην εκκίνηση μπορεί να λήξει στη μέση της ημέρας.
Η υποδοχή διαχείρισης: κάθε προτροπή, περισσότερη επιφάνεια
Ξεκινήστε τον πελάτη με έναν ακροατή και δηλώστε ρητά ότι οι προτροπές θα αναφέρονται πάνω του, χρησιμοποιώντας τις οδηγίες που τεκμηριώνονται στο εγχειρίδιο του OpenVPN 2.6:
management 127.0.0.1 3030
management-query-passwords
Από το bash, κρατήστε τη σύνδεση σε έναν εφεδρικό περιγραφέα αρχείου και απαντήστε με βάση το όνομα της προτροπής και όχι τη θέση, γιατί μια επανασύνδεση μπορεί να ρωτήσει με άλλη σειρά:
exec 3<>/dev/tcp/127.0.0.1/3030
while read -r -u 3 line; do
case "$line" in
*"Need 'Auth' username/password"*)
echo 'username "Auth" alice' >&3
echo 'password "Auth" secret' >&3 ;;
*"Need 'Private Key' password"*)
echo 'password "Private Key" secret' >&3 ;;
esac
done
Το όριο είναι η μεταφορά. Το πρωτόκολλο διαχείρισης είναι απλό κείμενο πάνω από TCP στο loopback, οπότε ο ακροατής δεν πρέπει να δημοσιεύεται σε διεύθυνση LAN ή σήραγγας για να τον προσεγγίζει απομακρυσμένος ελεγκτής· απομακρυσμένος ελεγκτής σημαίνει προώθηση SSH, όχι ευρύτερη δέσμευση. Ο δαίμονας της κοινότητας δέχεται επίσης έναν μόνο πελάτη διαχείρισης κάθε φορά, οπότε ένα GUI ή μια οθόνη δεν μπορούν να μοιράζονται την υποδοχή με το σενάριό σας. Η δεύτερη σύνδεση απορρίπτεται, δεν μπαίνει σε ουρά, και η αποτυχία μοιάζει με σενάριο που κώφεψε.
Αυτή η υποδοχή είναι και κανάλι ελέγχου. Χωρίς κωδικό διαχείρισης, οτιδήποτε μπορεί να συνδεθεί στο 127.0.0.1:3030 μπορεί να διαβάσει κατάσταση, να σκοτώσει τη σήραγγα ή να απαντήσει το ίδιο σε μια προτροπή. Ο κωδικός διαχείρισης και το αρχείο διαπιστευτηρίων είναι μυστικά της ίδιας κλάσης, και και τα δύο αξίζουν την ίδια φροντίδα.
Ποιο ταιριάζει στην ανάπτυξη
Επιλέξτε το αρχείο διαπιστευτηρίων όταν η μόνη προτροπή είναι το ζεύγος λογαριασμού, ο πελάτης τρέχει ως υπηρεσία με σταθερό ιδιοκτήτη, και μπορείτε να κρατήσετε ένα αρχείο 600 έξω από αντίγραφα ασφαλείας που δεν ελέγχετε. Επιλέξτε την υποδοχή διαχείρισης όταν υπάρχει φράση πρόσβασης κλειδιού ή κωδικός PKCS#12, όταν ο περιτύλιγμα ήδη επιβλέπει τη διεργασία, ή όταν χρειάζεται να παρατηρείτε κατάσταση και προτροπές ενώ αποσφαλματώνετε μια επανασύνδεση.
Δύο συνθήκες κινούν την απόφαση. Αν το περιτύλιγμα είναι /bin/sh, μια μονάδα systemd που καλεί απευθείας το δυαδικό, ή ένα ελάχιστο container, η κόλλα υποδοχής μόνο για bash δεν είναι διαθέσιμη και το αρχείο είναι η φθηνότερη απάντηση. Αν το μυστικό περιστρέφεται συχνά, κανένα αρχείο δεν είναι καλό σπίτι γι' αυτό: ρωτήστε ένα κλειδοθήκη από ένα μικρό περιτύλιγμα και αφήστε τη μονάδα να καλεί το περιτύλιγμα, που κρατά την περιστροφή σε ένα σημείο και τον κωδικό έξω από το ιστορικό του κελύφους.
Η υποκατάσταση διεργασίας στέκει ανάμεσα στις δύο και δεν ανήκει σε καμία. Η μονόστιχη εντολή παρακάτω δουλεύει επειδή το bash την επεκτείνει πριν ξεκινήσει το openvpn, όχι επειδή ο πελάτης καταλαβαίνει τη σύνταξη:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Σπάει κάτω από το /bin/sh, σε μονάδα που παρακάμπτει το κέλυφος, και σε εικόνες χωρίς bash ή /dev/fd. Κρατήστε το για διαδραστικές δοκιμές, ποτέ ως το συμβόλαιο από το οποίο εξαρτάται μια υπηρεσία.
Προστατέψτε το μυστικό και μετά επαληθεύστε από το αρχείο καταγραφής
Και οι δύο μηχανισμοί αφήνουν ένα μυστικό αναγνώσιμο από τη διεργασία OpenVPN. Μη βάζετε ποτέ τον κωδικό στη γραμμή εντολών ή στο αρχείο της μονάδας, όπου τα ps και systemctl τον δείχνουν σε κάθε τοπικό χρήστη· περάστε τη διαδρομή προς το αρχείο, όχι την τιμή μέσα του. Όπου τα πιστοποιητικά μπορούν να αντικαταστήσουν το ζεύγος λογαριασμού, αυτό αφαιρεί την κατηγορία της προτροπής αντί να την κρύβει.
Μια σωστή εκτέλεση δείχνει την ακολουθία προτροπών να ολοκληρώνεται και τη συνεδρία να φτάνει στο «Initialization Sequence Completed». Αν ο πελάτης σταματήσει στην ίδια προτροπή, η αντιστοίχιση απέτυχε: εκτυπώστε τις ακριβείς γραμμές που έστειλε η υποδοχή, ελέγξτε τα εισαγωγικά και το όνομα της προτροπής, και διορθώστε το μοτίβο αντί να προσθέσετε sleep. Μια σήραγγα που αναφέρει επιτυχία και δεν μεταφέρει τίποτα είναι πρόβλημα δρομολόγησης ή push, όχι διαπιστευτηρίων.
Έπειτα δοκιμάστε την επανασύνδεση, όχι μόνο την πρώτη εκκίνηση. Ρίξτε τη συνεδρία στην πλευρά του διακομιστή ή περιμένετε το χρονικό της όριο· ο πελάτης ρωτά ξανά, και εκεί φαίνεται αν ένα αρχείο που έμοιαζε σωστό στην εκκίνηση είναι ακόμα αναγνώσιμο από τον λογαριασμό που επανασυνδέεται.