Η κρυπτογράφηση της σήραγγας WSS σταματά στον τερματισμό TLS, όχι στην εφαρμογή
Ένα URL wss:// αποδεικνύει TLS σε ένα άλμα. Το αν το ωφέλιμο φορτίο έχει δική του κρυπτογράφηση εξαρτάται από το τι βάζει μέσα ο πελάτης και ποιος τερματίζει αυτό το TLS.
Μια σήραγγα που μεταφέρεται μέσα σε ασφαλές WebSocket έχει ακριβώς τόση κρυπτογράφηση όση έβαλε μέσα ο πελάτης, όχι περισσότερη. Το σχήμα wss:// λέει ότι το TLS προστατεύει μία σύνδεση σε ένα άλμα. Δεν λέει τίποτα για το αν τα byte μέσα στα μηνύματα WebSocket προστατεύονται χωριστά, και αυτή η διάκριση καθορίζει ποιος μπορεί να διαβάσει την κίνησή σας όταν κάτι στη μέση τερματίζει το TLS.
Δύο επίπεδα που μοιάζουν με ένα
Ένα ασφαλές WebSocket είναι TLS πάνω στο οποίο εκτελείται χειραψία WebSocket, όπως περιγράφει το RFC 6455 στις ενότητες για τη σύνδεση και την ασφάλεια. Το επίπεδο TLS πιστοποιεί τον διακομιστή και κρυπτογραφεί τη ροή, και μετά το επίπεδο WebSocket πλαισιώνει ό,τι αποφασίσει να στείλει η εφαρμογή.
Αυτές είναι δύο ανεξάρτητες αποφάσεις, και ένα διάγραμμα που ζωγραφίζει μία κλειδαριά σε όλη τη διαδρομή κρύβει τη δεύτερη. Ρωτήστε ποιος τερματίζει τη σύνδεση TLS. Μετά ρωτήστε τι βάζει ο πελάτης μέσα σε κάθε μήνυμα. Όλα τα υπόλοιπα για την ανάπτυξη προκύπτουν από αυτές τις δύο απαντήσεις.
Σχέδιο A: η μεταφορά είναι η μόνη κρυπτογράφηση
Στο απλούστερο σχέδιο, ο πελάτης παίρνει ακατέργαστα πακέτα IP και τα τυλίγει σε μηνύματα WebSocket. Τίποτα μέσα δεν είναι κρυπτογραφημένο, οπότε το στοιχείο που κρατά τη συνεδρία TLS διαβάζει ωφέλιμα φορτία σε απλό κείμενο. Όταν αυτό το στοιχείο είναι ο δικός σας διακομιστής σήραγγας, αυτό είναι το προβλεπόμενο τελικό σημείο και το σχέδιο είναι συνεπές, γιατί ο διακομιστής θα έβλεπε ούτως ή άλλως την κίνηση.
Γίνεται διαφορετική διάταξη όταν ένας διαμεσολαβητής επιθεώρησης βρίσκεται στη διαδρομή και τερματίζει το TLS με πιστοποιητικό που εμπιστεύεται ο πελάτης. Αυτός ο διαμεσολαβητής κρατά τώρα το ίδιο απλό κείμενο που θα κρατούσε ο διακομιστής, και καμία ποσότητα πλαισίωσης WebSocket δεν το αλλάζει. Το κατάστημα εμπιστοσύνης του πελάτη αποφάσισε αυτό το αποτέλεσμα πολύ πριν ανοίξει η σήραγγα, γιατί επέλεξε να δεχτεί αυτό το πιστοποιητικό για αυτό το όνομα. Ο διαμεσολαβητής βλέπει επίσης τον ζητούμενο κεντρικό υπολογιστή και το μέγεθος κάθε μηνύματος, που αρκεί για να αποτυπώσει πολλή δραστηριότητα χωρίς να αποκρυπτογραφήσει τίποτα άλλο.
Σχέδιο B: το φορτίο φέρει τα δικά του κλειδιά
Στο δεύτερο σχέδιο, ο πελάτης κρυπτογραφεί και πιστοποιεί τα πακέτα του με πρωτόκολλο VPN που έχει δική του ταυτότητα ομοτίμου και ανταλλαγή κλειδιών, και μετά μεταφέρει το αποτέλεσμα μέσα σε μηνύματα WebSocket. Ο τερματισμός του εξωτερικού TLS εδώ εκθέτει κρυπτοκείμενο, όχι κίνηση. Ο διαμεσολαβητής μπορεί να δει μεγέθη μηνυμάτων και χρονισμό, και τίποτα άλλο στο φορτίο. Αυτή είναι πολύ μικρότερη έκθεση, και παραμένουν μεταδεδομένα που αξίζει να ονομαστούν σε μια αναθεώρηση αντί να τα παραμερίσουμε.
Τα δικά του τελικά σημεία του εσωτερικού πρωτοκόλλου βλέπουν ακόμη απλό κείμενο, που είναι το νόημα της διάταξης και επίσης το όριό της. Αν ένα στοιχείο στο τελικό σημείο είναι εξουσιοδοτημένο να διαβάζει δεδομένα πριν από την κρυπτογράφηση ή μετά την αποκρυπτογράφηση, το επιπλέον επίπεδο δεν το περιορίζει. Τα κλειδιά, και το λογισμικό που τα χειρίζεται, παραμένουν το όριο που έχει σημασία.
Μια ετικέτα VPN, ένα γνώριμο εικονίδιο πελάτη ή μια σελίδα μάρκετινγκ δεν είναι απόδειξη ότι αυτό το σχέδιο υπάρχει. Η ανάγνωση της μορφής φορτίου είναι.
Εντοπίστε πού εμφανίζεται στην πραγματικότητα το απλό κείμενο
Το σχήμα URL σας δίνει ένα γεγονός, οπότε πάρτε τα υπόλοιπα από τις διεπαφές. Εκτελέστε τους ελέγχους παρακάτω με σειρά, γιατί ο καθένας στενεύει τον επόμενο:
ss -tnp | grep -E ':(443|8443)\b' ip -br link show type tun openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -brief tcpdump -ni tun0 -c 5 -X
Ξεκινήστε από την εξωτερική σύνδεση. Μία μακρόβια συνεδρία TCP στη θύρα TLS είναι το πώς μοιάζει ένας φορέας WebSocket, και μια δεύτερη συνεδρία σε άσχετο κεντρικό υπολογιστή αξίζει εξήγηση πριν κοιτάξετε βαθύτερα. Μετά βρείτε τη διεπαφή σήραγγας στον πελάτη, γιατί μια συσκευή tun ή tap σας λέει ότι ο πελάτης χειρίζεται πακέτα IP αντί να διαμεσολαβεί μία ροή εφαρμογής.
Η σύλληψη στη διεπαφή σήραγγας συνήθως λύνει το ζήτημα του φορτίου. Αναγνώσιμες κεφαλίδες εκεί σημαίνουν ότι τα εσωτερικά πακέτα δεν κρυπτογραφήθηκαν ποτέ χωριστά, ενώ φορτία υψηλής εντροπίας σημαίνουν ότι κρυπτογραφήθηκαν. Επαναλάβετε τη σύλληψη στην εξωτερική διεπαφή και συγκρίνετε τις δύο: αν και οι δύο φαίνονται τυχαίες, το εσωτερικό επίπεδο κάνει δουλειά που το εξωτερικό δεν μπορεί να αναιρέσει.
Επανεξετάστε την εμπιστοσύνη που όντως δώσατε
Ένα εγκατεστημένο εταιρικό πιστοποιητικό ρίζας είναι γεγονός για το κατάστημα εμπιστοσύνης του πελάτη, όχι δήλωση για το τι καταγράφει ή επιθεωρεί οποιοσδήποτε διαμεσολαβητής. Καθορίστε την αναπτυγμένη πολιτική και την πραγματική διαδρομή σύνδεσης αντί να συνάγετε συμπεριφορά από την παρουσία μιας CA.
Σε διαχειριζόμενο εξοπλισμό, ρωτήστε τον διαχειριστή ποιο στοιχείο τερματίζει το TLS, αν ο πελάτης επικυρώνει καρφιτσωμένο πιστοποιητικό ή δημόσιο, και ποια είναι η μορφή φορτίου. Αυτές οι τρεις απαντήσεις παράγουν ένα εύρημα που μπορείτε να υπερασπιστείτε αργότερα.
Γράψτε το αποτέλεσμα ως όριο και όχι ως ετυμηγορία. "Το TLS τερματίζεται στον διαμεσολαβητή επιθεώρησης, και το εσωτερικό φορτίο είναι χωριστά κρυπτογραφημένο με κλειδιά που κρατούν μόνο τα τελικά σημεία" είναι δήλωση ελέγξιμη που επιβιώνει από αλλαγή προμηθευτή. Το "Τα WebSockets είναι ασφαλή" δεν είναι.