Einführung

DNS Antworten können signiert werden, damit man überprüfen kann, ob es sich um eine richtige und vertrauenswürdige Antwort handelt. Die DNS Antworten werden vom authoritativen DNS Server signiert. Die Schlüssel, welche die Antworten signieren, werden von dem DNS Server eine Zone höher signiert. Über diese Chain-of-Trust können Anwendungssoftware und DNS Resolver prüfen, ob eine Antwort vertrauenswürdig ist oder nicht. Mit dem DNS Server bind kann man seine Zonen selber signiert anbieten. Ich zeige das am Beispiel der Domain example.org.

NSEC vs. NSEC3

Die Nichtexistenz einer Domain ( NXDOMAIN) wird mittels eines NSEC Records (Next SEcure Record) bewiesen. Fragt man einen Nameserver nach einer nicht existierenden Domain, sagt dieser “diese Domain gibt es nicht, aber folgendes ist die nächst gültige…”. So werden alle existierenden Domains in einer Art Linked List verkettet. Damit ist es sehr einfach die ganze Zone durchzugehen und so alle existierenden DNS Einträge zu bekommen. Das geht z. B. mit dem Tool ldns-walk. Bei der neueren Version NSEC3 geht das nicht mehr, da dort der Eintrag mit einem Salt und mehreren Iterationen gehashed werden kann. Ein Angreifer kann mit einer Rainbowtable die Hashes vorberechnen und so offline probieren die Zone zu enumerieren, was sehr aufwändig ist (aber möglich). Deshalb sollte man heutzutage NSEC3 und nicht mehr nur NSEC verwenden.

Key Signing Key (KSK) erstellen

Der Key Signing Key (KSK) benötigt man um sich seinen Zone Signing Key (ZSK) zu signieren. Der eigene KSK wird von einer DNS Zone weiter oben signiert. Alle folgenden Arbeiten werden im Verzeichnis /etc/bind durchgeführt. So erstellt man ein Key Signing Key:

dnssec-keygen -3 -a RSASHA512 -b 4096 -n ZONE -r /dev/urandom -f KSK example.org
  • -3 aktiviert NSEC3
  • -a RSASHA512 Typ der Signatur
  • -b 4096 Blockgrösse

Dabei entstehen folgende Dateien:

  • Kexample.org.+007+28736.key: DNSKEY Record: Öffentlicher Schlüssel. Dient zum Verifizieren der ZSK Keys. Wird von der höheren Zone signiert.
  • Kexample.org.+007+28736.private: Privater Schlüssel zum Signieren des öffentlichen ZSK.

Der öffentliche Schlüssel beinhaltet einen DNSKEY Record:

# ; ; ; ; e x c T C P A a a h r u c m t i e b t p s a l i l K t i v e e i e s a . x s d h t o a : : e r m a : g p 2 2 . l k 0 0 2 e e 1 1 0 I . y 4 4 1 N o - 0 0 4 r s 9 9 0 D g i 0 0 9 N . g 2 2 0 S + n 1 1 2 K 0 i 1 1 1 E 0 n 0 0 1 Y 7 g 0 0 0 + 4 4 0 2 2 k 3 3 4 5 8 e 3 7 7 y ( ( 3 , T T ( 3 6 u u T . k e e u 1 k e e 0 e y S S y i e e S B d p p e Q p E 2 2 2 A 8 2 A 7 1 1 A 3 3 3 1 A 6 : : 3 B , 0 0 : w 0 0 0 Z f : : 0 T o 4 4 : L r 3 3 4 [ 3 . e 2 2 . x 0 0 2 . a 1 1 0 ] m 4 4 1 m p ) ) 4 D l ) R e 7 . e o a r I g P . P j B T i h K 7 w = =

Darin sind folgende Werte zu sehen:

Zone Signing Key (ZSK) erstellen

Der Zone Signing Key (ZSK) Schlüssel wird vom eigenen KSK signiert. Die ganze Zone wird mit diesem Schlüssel signiert. So erstellt man ein Zone Signing Key:

dnssec-keygen -3 -a NSEC3RSASHA1 -b 2048 -n ZONE -r /dev/urandom example.org

Dabei entstehen folgende Dateien:

  • Kexample.org.+007+60310.key: Öffentlicher Schlüssel, DNSKEY Record. Dient zum Verifizieren der DNS Antworten
  • Kexample.org.+007+60310.private: Privater Schlüssel zum Signieren der Ressource Records
