Ένα τελικό σημείο VPN μέσω Squid: μια στενή εξαίρεση CONNECT
Αφήστε μία εγκεκριμένη πηγή να φτάσει μία πύλη VPN στη θύρα 1194 μέσω Squid, κρατήστε τους καθολικούς φρουρούς θυρών και αποδείξτε ότι δεν άνοιξε τίποτε άλλο.
Το Squid απαντά σε ένα αίτημα CONNECT με την πρώτη γραμμή http_access που ταιριάζει, και αυτή η γραμμή μπορεί να είναι απόρριψη. Αυτό το ένα γεγονός εξηγεί γιατί μια εξαίρεση για τελικό σημείο VPN συνήθως αποτυγχάνει με την πρώτη προσπάθεια, επειδή το αίτημα δεν φτάνει ποτέ στην άδεια που πρόσθεσε κάποιος στο τέλος. Μια στενή διόρθωση κρατά τους υπάρχοντες φρουρούς θυρών και τους μαθαίνει μία ελεγμένη πηγή, προορισμό και θύρα. Όλα τα άλλα στον διαμεσολαβητή συμπεριφέρονται ακριβώς όπως πριν.
Πώς το Squid αποφασίζει για ένα αίτημα CONNECT
Ένα αίτημα CONNECT ονομάζει έναν κεντρικό υπολογιστή και μια θύρα, και το Squid διατρέχει τις γραμμές http_access με σειρά μέχρι να ταιριάξει μία από αυτές. Μια απόρριψη που ταιριάζει τερματίζει αμέσως την αξιολόγηση και ο πελάτης λαμβάνει 403 από τον διαμεσολαβητή. Γι’ αυτό η θέση ενός κανόνα έχει μεγαλύτερη σημασία από τη διατύπωσή του. Η μετακίνηση της ίδιας γραμμής ένα βήμα πιο πάνω μπορεί να αλλάξει εντελώς το αποτέλεσμα.
Οι συμβατικοί φρουροί απορρίπτουν καθετί έξω από το Safe_ports και απορρίπτουν το CONNECT έξω από το SSL_ports. Αυτά τα ονόματα είναι ACL που ορίζονται στη δική σας διαμόρφωση, άρα το περιεχόμενό τους ανήκει σε εσάς και όχι στο πρωτόκολλο. Μια διανομή μπορεί να επιτρέπει ένα ευρύ φάσμα θυρών ως Safe_ports ενώ περιορίζει το CONNECT χωριστά. Διαβάστε τις ζωντανές τιμές πριν υποθέσετε ότι μια θύρα είναι αποκλεισμένη εκ σχεδιασμού.
Επιβεβαιώστε ότι ο διαμεσολαβητής είναι το στοιχείο που απορρίπτει το αίτημα. Ένα 403 που παράγει το Squid δεν μοιάζει καθόλου με προειδοποίηση TLS από τον διακομιστή VPN, και το να συγχωνεύσετε τα δύο σε ένα πρόβλημα κοστίζει την πρώτη ώρα. Ελέγξτε τη γραμμή του αρχείου καταγραφής πρόσβασης για το αίτημα, γιατί καταγράφει και την ενέργεια και τον κανόνα που την παρήγαγε.
Χτίστε μία συνδυασμένη αντιστοίχιση αντί για τρία χαλαρά ACL
Χτίστε την εξαίρεση από τρία δεδομένα: ένα εγκεκριμένο εύρος πηγής, μία εγκεκριμένη διεύθυνση προορισμού και τη μοναδική θύρα στην οποία ακούει το τελικό σημείο. Δύο χαλαρά ACL και μία συνδυασμένη αντιστοίχιση παράγουν πολύ διαφορετική πολιτική, γιατί αυτό που αξιολογείται είναι ο συνδυασμός. Ονομάστε το συνδυασμένο ACL με βάση αυτό που επιτρέπει, όχι με βάση τη μέθοδο που μεταφέρει.
Το σχήμα παρακάτω χρησιμοποιεί εύρη τεκμηρίωσης που πρέπει να αντικατασταθούν με ελεγμένες τιμές. Το Squid δεν διατηρεί κανένα από αυτά τα ονόματα, άρα είναι δικά σας να τα επιλέξετε και δικά σας να τα κρατήσετε συνεπή. Αυτή η συνταγή περιορίζεται στο Squid 6 και 7, των οποίων η τεκμηριωμένη διαμόρφωση υποστηρίζει την ομάδα all-of. Η τρέχουσα αναφορά χαρακτηρίζει αυτές τις οδηγίες ως μη διαθέσιμες στο Squid 8, οπότε αντιμετωπίστε το ως συνταγή δεσμευμένη σε έκδοση και όχι ως διαδρομή μετάβασης, και ελέγξτε την οδηγία στην αναφορά της δικής σας έκδοσης πριν την εφαρμόσετε.
acl pvpn_src src 192.0.2.128/25
acl pvpn_dst dst 198.51.100.77/32
acl pvpn_port port 1194
acl pvpn_ok all-of CONNECT pvpn_port pvpn_dst pvpn_srcΗ ομάδα all-of ταιριάζει μόνο όταν ταιριάζει κάθε μέλος, που σημαίνει ότι πηγή, προορισμός και θύρα ελέγχονται σε μία γραμμή. Η ομάδα δεν παρέχει τίποτε από μόνη της, και ένα αίτημα που ταιριάζει μόνο με δύο από τα τρία δεδομένα δεν μπορεί να την ικανοποιήσει. Αυτή η ιδιότητα κρατά την εξαίρεση στενή όταν κάποιος προσθέσει αργότερα μια δεύτερη πύλη. Είτε ο νέος προορισμός προστίθεται σκόπιμα, είτε το αίτημα επιστρέφει στους αρχικούς φρουρούς.
Λυγίστε τους φρουρούς θυρών χωρίς να τους αφαιρέσετε
Στις σημερινές τους θέσεις, οι δύο συμβατικές γραμμές φρουράς μοιάζουν έτσι. Συνήθως βρίσκονται μετά την ταυτοποίηση και πριν από τις γραμμές πολιτικής που επιτρέπουν τα πάντα.
http_access deny !Safe_ports
http_access deny CONNECT !SSL_portsΠροσθέστε τη συμπληρωματική συνδυασμένη αντιστοίχιση σε καθεμία, ώστε μια εξαίρεση που ταιριάζει να επιβιώνει από έναν φρουρό που διαφορετικά θα την απέρριπτε. Αλλάζουν μόνο οι γραμμές φρουράς, και μόνο κατά έναν επιπλέον όρο η καθεμία.
http_access deny CONNECT !SSL_ports !pvpn_ok
http_access deny !Safe_ports !pvpn_okΟι όροι σε μία γραμμή πρόσβασης συνδυάζονται, άρα η γραμμή τώρα απορρίπτει μόνο αιτήματα που αποτυγχάνουν και στον αρχικό έλεγχο και στην εξαίρεση. Ένα αίτημα για το εγκεκριμένο τελικό σημείο περνά, και κάθε άλλο αίτημα κρατά την παλιά συμπεριφορά θύρας. Αυτό είναι στενότερο από το να προσθέσετε τη θύρα σε μια καθολική λίστα SSL_ports, που θα επέτρεπε αυτή τη θύρα σε κάθε προορισμό. Αν η θύρα υπάρχει ήδη σε εκείνη τη λίστα, αυτό το ACL δεν στενεύει τίποτε και η παλαιότερη, ευρύτερη άδεια εξακολουθεί να ισχύει για άλλους προορισμούς, οπότε διαβάστε τη ζωντανή λίστα πριν ισχυριστείτε ότι η εξαίρεση άνοιξε τη θύρα. Είναι επίσης αναστρέψιμη, γιατί δύο γραμμές επιστρέφουν στην προηγούμενη μορφή τους. Η αναφορά ελέγχου πρόσβασης τεκμηριώνει τη σειρά και τους συμβατικούς φρουρούς από τους οποίους εξαρτάται αυτή η αλλαγή.
Πού δεν πρέπει να τοποθετηθεί η εξαίρεση
Ο πειρασμός είναι να βάλετε μια άδεια πάνω από τους φρουρούς και να τελειώσετε. Αυτή η τοποθέτηση παρακάμπτει επίσης τις προστασίες ταυτοποίησης και τοπικού προορισμού που συνήθως βρίσκονται κοντά στην κορυφή μιας λειτουργικής διαμόρφωσης. Το αποτέλεσμα δεν είναι στενή εξαίρεση, είναι μια τρύπα με ένα σχόλιο από πάνω. Κρατήστε κάθε νέα άδεια στο ίδιο ελεγμένο στάδιο με την υπόλοιπη πολιτική πελατών.
Ελέγξτε τι χρειάζεται ακόμη το αίτημα μετά τους φρουρούς θυρών. Ένας ταυτοποιημένος λογαριασμός, μια επιτρεπόμενη διεύθυνση πελάτη και μια πολιτική προορισμού εξακολουθούν να ισχύουν, και η εξαίρεση δεν αλλάζει κανένα από αυτά. Αν ο διαμεσολαβητής σας επιτρέπει ήδη στον εγκεκριμένο λογαριασμό να φτάνει αυθαίρετους προορισμούς, ο φρουρός θύρας δεν ήταν ποτέ ο πραγματικός έλεγχος.
Σκεφτείτε αν το τελικό σημείο είναι καθόλου TCP. Μια εξαίρεση CONNECT μεταφέρει ροές TCP, και ένα προφίλ OpenVPN που χρησιμοποιεί UDP δεν θα γίνει προσβάσιμο μέσω αυτής. Αλλάξτε το προφίλ σε TCP μόνο αν ο διακομιστής ακούει έτσι και ο διαχειριστής αποδέχεται τη διαφορά στη συμπεριφορά.
Ελέγξτε το όριο με τον αναλυτή και ένα πραγματικό αίτημα
Αναλύστε τη διαμόρφωση πριν την επαναφόρτωση, και κρατήστε μια δεύτερη συνεδρία ανοιχτή όσο το κάνετε. Ένα συντακτικό σφάλμα κατά την επαναφόρτωση μπορεί να αφήσει τον διαμεσολαβητή στην παλιά διαμόρφωση ή να απορρίψει την καινούργια εντελώς. Ο αναλυτής αναφέρει τη γραμμή που απορρίφθηκε, κάτι που είναι περισσότερο από ό,τι θα σας πει το σφάλμα του πελάτη.
Έπειτα επαναφορτώστε και στείλτε ένα πραγματικό CONNECT μέσω του διαμεσολαβητή από μια εγκεκριμένη πηγή. Η εκτέλεση του αναλυτή έρχεται πρώτη, γιατί μια επαναφόρτωση με τυπογραφικό λάθος δεν σας μαθαίνει τίποτε για την πολιτική.
squid -k parse
squid -k reconfigure
curl -v -p -x http://proxy.lab.internal:3128 https://vpn.lab.internal:1194/ --max-time 5Δοκιμάστε τρεις περιπτώσεις: μια εγκεκριμένη πηγή και λογαριασμό, μια μη εγκεκριμένη πηγή, και έναν διαφορετικό προορισμό στην ίδια θύρα. Η τρίτη περίπτωση είναι αυτή που αποδεικνύει ότι η εξαίρεση είναι στενή, γιατί ασκεί τη θύρα χωρίς την αντιστοίχιση προορισμού. Διαβάστε το αρχείο καταγραφής πρόσβασης και για τις τρεις αντί να εμπιστευτείτε το μήνυμα του πελάτη. Ένα επιτυχές CONNECT εγκαθιστά ροή TCP και τίποτε άλλο, άρα η χειραψία VPN παραμένει ξεχωριστή δοκιμή.