How to secure DNS: it is called DNSSEC

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

“Αν κάνεις τόσο καλή δουλειά και καταφέρεις να πάρεις βαθμολογία στις αξιολογήσεις μεταξύ 8-10 (με άριστα το 10) από τουλάχιστον το 50% των μαθητών σου, θα σου δώσουμε έξτρα ΧΧΧ λίρες (GBP) ως bonus.” Το ποσό δεν σας το αναφέρω, αλλά είναι τριψήφιο και πραγματικά αξίζει τον κόπο να προσπαθήσει κάποιος για καλύτερες αξιολογήσεις.

Η συγκεκριμένη εταιρία προφανώς ενδιαφέρεται πολύ σοβαρά για την ποιότητα των εκπαιδευτικών υπηρεσιών που παρέχει, συνεπώς προσπαθεί να δώσει κίνητρα στους εκπαιδευτές για να δώσουν τον καλύτερο εαυτό τους. I’m impressed…

Για το DNSSEC ίσως κάποιοι να έχετε ακούσει κάτι σχετικό, και η αλήθεια είναι ότι θα ήθελα να σας δώσω μερικά στοιχεία, διότι φαίνεται ότι σιγά σιγά βρίσκει τον δρόμο του προς την υλοποίηση. Όλα ξεκινάνε από την εξής σκέψη: η επικοινωνία μεταξύ των DNS Servers στο internet δεν είναι κρυπτογραφημένη, συνεπώς είναι ευάλωτη. Εκεί που προσπαθείς να μπεις στο e-banking μιας τράπεζας και έχεις ρωτήσει κάποιον απομακρυσμένο DNS Server για να σου δώσει την IP διεύθυνση του web server της τράπεζας, κάποιος κακός μπαίνει στο ενδιάμεσο, αλλάζει την πληροφορία που περιμένεις και σε στέλνει κάπου αλλού.

Ο Windows Server 2008 R2 προσφέρει βελτιώσεις ώστε να αποτρέψει τέτοιου είδους παρατράγουδα, έχοντας κάποιο feature που λέγεται port randomization. Όταν κάποιος client στέλνει ένα ερώτημα σε έναν DNS Server, εκτός από μια random θύρα που χρησιμοποιεί, αποστέλλει στον DNS Server και ένα transaction ID, πχ. TXID 279, ώστε να αποτραπεί η κλοπή της πληροφορίας στο internet. Δυστυχώς όμως, ούτε αυτό αποδείχθηκε αρκετό, διότι δεν υπάρχει κανένας μηχανισμός authentication στην όλη διαδικασία. Πως μπορώ να είμαι σίγουρος ότι μου απαντάει ο σωστός DNS Server και όχι κάποιος άλλος? Δεν μπορώ να είμαι σίγουρος. Δυστυχώς πολλές φορές μέχρι και τα TXIDs είναι συνεχόμενα, άρα εύκολα ο κακός μπορεί να μαντέψει ποιο TXID χρησιμοποιείται σε μια επικοινωνία μεταξύ DNS Server και client. Μπορείτε να ελέγξετε τον δικό σας DNS Server σχετικά με το port randomization με ένα εργαλείο σε αυτή τη διεύθυνση: https://www.dns-oarc.net/oarc/services/dnsentropy

Η λύση έρχεται με το DNSSEC που υπόσχεται να προσφέρει authentication, αφού οι επικοινωνίες των DNS Servers μεταξύ τους θα είναι digitally signed. Μπορούμε λοιπόν να υπογράψουμε την ζώνη ενός DNS Server προσθέτοντας μερικές ακόμα εγγραφές. Αυτές οι εγγραφές είναι της μορφής RRSIG και θα συνοδεύουν τα κρίσιμα Resource Records που “φαίνονται” στο internet, πχ. μια εγγραφή MX. Χρειαζόμαστε και ακόμα μια εγγραφή που θα περιέχει το Public Key (αφού στην ουσία όλα βασίζονται σε μια PKI υποδομή), μια εγγραφή της μορφής DNSKEY.

Σε έναν ιδανικό κόσμο όπου το root του DNS, η γνωστή τελεία “.” θα είναι ψηφιακά υπογεγραμμένη, θα έχουμε το παρακάτω αποτέλεσμα:

 

Drawing1

 

Βλέπουμε ότι αν έχει ψηφιακή υπογραφή ολόκληρη η ζώνη .gr, τότε έχουν επίσης ψηφιακή υπογραφή και όλα τα ονόματα domains που καταλήγουν σε .gr. Κάποιες χώρες έχουν ήδη εφαρμόσει DNSSEC στα δικά τους domain levels.

Το πιο ισχυρό public key στην ιεραρχία ονομάζεται Trust Anchor και στο παραπάνω σχήμα είναι το .gr (λέμε και κανένα αστείο να περνάει η ώρα…). Αυτό που μπορούμε (ή θα μπορέσουμε κάποτε να κάνουμε) θα είναι να προσθέσουμε Trust Anchor στον δικό μας DNS Server για το .gr domain κάπως έτσι:

tr

Αν έχουμε τον δικό μας DNS Server που φιλοξενεί ζώνες ορατές από το internet, θα χρειαστεί να κάνουμε λίγη δουλειά εκεί. Τονίζω ότι είναι κάτι που δεν χρειάζεται να γίνει τώρα, αφού έτσι κι αλλιώς δεν έχουμε DNSSEC σε ζώνες που καταλήγουν σε .gr. Θα πρέπει επίσης να έχουμε υπόψη μας ότι δεν βάζουμε DNSSEC στις Active Directory Integrated ζώνες μας, διότι καταργούνται έτσι τα dynamic updates, αλλά ούτως ή άλλως δεν μας χρειάζεται, αφού αυτές οι ζώνες δεν είναι ορατές στο internet.

Άρα χρειάζεται να ενεργοποιήσουμε το DNSSEC για παράδειγμα σε μια ζώνη με την ονομασία contoso.com. Χρησιμοποιώντας την εντολή dnscmd δημιουργούμε key signing keys και zone signing keys και τα αποθηκεύουμε στο local certificate store.

dns1

Μια ματιά στο local certificate store μας δείχνει τα πιστοποιητικά που δημιουργήθηκαν:

cert

Μην ξεχάσετε να βεβαιωθείτε ότι δεν έχετε απενεργοποιήσει το EDNS, ώστε να επιτρέπονται πακέτα των 4 KB αντί για τα μικρότερα των 512 bytes. Πληροφορίες για το EDNS μπορείτε να δείτε εδώ: http://spanougakis.wordpress.com/2011/05/01/edns-what-is-all-about-2/

Φυσικά αυτά είναι κάποια ενδεικτικά βήματα που πρέπει να γίνουν, προτείνω ανεπιφύλακτα να ρίξετε μια ματιά στο άρθρο που θα βρείτε εδώ: http://technet.microsoft.com/en-us/library/ee649268(WS.10).aspx

Leave a Reply