# ; ; ; ; e x c T C P A a a h r u c m t i e b t p s a l i l K t i v e e i e s a . x s d h t o a : : e r m a : g p 2 2 . l z 0 0 2 e o 1 1 0 I . n 4 4 1 N o e 0 0 4 r - 9 9 0 D g s 0 0 9 N . i 2 2 0 S + g 1 1 2 K 0 n 1 1 1 E 0 i 1 1 1 Y 7 n 3 3 1 + g 0 0 3 2 5 5 5 0 5 0 k 5 6 5 e ( ( 7 y T T ( 3 5 , u u T . e e u 1 k k e 0 e e S S y y e e S B i p p e Q d p E 2 2 A 5 2 A 0 1 1 A 5 3 3 1 A 7 : : 3 B 5 1 1 : [ , 3 3 1 . : : 3 . f 0 0 : . o 5 5 0 ] r 5 K 2 2 t e 0 0 2 t x 1 1 0 L a 4 4 1 / m ) ) 4 M p ) Z l L e n . P o s r = g .
  • 256: Nur Bit 7 vom flags Feld: Zone Signing Key (ZSK)
  • 3: Fix vom Protokoll definiert.
  • 10: RSASHA512

Zone signieren

Die neuen öffentlichen Schlüssel bindet man im Zonenfile mit der $INCLUDE Direktive ein:

# ; $ $ I I v D N N i N C C S L L / S U U e E D D t C E E c / K K b e e i x x n a a d m m / p p d l l b e e . . . e o o x r r a g g m . . p + + l 0 0 e 0 0 . 7 7 o + + r 2 5 g 8 0 7 5 3 7 6 5 . . k k e e y y

Nebenbei ein Tipp für vi Benutzer: Die Dateinamen holt man in vi am einfachsten mit mit :r!ls Kexample.org.*.key.

Jetzt kann man die Zonen signieren. Dabei bekommt man eine neue Zone mit dem Suffix .signed.

# - V Z A Z d S S S S S S S R H e o l S b i i i i i i i u d r n g K . g g g g g g g n n 3 i e o s m n n n n n n n t s 3 f r : o a a a a a i a i s 0 y s i t t t t t t n t m e i i t 1 d u u u u u g u e c - n g h . r r r r r r - t g n m a c e e e e e t e i s i : c h s s s s s i s n i t n t . m g h g R i s g r d s u e p s n e S v i e e r u n e e z e c A e g n t o c s i r c o x z o S , n e a p c u n o n a o m H e r i p e c s n e m n p A 0 d a n e s c s e d p e l 5 t e d s e e c s - l e 1 s e d : f s c o : 3 e u t 2 t d : u s o n . s e : a : l f n d ` o i : n l u d : h r n K d y l s e g g S - l : a K b v y d d t s y e b h : , r v - . e i e c e 1 0 f r x f i i 5 a o a r e f 1 m l c e d i 2 p l t v : e l o i o d / e w v k : d . i e e e o n , d v r g / g 0 u a r l s 3 a g t 1 5 1 n o a . . . d r n 1 2 2 o i d 4 8 9 8 m t - 2 0 0 0 0 9 6 9 h b ` | m y ` s , s : h 0 a R 1 S r s A e u S v m H o A k | 5 e 1 d c 2 u . t - b 1 - 1 6 ` \
  • -3 aktiviert NSEC3 und benötigt als Parameter einen Salt, welcher aus den ersten 16 Zeichen einer SHA1 gehashten Zufallszahl besteht. Es wird empfohlen bei jedem signieren einen neuen Hash zu generieren.
  • -H gibt an wieviele Iterationen für den Hash gemacht werden müssen. Empfehlungen dazu gibt es im RFC4641 (DNSSEC Operational Practices): http://www.ietf.org/rfc/rfc4641.txt
  • -t zeigt am Schluss eine Statistik an
  • -o gibt die Zone an
  • am Schluss gibt man das das Zonenfile an

Update (25.05.2021): Der im Best Current Practice Draft  " Guidance for NSEC3 parameter settings" empfohlene Wert für die Anzahl Iterationen ist 0 und kein Salt ("-").

Falls man die Keys in einem anderen Verzeichnis hat, kann man dies mit -K angeben.

Die neue Datei der signierten Zone heisst db.example.org.signed und beinhaltet folgendes:

  • Alle Ressource Records lexographisch (alphabetisch) sortiert.
  • Nach jedem Ressource Record wird ein NSEC3 Record eingefügt, welcher auf den nächsten Ressource Record zeigt (gehashed).
  • Alle Ressource Records (auch die neuen NSEC3 Records) haben ein RRSIG Record bekommen, welches die Signatur vom Record ist. Erstellt wurde diese Signatur mit dem ZSK.

