Οι δημόσιες σελίδες SaaS μπορούν να μένουν ανοιχτές σε όλους, ενώ οι ενέργειες διαχείρισης πίσω τους αρνούνται οποιονδήποτε εκτός VPN. Ο μηχανισμός που το κάνει εφικτό δεν είναι κρυφό μενού ούτε ξεχωριστή σελίδα σύνδεσης· είναι έλεγχος της διαδρομής δικτύου που παρέδωσε το αίτημα. Αν κάνετε λάθος στα στοιχεία της διεύθυνσης, ο έλεγχος είτε κλειδώνει έξω πραγματικούς διαχειριστές είτε δέχεται οποιονδήποτε μπορεί να πληκτρολογήσει μια κεφαλίδα. Ξεκινήστε από αυτό που λαμβάνει πραγματικά το origin.

Τι λαμβάνει πραγματικά το origin μετά τη σήραγγα

Όταν ένα πρόγραμμα περιήγησης φτάνει στον δημόσιο ιστότοπο μέσω VPN που μεταφέρει και κίνηση διαδικτύου, η πύλη μεταφράζει τη σύνδεση πριν αυτή φύγει. Το SaaS βλέπει τη δημόσια διεύθυνση εξόδου της πύλης, συνήθως μία διεύθυνση ή ένα μικρό εύρος, και δεν βλέπει ποτέ τη διεύθυνση σήραγγας του φορητού. Γι’ αυτό η προσθήκη του 10.90.0.42 στη λίστα επιτρεπόμενων αποτυγχάνει, και γι’ αυτό η προσθήκη ολόκληρου του RFC 1918 αποτυγχάνει ακόμη πιο ηχηρά: η δεύτερη δέχεται κάθε ιδιωτικό δίκτυο που μπορεί να φτάσει σε εσάς. Η μόνη διεύθυνση που αξίζει συνθήκη είναι αυτή που κατέχει πραγματικά ο οργανισμός σας στην έξοδο.

curl -s https://ifconfig.me
dig +short admin.example.com

Η διαχωρισμένη σήραγγα σπάει ήσυχα αυτή την υπόθεση. Αν το VPN μεταφέρει μόνο ιδιωτικές διαδρομές γραφείου, το αίτημα προς το δημόσιο όνομα κεντρικού υπολογιστή διαχείρισης βγαίνει από τον τοπικό πάροχο και το origin βλέπει οικιακή διεύθυνση. Ένα συνδεδεμένο εικονίδιο VPN δεν αποδεικνύει τίποτα για αυτόν τον συγκεκριμένο προορισμό, οπότε δοκιμάστε τον προορισμό και όχι τη σήραγγα.

Σταματήστε και διορθώστε τη δρομολόγηση πριν γράψετε οποιαδήποτε πολιτική αν η διεύθυνση εξόδου διαφέρει ανά χρήστη. Μια συνθήκη που ταιριάζει μόνο σε μερικούς διαχειριστές είναι χειρότερη από καμία συνθήκη, γιατί κρύβει το πρόβλημα μέχρι ένα περιστατικό.

Βασιστείτε μόνο στον μεσολαβητή που ξαναγράφει τη διεύθυνση

Οι περισσότεροι δημόσιοι ιστότοποι βρίσκονται πίσω από CDN ή αντίστροφο μεσολαβητή, οπότε η διεύθυνση υποδοχής του origin ανήκει σε αυτό το frontend και όχι στον επισκέπτη. Το frontend συνήθως προωθεί την αρχική διεύθυνση σε μια κεφαλίδα, και αυτή η κεφαλίδα ελέγχεται από τον επιτιθέμενο εκτός αν το origin τη δέχεται μόνο από γνωστούς μεσολαβητές. Ρυθμίστε ρητά τη λίστα έμπιστων πηγών και κάντε το origin μη προσβάσιμο από οπουδήποτε αλλού. Χωρίς αυτό το δεύτερο μισό, ο επιτιθέμενος παρακάμπτει τον μεσολαβητή και στέλνει την κεφαλίδα απευθείας.

set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
curl -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin

Η ίδια λογική ισχύει για το πρωτόκολλο PROXY: είναι αξιόπιστο μόνο όταν ο ακροατής είναι δεσμευμένος σε μια διεπαφή που ο μεσολαβητής μπορεί να φτάσει και κανείς άλλος δεν μπορεί. Το πλαίσιο διεύθυνσης που λείπει πρέπει να αποτυγχάνει τον προστατευμένο έλεγχο αντί να πέφτει σε προεπιλεγμένη άδεια. Μια κεφαλίδα που απουσιάζει δεν αποτελεί απόδειξη έμπιστης διαδρομής.

