Πώς αποδεικνύουμε ότι η πόρτα είναι κλειστή πριν το go-live.
Πριν το go-live, αποδεικνύουμε ότι η πόρτα είναι κλειστή: επιτιθέμεθα στο πραγματικό σας origin από ένα μηχάνημα εκτός δικτύου που το firewall δεν εμπιστεύτηκε ποτέ, και βλέπουμε ό,τι βλέπει ένας άγνωστος. Μια κλειστή πόρτα απαντά connection refused, όχι σελίδα login.
Σε αυτό το άρθρο 7 ενότητες
- Πριν από κάθε go-live, και μετά από κάθε αλλαγή στο edge, κάνουμε μία ερώτηση: τι βλέπει πραγματικά ένας άγνωστος στο internet; Την απαντάμε από ένα μηχάνημα σε άλλο datacenter μας, σε ένα egress που το δικό μας firewall δεν έμαθε ποτέ να εμπιστεύεται.
- Βρίσκουμε το πραγματικό origin όπως θα το έβρισκε ένας επιτιθέμενος (συνήθως διαρρέει στο DNS αλληλογραφίας του ίδιου του domain), καρφώνουμε κάθε εργαλείο στο γυμνό origin αντί για το CDN, και ξανατρέχουμε ολόκληρη τη σειρά ελέγχων.
- Σαρώνουμε και τις 65.535 ports από εκείνο το σημείο εκτός δικτύου, ώστε να μπορούμε να πούμε θετικά τι είναι κλειστό. Η μόνιμη διόρθωση κλειδώνει το origin στα δημοσιευμένα εύρη του CDN, με ένα πραγματικό WAF στο Layer 7 και κοινές λίστες αποκλεισμού από πίσω.
- Και μετά δεν παίρνουμε τη διόρθωση ως δεδομένη. Ξαναεπιτιθέμεθα στο γυμνό origin από έξω, και μια κλειστή πόρτα απαντά connection refused, όχι σελίδα login. Αυτό είναι απόδειξη, όχι υπόσχεση.
Ο πιο συνηθισμένος τρόπος να τελειώνει μια εργασία hardening είναι κάποιος να αλλάξει μια ρύθμιση, να ανανεώσει τη σελίδα, να δει αυτό που περίμενε και να προχωρήσει. Αυτό είναι «patch και ελπίδα». Αποδεικνύει το σύμπτωμα που κοίταξες. Δεν αποδεικνύει τίποτα για την πόρτα. Ό,τι ακολουθεί είναι η μέθοδος που τρέχουν αντ' αυτού οι μηχανικοί μας, πριν από κάθε go-live και μετά από κάθε αλλαγή στο edge. Έχει έναν κανόνα που διέπει τα πάντα: κάθε έλεγχος τρέχει από έξω, από ένα σημείο που δεν παίρνει καμία ειδική εμπιστοσύνη, γιατί η μόνη ερώτηση που μετράει είναι τι μπορεί πραγματικά να φτάσει ένας άγνωστος στο internet. Το πρώτο μισό θα μπορούσατε να το τρέξετε απόψε στο δικό σας site. Ο λόγος να το αναθέσετε σε εμάς είναι ποιος τρέχει ολόκληρη τη σειρά, και από πού.
h2 (#stranger-sees): Η μόνη ερώτηση που μετράει: τι βλέπει πραγματικά ένας άγνωστος;
Τρέχουμε τη σάρωση από ένα αποκλειστικό μηχάνημα σε άλλο datacenter μας, με IP egress που το δικό μας firewall δεν έμαθε ποτέ να εμπιστεύεται. Δεν έχει εγγραφή σε allow-list, δεν έχει εξαίρεση, δεν έχει καμία ευγένεια. Βλέπει ακριβώς ό,τι βλέπει το internet.
Αυτό δουλεύει μόνο αν το σημείο παρατήρησης είναι πραγματικό και έξω από το όριο εμπιστοσύνης σας, γι' αυτό και είναι ένα μηχάνημα σε άλλο δικό μας datacenter, στο δικό μας AS, όχι ένας νοικιασμένος scanner. Είναι ο ίδιος λόγος για τον οποίο μετράει καθόλου το να έχει κανείς δικό του δίκτυο. Περισσότερα στο δεν σας ανήκει το δίκτυό σας.
Από εκείνο το σημείο, τρία πράγματα παύουν να είναι ισχυρισμοί και γίνονται μετρήσεις. Αν το CDN σας είναι πραγματικά μπροστά από το origin. Αν τα ports που νομίζετε κλειστά είναι κλειστά. Και, μετά από μια διόρθωση, αν η πόρτα που μόλις κλείσατε είναι όντως κλειστή. Το υπόλοιπο κείμενο είναι το πώς διαβάζουμε το καθένα.
h2 (#find-origin): Βρείτε το πραγματικό origin όπως θα το έβρισκε ένας επιτιθέμενος
Το origin συνήθως διαρρέει στο DNS αλληλογραφίας του ίδιου του domain, γιατί η εγγραφή SPF που εξουσιοδοτεί το email σας κατονομάζει τον ίδιο τον host που το στέλνει. Μόλις γίνει γνωστό το πραγματικό origin, καρφώνετε το hostname κατευθείαν σε αυτό, ώστε κάθε εργαλείο να χτυπά το γυμνό origin αντί για το CDN, και ξανατρέχετε ολόκληρη τη σειρά ελέγχων εναντίον του.
# the origin usually leaks in the domain's own mail DNS
scanner$ dig +short TXT origin.example # the SPF record often names the sending host
scanner$ dig +short MX origin.example
# pin the hostname straight to the origin so nothing touches the CDN
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/
# now re-run the full battery against the naked origin, not the edge
scanner$ <scan battery> --target <origin-ip>Το σημείο που αποδεικνύει αυτό είναι απλό. Αν το origin απαντά στην καρφωμένη σάρωση με τον ίδιο τρόπο που απαντά το δημόσιο hostname, σερβίροντας τις ίδιες σελίδες, την ίδια φόρμα login, τότε το CDN και το WAF μπροστά του παρακάμπτονται. Κάθε αίτημα που θέλει να στείλει ένας επιτιθέμενος μπορεί να περάσει γύρω τους.
h2 (#all-ports): Σαρώστε κάθε port, και μετά πείτε τι είναι κλειστό
Από το σημείο εκτός δικτύου σαρώνουμε και τις 65.535 ports.
# from the box on an egress the firewall doesn't trust: every port, not a shortlist
scanner$ <port-scanner> -p 1-65535 <origin-ip>Μια σάρωση πλήρους επιφάνειας δεν είναι απλώς ένα ναι ή όχι για κάθε port. Το τι απαντά, και πώς, αποτυπώνει το μηχάνημα. Τρία σημάδια επανέρχονται.
a mismatched TLS cert on a production subnet -> a forgotten host, fingerprinted
an absurdly low firewall hit-count -> traffic isn't flowing the way you think
a DNS server answering REFUSED -> good: you are not an open resolverh2 (#firewall-not-waf): Ένα firewall δεν είναι WAF
Η brute force στο login είναι αόρατη στο Layer 3/4, οπότε η άμυνα ζει στο edge, στο Layer 7.
Rate limit στο edge, εκεί που είναι τα logins
: Μετρήστε τις αποτυχίες login ανά πηγή στο επίπεδο HTTP, το μόνο σημείο όπου είναι ορατές, και αποκλείστε μια πηγή που περνά το όριο. Το firewall δεν είδε ποτέ την επίθεση. Το edge δεν βλέπει τίποτα άλλο.
Κλιμάκωση στο subnet μετά από δύο χτυπήματα
: Μια μεμονωμένη αποκλεισμένη διεύθυνση αλλάζει τετριμμένα. Μετά από δεύτερο χτύπημα από την ίδια γειτονιά, ο αποκλεισμός διευρύνεται στο επίμαχο subnet, ώστε ο επιτιθέμενος να μην μπορεί απλώς να μετακινηθεί κατά μία IP.
Λέμε το άβολο κομμάτι φωναχτά: ένας αποκλεισμός subnet μπορεί να πιάσει έναν νόμιμο χρήστη που πληκτρολόγησε λάθος τον κωδικό του δύο φορές από μια κοινόχρηστη διεύθυνση, ένα εταιρικό NAT, μια πανεπιστημιούπολη, ένα καφέ. Αυτό είναι πραγματικό κόστος, όχι σφάλμα στρογγυλοποίησης. Γι' αυτό ο κανόνας παραδίδεται με τεκμηριωμένη βαλβίδα εκτόνωσης για κοινόχρηστες IP, όχι ως μόνιμος τοίχος.
h2 (#durable-fix): Η μόνιμη διόρθωση: κλειδώστε το origin στο CDN, και μετά ξαναεπιτεθείτε
Η διόρθωση είναι να περιορίσετε με firewall το origin στα δημοσιευμένα εύρη του CDN. Μετά, ο ίδιος καρφωμένος έλεγχος, από το ίδιο μη έμπιστο μηχάνημα:
# BEFORE: pin the naked origin, it serves the login page around the CDN
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/login
HTTP/1.1 200 OK # the origin answered. the CDN was bypassed.
# AFTER: origin firewalled to accept only the CDN's published ranges
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/login
curl: (7) Failed to connect to <origin-ip> port 443: Connection refusedΠίσω από το κλείδωμα του origin κάθεται το πραγματικό WAF στο Layer 7, αυτό που επιθεωρεί τα αιτήματα που το CDN όντως προωθεί, και μια κοινή λίστα αποκλεισμού: ένας επιτιθέμενος που πιάνεται να ανιχνεύει έναν πελάτη αποκλείεται σε όλους, ώστε η αναγνώριση που χαρτογραφεί ένα site να πληρώνει διόδια σε κάθε άλλο.
h2 (#we-fix-you-fix): Τι διορθώνουμε εμείς, και τι σας παραδίδουμε πίσω
Όταν ο έλεγχος βρίσκει κάτι, η δουλειά χωρίζεται σε δύο στήλες. Η μία είναι δική μας, και την κάνουμε στην ίδια συνεδρία: θωράκιση στο edge της υποδομής, αμέσως. Η άλλη είναι στην εφαρμογή σας, και δεν αγγίζουμε τον κώδικά σας. Σας παραδίδουμε το ακριβές εύρημα, και το θωρακίζουμε στο μεταξύ ώστε να μην είστε εκτεθειμένοι όσο το διορθώνετε.
| Τι διορθώνουμε στην ίδια συνεδρία | Τι σας παραδίδουμε να διορθώσετε (θωρακισμένο στο μεταξύ) |
|---|---|
| Κλείδωμα του origin στα δημοσιευμένα εύρη του CDN | Ενημέρωση ή αφαίρεση του ευάλωτου plugin, CMS ή εφαρμογής |
| Άμυνα brute force Layer 7 στο edge | Αλλαγή κοινόχρηστων ή προεπιλεγμένων διαπιστευτηρίων |
| Firewall στα εκτεθειμένα data stores προς το ιδιωτικό δίκτυο | Ενεργοποίηση MFA στους λογαριασμούς που μετράνε |
| Κλείσιμο των διαρροών πληροφοριών στον web server | Διόρθωση της έκθεσης σε επίπεδο εφαρμογής στον δικό σας κώδικα |
h2 (#re-attack): Και μετά ξαναεπιτιθέμεθα, και αποδεικνύουμε ότι είναι κλειστή
Κάθε διόρθωση παραπάνω τελειώνει με τον ίδιο τρόπο: γυρνάμε στο μηχάνημα που το firewall δεν έμαθε ποτέ να εμπιστεύεται, ξανατρέχουμε τη σειρά ελέγχων που βρήκε το πρόβλημα, και επιβεβαιώνουμε ότι η ίδια μέτρηση τώρα επιστρέφει κλειστή. Το καρφωμένο origin επιστρέφει connection refused. Το port που απαντούσε είναι σκοτεινό. Το εύρημα που σας παραδώσαμε, μόλις το κλείσετε, αρνείται και σε εμάς.
Η ίδια στάση, στραμμένη στο αν ελέγχουμε καν το δίκτυο πάνω στο οποίο ταξιδεύει η κίνησή σας, βρίσκεται στο δεν σας ανήκει το δίκτυό σας.
Ευθείες απαντήσεις
Πώς αποδεικνύετε ότι μια διόρθωση ασφαλείας όντως δούλεψε;+
Δεν εμπιστευόμαστε το patch. Ξαναεπιτιθέμεθα στο πραγματικό origin από ένα μηχάνημα σε egress που το firewall μας δεν έμαθε ποτέ να εμπιστεύεται, ώστε να βλέπει ό,τι βλέπει το internet. Αν η πόρτα είναι κλειστή, μια καρφωμένη σάρωση του γυμνού origin απαντά connection refused, όχι σελίδα login. Σε αυτή την περίπτωση είναι απόδειξη, όχι υπόσχεση.
Πώς μπορεί ένας επιτιθέμενος να παρακάμψει ένα CDN ή WAF και να χτυπήσει απευθείας το origin;+
Το origin συνήθως διαρρέει στο DNS αλληλογραφίας του ίδιου του domain, γιατί η εγγραφή SPF που εξουσιοδοτεί το email σας κατονομάζει τον host που το στέλνει. Με την πραγματική διεύθυνση του origin, καρφώνετε το hostname κατευθείαν σε αυτό ώστε κάθε εργαλείο να χτυπά το γυμνό origin αντί για το CDN. Αν το origin απαντά όπως και το δημόσιο hostname, το CDN και το WAF παρακάμπτονται: είναι αποτελεσματικά μόνο αν το origin είναι κλειδωμένο σε αυτά. Η μόνιμη διόρθωση είναι το origin να δέχεται με firewall κίνηση μόνο από τα δημοσιευμένα εύρη του CDN, οπότε ο ίδιος έλεγχος παίρνει connection refused.
Πώς ελέγχετε ότι ένα port είναι πραγματικά κλειστό από έξω;+
Σαρώνετε και τις 65.535 ports από ένα σημείο εκτός δικτύου, όχι τις λίγες συνηθισμένες, ώστε να μπορείτε να δηλώσετε θετικά ότι ό,τι δεν σκοπεύατε να εκθέσετε είναι κλειστό. Μια πλήρης σάρωση βγάζει και σημάδια: ένα TLS cert που δεν ταιριάζει αποτυπώνει έναν ξεχασμένο host, ένας παράλογα χαμηλός αριθμός hits στο firewall σημαίνει ότι η κίνηση δεν ρέει όπως νομίζετε, και ένας DNS server που απαντά REFUSED επιβεβαιώνει ότι δεν είστε open resolver.
Τι διορθώνετε εσείς, και τι πρέπει να διορθώσουμε μόνοι μας;+
Στην ίδια συνεδρία θωρακίζουμε στο edge της υποδομής: κλειδώνουμε το origin στα εύρη του CDN, στήνουμε άμυνα brute force στο edge, βάζουμε firewall στα εκτεθειμένα data stores προς το ιδιωτικό δίκτυο, και κλείνουμε τις διαρροές πληροφοριών στον web server. Μετά σας παραδίδουμε το ακριβές εύρημα και το θωρακίζουμε στο μεταξύ: ενημέρωση ή αφαίρεση του ευάλωτου plugin, CMS ή εφαρμογής, αλλαγή κοινόχρηστων ή προεπιλεγμένων διαπιστευτηρίων, ενεργοποίηση MFA, και διόρθωση της έκθεσης σε επίπεδο εφαρμογής στον δικό σας κώδικα.
Δεν θα κλείσουμε απλώς το ticket. Θα αποδείξουμε ότι η πόρτα είναι κλειστή.
Μιλήστε με έναν μηχανικό που ξαναεπιτίθεται στο origin σας από ένα μηχάνημα που δεν βάλαμε ποτέ σε allow-list, και σας δείχνει το connection refused που αποδεικνύει ότι η πόρτα είναι κλειστή.
Μιλήστε με έναν μηχανικόΑν θέλετε τη στάση που βρίσκεται κάτω από όλα αυτά, ξεκινά από το να σας ανήκει το δίκτυο από το οποίο προστατεύεστε: δεν σας ανήκει το δίκτυό σας.
Φτάσατε στο τέλος.
Βάλτε την ανάγνωση σε εφαρμογή
Τι τρέχετε;
Πείτε μας για τον φόρτο εργασίας, την κίνηση και τις απαιτήσεις ανάκαμψης. Ξεκινήστε από το εργαλείο διαμόρφωσης server ή συζητήστε τις λεπτομέρειες με έναν μηχανικό.
Γραμμένο από τους μηχανικούς που χτίζουν και λειτουργούν την υποδομή που περιγράφει.Μιλήστε με έναν μηχανικό