Bei jeder Änderung in der Zone, muss diese neu signiert werden.

Die signierte Zone ist 30 Tage lang gültig und muss danach wieder erneut signiert werden. Mit -e YYYYMMDDHHMMSS kann dnssec-signzone eine eingene Endzeit angegeben werden.

DNSSEC in Bind aktivieren

In Bind kann man dnssec in den globalen Optionen aktivieren:

# [ d . n v . s i . s ] e / c e - t e c n / a b b i l n e / n y a e m s e ; d . c o n f . o p t i o n s

Danach aktiviert man für die zu signierende Zone das neue Zonenfile mit dem Suffix .signed:

# [ z t f a n } . o y i l o ; v . n p l l t i . e e e o i ] w f / " m " - y e e a / t t x s e r y c a t t a e / m e c n s b p r / s ; i l ; b f n e i e d . n r / o d n r / { a g d m " b " e . s d { e l . x a c a v o m e n p s f l " . e ; l . o o } c r ; a g l . s i g n e d " ;

Key beim Registrar eintragen

Jetzt muss man DNSSEC bei seinem Registrar aktivieren. Dies geschieht zum Beispiel online. Beim Aktivieren wird man nach dem richtigen KSK gefragt, was man gestätigen muss.

Die Zone höher muss die Delegation Signer Ressource Records (DS-RR) für die darunterliegende Zone eintragen. Sind die DS-RR eine Zone höher eingetragen, kann die Zone nun verifiziert werden. Die DS-RR werden zum erstellen der Chain-of-Trust benötigt.

Es dauert es je nach dem eine Weile bis man die DS-RR sieht:

$ ; ; ; ; ; ; ; ; ; ; ; e 5 e 3 6 e A 1 5 ; ; ; ; ; ; ; ; ; ; ; e ; x D x 0 A x D 4 3 ; ; ; ; d E x a 9 a 0 6 a 0 F D i g G f W O D Q a A m 0 m 2 1 m 9 1 B Q S W M g l o l A P N U m N p 4 p E 4 p B 3 8 u E H S o t > a R T S E p S l B l 4 6 l 9 A B e R E G e b H g N : S l W e E e 3 D e B 6 D r V N x D a a E s I P T e E . C . C 2 . 7 D 0 y E : S a i l n A : N S v I . R o 6 o 7 C o D 0 R I m G s D G E e O o r 6 r A 5 r A D ) t : T Z p o w E q : U r N r S g E g F 7 g B E i u E l 9 p e R r D s g E . 4 . 9 B . 8 3 m 1 e e . t r < r O i S . C D C 8 3 6 e 3 r . 9 i : < a e S o E T 3 7 3 C 5 3 0 E : 0 S c o . o - a c E n C I I 6 9 6 B 1 6 A 8 . e v r 2 n u C : T N O 0 3 0 3 4 0 A 7 1 5 p d g - s o r r T I N 0 C 0 1 5 0 9 0 3 9 : P : p d s I 0 O D : 1 F 5 F 3 . 2 d 2 c ; i O , N S I 9 I D 0 I 6 0 m 1 1 s + o o N : N 0 N 1 2 N 3 4 s . 1 9 c d Q n : f B C 7 9 e 8 6 1 @ m e U l D 0 D C ) D 1 C c 0 : a d : E r a S 9 S D S C 6 # 0 . R e g 9 9 7 A 5 9 n Q Y q s 7 5 7 0 7 A 4 3 : i e U : u : 1 4 1 F 1 6 8 ( 0 c x E e ; 2 C 2 9 2 9 2 1 7 . a R 1 s 7 5 7 B 7 A 4 3 c m Y , t u 6 F 5 A 0 2 h p , e d 7 B 7 D 7 C 2 . 0 l A d p 5 8 1 8 5 1 + e s N : 1 9 2 A 4 2 B 9 4 m . t S b 2 6 2 C . u o a W u 4 ( A ( D ( B 6 1 l r t E t 0 4 C 7 0 . t g u R 9 6 5 0 1 8 i s : n 6 C B 5 9 0 l d : o 2 B 0 A ) i s 3 t 7 0 1 D n N , 8 0 D 5 e @ O a 9 E 4 a E A v ) 7 A 0 . R U a F F 3 n R T i 8 E 0 i O H l c R O a . , R b c I l h i T e d Y ` + : : m u 5 0 l 8 , t 4 i 7 A l 1 D i D n I e T I O N A L : 1