Συνδέστε τη συνθήκη με κάθε προστατευμένη λειτουργία

Βάλτε τον έλεγχο στο όριο εξουσιοδότησης από το οποίο περνά κάθε προστατευμένη λειτουργία, όχι στη σελίδα που αποδίδει το μενού. Ομάδες διαδρομών, middleware ή ένα επίπεδο πολιτικής λειτουργούν όλα· ένα αντίγραφο ανά χειριστή όχι, γιατί ο χειριστής που θα προσθέσει κάποιος το επόμενο τρίμηνο δεν θα το έχει.

user = requireAuthenticatedSession()
requirePermission(user, "admin")
requireVpnEgress(verifiedClientAddress(request))
performProtectedOperation(user, request)

Το ίδιο όριο πρέπει να καλύπτει το JSON API, τις εξαγωγές, τα υπογεγραμμένα URL λήψης και τη χειραψία WebSocket, αφού κανένα από αυτά δεν χρειάζεται να ζητηθεί πρώτα η σελίδα HTML. Ένας σύνδεσμος λήψης που δημιουργήθηκε όσο το VPN ήταν ενεργό παραμένει έγκυρος μετά, εκτός αν το σημείο λήψης ελέγξει ξανά. Οι μακροχρόνιες συνεδρίες χρειάζονται επίσης κανόνα επανεκτίμησης, αλλιώς ένα πιστοποιημένο αίτημα γίνεται μόνιμη εξαίρεση. Η προεπιλεγμένη άρνηση είναι η μόνη ρύθμιση που επιβιώνει από εναλλαγή προσωπικού.

Οι κοινές κρυφές μνήμες είναι ο άλλος δρόμος γύρω από τον έλεγχο. Μια κρυφή μνήμη που κρατά ήδη μια προστατευμένη απόκριση μπορεί να την σερβίρει χωρίς να επικοινωνήσει με το origin, οπότε σημειώστε τις αποκρίσεις διαχείρισης ως ιδιωτικές και κρατήστε τις έξω από κοινόχρηστο χώρο αποθήκευσης. Αν μια κρυφή μνήμη πρέπει να τις σερβίρει, ο έλεγχος πρόσβασης πρέπει να εκτελεστεί πριν το σερβίρισμα, κάτι που συνήθως σημαίνει ότι δεν μπορεί καθόλου να είναι κοινή κρυφή μνήμη.

Δοκιμάστε τις παρακάμψεις που μόλις κλείσατε

Εξασκηθείτε στο πλέγμα και όχι στην ευνοϊκή διαδρομή: ένας διαχειριστής μέσω VPN, ο ίδιος διαχειριστής χωρίς αυτό, ένας μη διαχειριστής μέσω αυτού, και μια πλαστή κεφαλίδα διεύθυνσης. Προσθέστε ένα αίτημα απευθείας στο origin και ένα αίτημα με αποθηκευμένη απόκριση, γιατί αυτά τα δύο παρακάμπτουν εντελώς το frontend.

curl -sI https://admin.example.com/export.csv
curl -s -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
curl -s https://admin.example.com/api/me -o /dev/null -w '%{http_code}\n'

Κάθε αίτημα πρέπει να επιστρέφει την κατάσταση που υπόσχεται η πολιτική, και το αρχείο καταγραφής πρέπει να καταγράφει ποιο στοιχείο διεύθυνσης χρησιμοποιήθηκε. Καλύψτε το IPv6 ξεχωριστά, γιατί ένα origin διπλής στοίβας μπορεί να δει διαφορετική οικογένεια πηγών από αυτή που δοκιμάσατε. Κρατήστε τις συνήθεις λειτουργίες πελατών σε λειτουργία εκτός VPN, αλλιώς η αλλαγή θα αναιρεθεί την πρώτη φορά που ένας πελάτης θα παραπονεθεί. Γράψτε το αναμενόμενο αποτέλεσμα για κάθε γραμμή πριν την εκτελέσετε, ώστε μια απρόσμενη επιτυχία να είναι ορατή.

Η διεύθυνση εξόδου αποδεικνύει μια επιτρεπόμενη διαδρομή δικτύου, όχι ένα πρόσωπο και όχι μια διαχειριζόμενη συσκευή. Κρατήστε την ως μία συνθήκη δίπλα στην ταυτοποίηση και την άδεια, και η περιοχή διαχείρισης μένει στενή χωρίς να μετατρέπεται όλο το προϊόν σε υπηρεσία μόνο για VPN. Αυτός ο διαχωρισμός είναι ο σχεδιασμός, όχι περιορισμός του.

Σχετικά άρθρα