OpenVPN push-peer-info: επισήμανση πελατών χωρίς παραχώρηση πρόσβασης
Ένα πεδίο UV_ ταξιδεύει μέσα από το πιστοποιημένο τούνελ, αλλά η τιμή παραμένει ισχυρισμός του πελάτη. Συνδέστε το, επαληθεύστε τι έφτασε και κρατήστε την εξουσιοδότηση στον διακομιστή.
Οι ετικέτες ανάπτυξης είναι ο συνήθης λόγος που οι άνθρωποι καταφεύγουν σε αυτή τη λειτουργία: κάθε σύνδεση πρέπει να φέρει κάτι σαν τοποθεσία ή ρόλο, και ο διακομιστής πρέπει να το διαβάζει χωρίς να επινοεί δεύτερη μορφή διαπιστευτηρίων. Το OpenVPN της κοινότητας διαθέτει ήδη τον μηχανισμό, και είναι μικρός. Το κομμάτι που πονάει είναι οι προσδοκίες. Ο ορισμός μιας συνηθισμένης μεταβλητής στο προφίλ του πελάτη δεν κάνει τίποτα στον διακομιστή, και μια τιμή που φτάνει τελικά αποδεικνύει μόνο ότι ο πελάτης την έστειλε.
Αυτός είναι ένας οδηγός για τη διαδρομή που λειτουργεί, το βήμα επαλήθευσης που δείχνει τι έφτασε πραγματικά, και την επαναφορά που δεν αφήνει πίσω της μισοδιαμορφωμένο άγκιστρο. Τίποτα εδώ δεν απαιτεί νέο πιστοποιητικό, νέο πρόσθετο ή επέκταση πρωτοκόλλου.
Ορίστε τη μεταβλητή και ενεργοποιήστε τη διαδρομή
Δύο γραμμές κάνουν τη δουλειά στο προφίλ του πελάτη, και χρειάζονται και οι δύο. Χωρίς την πρώτη δεν υπάρχει τίποτα να σταλεί· χωρίς τη δεύτερη ο πελάτης δεν προσφέρει καθόλου πληροφορίες ομοτίμου. Η σειρά δεν έχει σημασία, και αξίζει να το ξέρετε γιατί οι δύο γραμμές καταλήγουν συχνά σε διαφορετικά σημεία ενός παραγόμενου προφίλ. Αυτό που μετράει είναι να επιβιώσουν και οι δύο από οτιδήποτε ξαναγράψει το προφίλ πριν το διαβάσει ο πελάτης.
setenv UV_DEPLOY field-support
push-peer-info
Το πρόθεμα UV_ δεν είναι διακοσμητικό. Μια απλή μεταβλητή DEPLOY μένει τοπική στη διεργασία του πελάτη και δεν προωθείται ποτέ, ενώ η μορφή με πρόθεμα είναι ο χώρος ονομάτων που επιφυλάσσει το πρωτόκολλο για πεδία ορισμένα από τον χρήστη. Διατηρήστε άθικτο το υπόλοιπο του εγκεκριμένου προφίλ και επιβεβαιώστε ότι η έκδοση πελάτη που αναπτύσσετε υποστηρίζει και τις δύο οδηγίες πριν την κυκλοφορήσετε.
Ένας πρακτικός έλεγχος ανήκει εδώ και όχι στο τέλος: βεβαιωθείτε ότι η οδηγία φτάνει στο δυαδικό του πελάτη και δεν καταπίνεται από ένα περιτύλιγμα. Ένας γραφικός πελάτης που παράγει τη δική του γραμμή εντολών, ή μια διεπαφή διαχείρισης που επαναφορτώνει ένα αποθηκευμένο προφίλ, μπορεί να πετάξει γραμμές που δεν αναγνωρίζει. Αν ο διακομιστής δεν βλέπει τίποτα, αυτό είναι το πρώτο σημείο για έλεγχο.
Διαβάστε το πεδίο από ένα άγκιστρο του διακομιστή
Στην πλευρά του διακομιστή, οι πληροφορίες ομοτίμου που λαμβάνονται επικυρώνονται και εισάγονται στο περιβάλλον της ροής εργασίας σύνδεσης, και αυτό είναι που τις καθιστά αναγνώσιμες από ένα άγκιστρο χωρίς δική σας εργασία πρωτοκόλλου. Ο διακομιστής δεν χρειάζεται να αναλύσει το κανάλι ελέγχου ή να αποθηκεύσει κάτι για εσάς· η τιμή είναι απλώς παρούσα όσο ρυθμίζεται η σύνδεση. Ένα ελάχιστο σενάριο client-connect που καταγράφει την ετικέτα δίπλα στο πιστοποιημένο όνομα μοιάζει έτσι.
#!/bin/sh
# /etc/openvpn/server/hooks/label.sh
printf '%s %s\n' "$common_name" "${UV_DEPLOY:-unset}" \
>> /var/log/openvpn/deploy-labels.log
Διαβάστε τη μεταβλητή μέσω του περιβάλλοντος αντί να αναλύετε το αρχείο καταγραφής, και δώστε της πάντα μια προεπιλεγμένη τιμή. Το ${UV_DEPLOY:-unset} κρατά το σενάριο λειτουργικό για πελάτες που δεν στέλνουν ποτέ το πεδίο, που είναι η κανονική κατάσταση κατά τη σταδιακή ανάπτυξη. Μην αδειάζετε ολόκληρο το περιβάλλον σε ένα αρχείο καταγραφής για να βρείτε το όνομα· περιέχει πολύ περισσότερα από την ετικέτα, συμπεριλαμβανομένων τιμών που δεν σκοπεύατε να διατηρήσετε.
Εκτελέστε το σενάριο με το χέρι και θα αναφέρει unset για τα πάντα, επειδή ένα χειροκίνητο κέλυφος δεν φέρει το περιβάλλον της σύνδεσης. Αυτό δεν είναι σφάλμα στο σενάριο και δεν είναι απόδειξη ότι λείπει το πεδίο. Δοκιμάστε το μέσω πραγματικής σύνδεσης, που είναι το μόνο πλαίσιο όπου υπάρχει η μεταβλητή.
Επαληθεύστε τι έφτασε πραγματικά
Συνδέστε έναν πελάτη με την ετικέτα και έναν χωρίς, και μετά διαβάστε το αρχείο. Το ζεύγος είναι το τεστ: η μία γραμμή πρέπει να φέρει την τιμή και η άλλη την προεπιλεγμένη τιμή, και οι δύο πρέπει να ονομάζουν την ίδια πιστοποιημένη ταυτότητα που περιμένετε.
tail -n 5 /var/log/openvpn/deploy-labels.log
# field-support deployed-client-07
# unset legacy-laptop-02
Αυτές οι γραμμές σχολίων είναι η μορφή της εξόδου, όχι αντίγραφο από τον διακομιστή σας· διαβάστε το δικό σας αρχείο. Αν και ο δεύτερος πελάτης δείχνει τιμή, η μεταβλητή έχει οριστεί κάπου αλλού στο περιβάλλον, και διαβάζετε μια παλιά ρύθμιση αντί για το πεδίο ομοτίμου.
Ελέγξτε και το αρχείο καταγραφής του διακομιστή για τη σύνδεση. Οι πληροφορίες ομοτίμου μπορεί να εμφανιστούν εκεί, κάτι που είναι βολικό για αποσφαλμάτωση και λόγος να κρατάτε τις τιμές βαρετές: χωρίς ονόματα ανθρώπων, χωρίς αριθμούς εισιτηρίων, τίποτα που δεν θα θέλατε να δει κάποιος αναγνώστης του αρχείου.
Αντιμετωπίστε την ετικέτα ως ισχυρισμό, όχι ως ταυτότητα
Όποιος μπορεί να επεξεργαστεί το προφίλ του πελάτη μπορεί να αλλάξει την ετικέτα, και το ότι το τούνελ είναι πιστοποιημένο δεν κάνει την ετικέτα έγκυρη. Η μεταφορά προστατεύει την τιμή σε πτήση· δεν πιστοποιεί τον ισχυρισμό. Η εξουσιοδότηση ανήκει ακόμη στην πιστοποιημένη ταυτότητα και σε ένα αρχείο εγγραφής που κατέχει ο διακομιστής, με την ετικέτα να συγκρίνεται με εκείνο το αρχείο όταν έχει σημασία.
Αυτή η διάκριση καθορίζει πού μπορεί να χρησιμοποιηθεί η ετικέτα. Καλές χρήσεις είναι η δρομολόγηση μιας συνεδρίας στο σωστό αρχείο καταγραφής, η επιλογή μιας ομάδας εμφάνισης σε έναν πίνακα ελέγχου, ή η επισήμανση μιας συνεδρίας υποστήριξης ώστε ένας άνθρωπος να τη βρει αργότερα. Κακές χρήσεις είναι η αποδοχή μιας συσκευής σε ένα υποδίκτυο, η επιλογή πολιτικής τείχους προστασίας, ή η απόφαση ποια δεδομένα πελάτη μπορεί να διαβάσει η συνεδρία.
Επικυρώστε την τιμή πριν φτάσει σε διαδρομή, ερώτημα ή εντολή κελύφους. Μια λίστα επιτρεπόμενων αναμενόμενων συμβολοσειρών αρκεί για μια ετικέτα ανάπτυξης, και δεν κοστίζει τίποτα. Μην παρεμβάλλετε ποτέ μια συμβολοσειρά που παρέχει το ομότιμο σε γραμμή εντολών κελύφους, και περιορίστε οποιαδήποτε αποθηκευμένη παρατήρηση στη συνεδρία και όχι σε διεύθυνση τούνελ που θα ξαναχρησιμοποιήσει ο επόμενος πελάτης.
case "${UV_DEPLOY:-}" in
field-support|field-qa|lab) : ;;
*) UV_DEPLOY=unknown ;;
esac
Επαναφέρετε το καθαρά
Η αφαίρεση της λειτουργίας είναι δύο διαγραφές και μία επαλήθευση. Αφαιρέστε τις γραμμές setenv και push-peer-info από το προφίλ του πελάτη, και μετά αφαιρέστε ή απενεργοποιήστε το άγκιστρο και τον στόχο καταγραφής του στον διακομιστή.
grep -rn 'UV_DEPLOY\|push-peer-info' /etc/openvpn/
tail -n 3 /var/log/openvpn/deploy-labels.log
Επανασυνδέστε έναν πελάτη μετά και επιβεβαιώστε ότι η γραμμή καταγραφής σταματά να εμφανίζεται. Ένα άγκιστρο που συνεχίζει να ενεργοποιείται μετά την αλλαγή προφίλ είναι συνήθως ένα δεύτερο προφίλ που εξακολουθεί να είναι αναπτυγμένο σε δοκιμαστική συσκευή, και το να το βρείτε τώρα είναι φθηνότερο από το να το βρείτε κατά τη διάρκεια ελέγχου.
Αυτό που μένει στο τέλος είναι ένα μικρό, περιορισμένο κομμάτι μεταδεδομένων συνεδρίας με τεκμηριωμένη προέλευση: ο πελάτης το ισχυρίζεται, ο διακομιστής το καταγράφει, και τίποτα σχετικά με την πρόσβαση δεν εξαρτάται από αυτό. Αυτή είναι η χρήσιμη εκδοχή της λειτουργίας, και δεν χρειάζεται νέο διαπιστευτήριο για να φτάσετε εκεί.