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

Περιγράψτε τη διαδρομή πριν συγκρίνετε οτιδήποτε:

Client -> approved reverse proxy -> application origin

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

Δύο είδη αποδεικτικών διεύθυνσης

Ο ομότιμος υποδοχής είναι γεγονός για μία σύνδεση TCP: κάτι ολοκλήρωσε μια χειραψία από εκείνη τη διεύθυνση. Δεν είναι απαραίτητα το πρόσωπο, η συσκευή ή ο λογαριασμός που σας ενδιαφέρει, επειδή ένα VPN ή μια έξοδος Tor μπορούν νόμιμα να είναι η πηγή που παρατηρεί μια υπηρεσία. Παραμένει όμως η μόνη διεύθυνση που επαλήθευσε ο ίδιος ο κεντρικός υπολογιστής, και αυτή είναι όλη της η αξία.

Ένα πεδίο προώθησης είναι μεταδεδομένα για μια αλυσίδα. X-Forwarded-For, X-Real-IP και το τυποποιημένο πεδίο Forwarded μπορεί να το γράψει οποιοσδήποτε πελάτης φτάνει σε ένα τελικό σημείο που τα αναπαράγει, άρα η αξιοπιστία τους εξαρτάται απολύτως από το ποιος είχε άδεια να τα θέσει.

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

Μια κεφαλίδα δεν αναδρομολογεί ποτέ τη σύνδεση

Η εγγραφή μιας διεύθυνσης σε ένα πεδίο προώθησης δεν αλλάζει την πηγή της σύνδεσης TCP που φτάνει στον διακομιστή, ούτε αλλάζει τη δρομολόγηση πουθενά στη διαδρομή. Η συνηθισμένη δρομολόγηση VPN ή το NAT πηγής παραδίδει κίνηση χωρίς καμία κεφαλίδα HTTP. Παρομοίως, μια πύλη διέλευσης δεν ξαναγράφει μια σωστά προστατευμένη ανταλλαγή HTTPS χωρίς να αλλάξει τη διάταξη του τελικού σημείου TLS.

Το αντίστροφο λάθος είναι εξίσου συχνό: το HTTPS δεν κάνει αληθή μια κεφαλίδα προώθησης που παρέχει ο πελάτης. Προστατεύει τη μεταφορά μιας ψευδούς δήλωσης εξίσου καλά με μιας αληθινής.

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

Ονομάστε τον διαμεσολαβητή που επιτρέπεται να ισχυρίζεται

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

Η μονάδα πραγματικής IP του NGINX δείχνει τον διαχωρισμό καθαρά. set_real_ip_from ονομάζει τους αποστολείς των οποίων ο ισχυρισμός μετράει, και real_ip_header λέει ποιο πεδίο τον φέρει· το πρώτο ασκεί την εμπιστοσύνη, το δεύτερο λέει μόνο πού να κοιτάξετε.

set_real_ip_from 10.20.0.0/24;
real_ip_header X-Forwarded-For;
# real_ip_recursive off - take the rightmost value in the field
# real_ip_recursive on  - walk the list back past every trusted address

Μια οδηγία επιλογής κεφαλίδας από μόνη της δεν θεμελιώνει ακόμη τίποτα για το ποιος έστειλε την τιμή.

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

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

Πολλοί διαμεσολαβητές απαιτούν σαφές μοντέλο αλυσίδας. Μην παίρνετε την αριστερότερη ή τη δεξιότερη τιμή που χωρίζεται με κόμμα επειδή το έκανε κάποια ανάρτηση ιστολογίου· βρείτε ποιος από τους διαμεσολαβητές σας προσθέτει, ποιος αντικαθιστά και ποιος διατηρεί το εισερχόμενο πεδίο. Το NGINX, για παράδειγμα, μπορεί να διατρέξει τη λίστα προς τα πίσω απέναντι στο σύνολο εμπιστοσύνης του και να σταματήσει στην πρώτη διεύθυνση που δεν κατέχει, και αυτός είναι κανόνας εκείνου του προϊόντος και όχι νόμος που ακολουθεί κάθε πλαίσιο. Διαβάστε την τεκμηρίωση του δικού σας διαμεσολαβητή με τα ίδια δύο ερωτήματα: ποια τιμή επιλέγει και σε ποιους αποστολείς πιστεύει;

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

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

Κρατήστε και τις δύο παρατηρήσεις στο αρχείο καταγραφής

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

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

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