In den DS Records sieht man den KSK, welcher hier die ID 7127 trägt.

Auch der whois Eintrag zeigt, dass DNSSEC aktiviert ist:

$ D N w S h S o E i C s : Y e x a m p l e . o r g | g r e p D N S S E C

DNSSEC Testen

Jetzt können die Nameserver, welche die DNSSEC Validierung aktiviert haben, die Antworten für unsere Zonen validieren.

Die öffentlichen DNS Schlüssel (KSK und ZSK) können so abgerufen werden:

$ ; ; e B o u a t L T ) e B X X 3 B X 2 J Q T 2 6 Z l X ) ; x Q T k q o L s a x Q 0 B 8 e + K r P q 5 s k r h z d a E G U w P C V C ; a E w t A s T 8 t y C 1 O V v o h ; i g m A O 3 / b O 1 g m A 7 C / H w z v 6 K + 3 V t i G g l p A 8 B v T C A B Z p A Q b w W m r V k J V O K C u i K o l A K B J v q h l S l A a I j 1 Y k A S d i p H Y 8 Q S e b e A m N 2 q Q w P K e A d M / j R g 7 M + C Z 3 d N 2 K x D a . B J U p + 1 a C ; . B e f 8 Q X Q V M I 4 2 J J 4 M ; a i l o v B r L t M 9 w o u v Q Y i G e G f 7 w W R X 9 F m G r 2 w F C W c 8 z a r U o 8 5 B s T E Y m e w e 0 b Z a p o g V J Y P I E k 5 l g U c W 2 d m l a O n A G 7 R j e l l 9 p . U 2 B J N I s a g . u g N U 0 + H T t X s y B m s 3 g e . t 7 j i T B m O S 5 2 M D k h C C x 8 3 1 B t K N . 9 i N x e O K Y A k = v B H a k v s n 1 z L B Y R 2 7 = o . o B z u T Q T g U L L K R r 3 j x L j Z g 8 B k 3 r 2 n 8 5 3 x 9 / W c p N 8 y R z V D h 3 7 c X E m 7 r k g N g - s 6 E l M e O p c S S 6 f T O 0 m 2 6 N Y g w i 2 B x 9 S P : 4 c k C z h 8 Z a E 4 N A p K o J Z u 4 B M 3 r e Z A E d 2 0 A U n m + r D i C 0 r Q 6 Z e 3 D u p H l 0 c d k h C n + 0 J w p J p p J c 3 0 u I v r 0 z b 9 V 6 1 3 E O x K 3 s c x p G 9 r d x M R 1 b E c 8 L 1 z 2 j a s h c l 9 R k m I C 4 Z M e l q 5 S I E O V E l Y w g j g t w r b k E S e d N U G b I 3 H 2 2 A N t O C U s 8 7 9 t H 8 q k a I v A y W f L R 1 m N 4 S / r x Z 9 D A B l z M Z d h T G S D S y S 8 T v g p H D S P 2 s d Z p n B 5 h D b G e O H + e N 3 p F L O A L S A N V f o v w O A G K z j g e J 1 d A n x S M S F i v g Z j 1 S / h 8 3 1 q M k o N R O l 2 X B 1 o a K n o 0 V Q b 3 F ; K S v F g d M L c N 2 d d B h P s ; a m E 7 n u z g J 2 s E 3 B u o R p H m d j b 9 6 q E L l p Y U 9 S l 4 D F b k Y X 5 R q H w Z w x n 9 U 0 5 v U k l l L q W S 7 6 2 w e 8 F a 3 H 8 k G c / u v E m h U e e 2 E 1 K M J s I m y 2 Q 3 8 h 3 I b R b I v M B y d = y + . 5 D K i P W 9 j C 5 2 f c S / E G h r 0 b Q I l D a o 6 O D L L / M U k i 7 3 7 1 L m c 0 M B Z S b N x v i n r e Y Q 1 N D H b d q 3 S 0 o g k t e D 6 M o C W d s g 3 j U U H e B s / 3 s G I d s V F O G t d f 5 d 9 w y r W C l 6 M c = 2 r i Z 6 k T x 0 c S d e m 4 = e d 7 K / K O 9 p f 7 7 t n u g s L X 0 5 a 3 G d T n r n h g t W n v M m 6 x s a H E 7 + Q F n f f e k a 7 s ( g m X u B b J + 8 ( 3 R Y H w d U k F c M N p x T 1 + k q O f f h x S N 2 H B K f 6 u 2 N u T t u d C S 2 m e g X b n G s n w 6 R x f b b x A j r 0 P a 8 U H 7 u y 9 + B 8 o 9 i = Q T A X E 7 T B 3 9 p o S 8 p l 8 9 t K / B 9 = b y H b R 2 6 y O v 5 F q 3 Z t + i n l o i a n l e l + a n s w e r + m u l t i l i n e

Zu jedem Record bekommt man jetzt ein RRSIG Record, welcher die Signatur darstellt. Dies kann mit der Option +dnssec in dig aktiviert werden:

$ ; ; ; ; ; ; ; ; ; ; ; e e 2 D C m m 2 n a Z [ ; ; ; ; ; ; ; e ; x x 0 m d 0 M Q 3 d A . d E x a a 1 B 5 3 z t j 5 o . i g G f W O D Q a A m m 4 i L o 5 2 I a n . g l o l A P N U m N p p 1 5 q c m y M N G ] o t > a R T S E p S l l 0 I 7 z r C M e L e b H g N : S l W e e 0 b g A Z V q 5 x x D a a E s I P T e E . . 2 g y 8 k n C 0 8 a i l n A : N S v I . R o o 1 m 5 E f 4 Z m z m G s D G E e O o r r 0 l 1 T g q 4 3 3 p o w E q : U r N r S g g 5 T v 0 6 r s m q l 9 p e R r D s g E . . 1 L e 5 M t E O 4 e . t r < r O i S . C 4 f K 1 w p M u z . 9 i : < a e S o E T 8 8 5 e x G U 3 Z k m o . o - a c E n C I I 6 6 A t 8 U f R Z b r 2 n u C : T N O 4 4 2 B d d d 8 h C B g - s o r r T I N 0 0 0 O + m d Y 1 r W . P : p d s I 0 O A : 0 0 1 g q d 4 g E + 6 2 c ; i O , N 4 1 N H G o M I d A + o o N : I I 0 s x K C c W D Y c d Q n : f N N 9 X u T k R S s f + m e U l 0 x 8 4 c e z V F d d : E r a A R 2 7 a n / O i W c n R e g R 1 k h L 7 U G Z R s Q Y q s 5 S 0 R x 4 n Z P W e s e U : u : . I 5 z p h f a o + j e x E e 4 G 1 D 5 5 9 a m B Y c a R 1 s d 5 4 4 w / y O q n i m Y , t o . A 5 D Z Z 3 N + 0 1 @ p , e ; 1 5 3 9 1 Y S Y l n l A d 0 7 6 n r R d l 4 I 2 s e s N u 5 8 0 e Y L P U B L 1 . t S b d . 2 2 7 d I Z a H N B . o a W u p 7 6 p A o X R Z I Q m r t E t : 1 8 Y S H i O k m = o g u R 6 e / j 7 / f J 8 = t . s : n 4 4 x K B i z e z W d : o 0 0 a 3 A 8 i n W 2 ) . A 2 t 9 0 m 1 V D 4 a c 4 c N , 6 p r Y + H I 1 N h + O a ( l g 2 o E H a r d E A v e m s t l Y s r + n R U a . Y u Q O j 3 Z m s R T i o T i P x T 2 G s O H l r e R O a g c , R b . I l @ i T e n d Y ` s : : 1 . 7 3 m 1 , o 7 t 6 A d D . D c I h T I + O m N A L : 5

In Firefox gibt es das Plugin DNSSEC Validator, welches einem den Status von DNSSEC der Domain einer Webseite anzeigt:

Es gibt auch Webseiten, welche einem die DNSSEC Konfiguration prüfen. Hier ein Beispiel vom DNSSEC-Debugger von Verisign Labs ( http://dnssec-debugger.verisignlabs.com):

Weitere Schritte/Ideen

  • Einpflegen von SSHFP Records für SSH Public Keys
  • Einfplegen von PGP Key im DNS
  • Einpflegen von TLSA Records für DANE Unterstützung (SSL Fingerprint im DNS)
  • Automatisches Signieren der Zonen bevor sie ungültig werden
  • Resolver nutzen, welche ungültige DNSSEC Antworten ablehnen
  • Automatisches Signieren von Zonen mit Dynamischen Updates
  • Sich Gedanken machen, wie man die Schlüssel am einfachsten wechselt und den ZSK regelmässig wechseln.
  • Signierte Zone in einem Monitoringtool eintragen, damit man bei Problemen benachrichtigt wird