Διατήρηση ή SNAT των διευθύνσεων IP των πελατών VPN στα όρια του cloud
Η διατήρηση της πηγής κρατά την ταυτότητα του πελάτη σε κάθε αρχείο καταγραφής, το SNAT κρατά μικρό τον πίνακα δρομολόγησης. Τρεις συνθήκες λένε ποιο χρειάζεται η εφαρμογή.
Η διατήρηση της διεύθυνσης του πελάτη VPN ως την εφαρμογή κάνει κάθε γραμμή καταγραφής και κάθε εγγραφή στη λίστα επιτρεπόμενων να σημαίνουν το ίδιο πράγμα. Η επανεγγραφή της στο άκρο του cloud κάνει τον πίνακα δρομολόγησης απλούστερο και τα αρχεία καταγραφής λιγότερο χρήσιμα. Καμία από τις δύο επιλογές δεν είναι λανθασμένη από μόνη της, και το επιχείρημα που την κρίνει σπάνια αφορά την απόδοση. Τρεις συνθήκες το αποφασίζουν: αν η εφαρμογή πρέπει να γνωρίζει ποιο άτομο συνδέθηκε, αν ο ιστός του cloud θα δεχτεί την πηγή που σκοπεύετε να στείλετε και ποιος είναι πρόθυμος να αναλάβει την επιστροφική διαδρομή μετά.
Τρεις συνθήκες το αποφασίζουν
Ξεκινήστε από την απαίτηση της εφαρμογής, όχι από το διάγραμμα δικτύου. Αν η εξουσιοδότηση ή ο έλεγχος εξαρτώνται από τη μεμονωμένη διεύθυνση του πελάτη, τότε η διατήρησή της είναι λειτουργική απαίτηση και η μετάφραση είναι οπισθοδρόμηση. Αν η εφαρμογή χρειάζεται μόνο να γνωρίζει ότι η κίνηση έφτασε μέσω της διαδρομής απομακρυσμένης πρόσβασης, μια μεταφρασμένη διεύθυνση αρκεί και είναι πολύ φθηνότερη στη λειτουργία.
Η δεύτερη συνθήκη είναι μηχανική. Ένα εικονικό δίκτυο δεν εμπιστεύεται αυτόματα ένα πακέτο που ισχυρίζεται μια διεύθυνση που δεν έχει εκχωρηθεί στη διεπαφή αποστολής. Οι περισσότεροι ιστοί cloud το επιβάλλουν, με διαφορετικούς τρόπους και υπό διαφορετικά ονόματα, και ένα σχέδιο που το αγνοεί θα φαίνεται σωστό σε ένα διάγραμμα και θα χάνει σιωπηλά στην παραγωγή.
Η τρίτη είναι οργανωτική. Η διατήρηση των πηγών σημαίνει ότι ο πίνακας δρομολόγησης του υποδικτύου της εφαρμογής πρέπει να δείχνει πίσω στην πύλη για το πρόθεμα του πελάτη, και κάθε ομάδα που προσθέτει αργότερα ένα υποδίκτυο πρέπει να κρατά αυτή τη διαδρομή συνεπή. Είναι μικρό κόστος μία φορά και επαναλαμβανόμενο κόστος σε δεκάδες λογαριασμούς. Αποφασίστε ποιος το πληρώνει πριν υποσχεθείτε τη συμπεριφορά.
Μια διαδρομή δεν είναι άδεια για πλαστογράφηση
Η προσθήκη μιας διαδρομής επιστροφής λέει στο υποδίκτυό σας πού πρέπει να πάνε οι απαντήσεις. Δεν λέει στον ιστό ότι η περίπτωση που προωθεί αυτά τα πακέτα επιτρέπεται να τα εκπέμπει με ξένη πηγή. Στο AWS ο σχετικός έλεγχος είναι ο έλεγχος πηγής και προορισμού, και είναι ορατός ανά περίπτωση:
aws ec2 describe-instances --instance-ids i-0a1b2c3d4e5f60718 \
--query "Reservations[].Instances[].SourceDestCheck"
aws ec2 modify-instance-attribute --instance-id i-0a1b2c3d4e5f60718 \
--no-source-dest-check
Απενεργοποιήστε τον μόνο για την περίπτωση της οποίας η τεκμηριωμένη εργασία είναι η προώθηση, και για τίποτε άλλο. Κάθε VM εφαρμογής που κρατά τον έλεγχο ενεργό είναι ένα μηχάνημα λιγότερο που μπορεί να χρησιμοποιηθεί για εκπομπή κίνησης με δανεική πηγή. Αν η πλατφόρμα σας δεν είναι AWS, αναζητήστε την αντίστοιχη ρύθμιση anti-spoofing ή επιτρεπόμενων διευθύνσεων αντί να υποθέσετε ότι η συμπεριφορά μεταφέρεται.
Μια γρήγορη σύλληψη πακέτων λύνει το ερώτημα γρηγορότερα από την ανάγνωση της κονσόλας. Αν οι απαντήσεις φεύγουν και ο πελάτης δεν τις βλέπει ποτέ, ο ιστός απορρίπτει την πλαστογραφημένη πηγή και δεν φταίει η εφαρμογή.
Τι αγοράζει η μετάφραση και τι κοστίζει
Η επανεγγραφή της πηγής στην πύλη εξαλείφει το πρόβλημα της διαδρομής επιστροφής. Η εφαρμογή βλέπει μία διεύθυνση που ξέρει ήδη πώς να προσεγγίσει, και το πρόθεμα του πελάτη δεν χρειάζεται ποτέ να εμφανιστεί σε πίνακα δρομολόγησης του cloud. Στο Linux ο κανόνας είναι μία γραμμή, και αξίζει να γράψετε την πιο στενή εκδοχή που μπορείτε:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 172.20.8.0/24 -o ens5 -j SNAT --to-source 10.40.3.10
Προσέξτε τι καταγράφει τώρα η εφαρμογή: 10.40.3.10 για κάθε χρήστη, σε κάθε σύνδεση, για πάντα. Κάθε λίστα επιτρεπόμενων διευθύνσεων που βασίζεται σε αυτή την τιμή παρέχει τώρα πρόσβαση σε ολόκληρο τον πληθυσμό απομακρυσμένης πρόσβασης, και κάθε ανασκόπηση περιστατικού πρέπει να επιστρέφει στην πύλη για να απαντήσει ποιος ήταν.
Η λύση δεν είναι να εγκαταλείψουμε τη μετάφραση, είναι να πάψουμε να προσποιούμαστε ότι η διεύθυνση είναι ταυτότητα. Μεταφέρετε την ταυτότητα του πελάτη σε ένα πιστοποιημένο πεδίο, καταγράψτε την στην πύλη μαζί με τη μεταφρασμένη πλειάδα και αφήστε την εφαρμογή να κάνει σύνδεση σε αυτή. Χωρίς το κλειδί σύνδεσης, η μετάφραση μετατρέπει ένα πρόβλημα δικτύου σε μόνιμο εγκληματολογικό.
Το ρελέ είναι διαφορετική διεπαφή
Ένας αντίστροφος διαμεσολαβητής μπροστά από την εφαρμογή παρακάμπτει εντελώς το ζήτημα της δρομολογημένης διαδρομής. Ο διαμεσολαβητής ανοίγει τη δική του σύνδεση backend, ώστε το πρόθεμα του πελάτη να μη χρειάζεται ποτέ να είναι δρομολογήσιμο μέσα στο εικονικό δίκτυο, και η εφαρμογή μπορεί να λάβει ταυτότητα σε μια κεφαλίδα που ορίζει ο διαμεσολαβητής.
Αυτή η κεφαλίδα είναι αξιόπιστη μόνο όταν το backend τη δέχεται από τον διαμεσολαβητή και από τίποτε άλλο. Με όρους nginx αυτό σημαίνει να ονομάσετε ρητά τον αξιόπιστο ομότιμο αντί να πιστεύετε ό,τι φτάνει:
set_real_ip_from 10.40.3.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
Κάθε πελάτης που μπορεί να φτάσει απευθείας στο backend μπορεί να πλαστογραφήσει την ίδια κεφαλίδα, άρα το backend πρέπει να είναι απρόσιτο εκτός από τον διαμεσολαβητή. Αυτό είναι γεγονός τείχους προστασίας, όχι γνώμη ρύθμισης, και είναι η παραδοχή που οι άνθρωποι παραλείπουν όταν αντιγράφουν το απόσπασμα.
Το ρελέ αλλάζει επίσης το τι αγοράζετε. Παίρνετε ταυτότητα σε επίπεδο εφαρμογής και ένα φυσικό μέρος για να την καταγράφετε· χάνετε τη γενικότητα, γιατί κάθε νέο πρωτόκολλο χρειάζεται τη δική του υποστήριξη διαμεσολαβητή. Για υπηρεσίες HTTP αυτή η ανταλλαγή είναι συνήθως καλή, και για οτιδήποτε δεν είναι HTTP συνήθως δεν είναι καθόλου διαθέσιμη.
Γράψτε τι βλέπει κάθε όριο
Ό,τι κι αν επιλέξετε, η ανασκόπηση σχεδίασης πρέπει να τελειώνει με έναν πίνακα που ονομάζει τη διεύθυνση πηγής και την αποδείξιμη ταυτότητα σε κάθε άλμα. Χωρίς αυτόν, το πρώτο περιστατικό παράγει τρεις ομάδες που η καθεμία περιγράφει διαφορετικό πελάτη.
| Boundary | Source the next hop sees | What is actually proven |
|---|---|---|
| Client to gateway | 172.20.8.14 | A certificate or credential was presented |
| Gateway to app subnet, preserved | 172.20.8.14 | The same session, if the return route exists |
| Gateway to app subnet, translated | 10.40.3.10 | Only that traffic came through the gateway |
| Proxy to backend | 10.40.3.10 plus a header | The proxy asserted an identity it authenticated |
Έπειτα επιλέξτε. Διατηρήστε όταν η εξουσιοδότηση της εφαρμογής εξαρτάται πραγματικά από τη διεύθυνση του πελάτη και μπορείτε να αναλάβετε τη διαδρομή. Μεταφράστε όταν δεν ισχύει αυτό και μπορείτε να μεταφέρετε την ταυτότητα εκτός ζώνης, και χρησιμοποιήστε τις οδηγίες του AWS για περιπτώσεις προώθησης για τις ρυθμίσεις προώθησης που αφορούν την πλατφόρμα. Καταφύγετε σε ρελέ όταν η υπηρεσία μιλά HTTP και θέλετε η ταυτότητα να πάψει να είναι διεύθυνση.