Grundsätzliche Inbetriebnahme von DNSSEC

Diesen Beitrag schrieb ich 14 Jahre und 2 Wochen zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 2 Minuten

In den WordPress-Entwürfen habe ich wieder einmal ein Howto entdeckt, das ich geschrieben, aber nicht zu 100% vollendet hatte. Es ist zwar schon etwas älter, hilft dem einen oder anderen aber ggf. ja doch weiter – weshalb ich gleich mal auf Publizieren klicken werde…

bind & chroot

Als erstes installieren wir das Paket bind9, im nächsten Schritt dann noch dnsutils – denn ohne dig oder nslookup kommen wir grundsätzlich nicht weit.

$ apt-get install bind9
$ apt-get install dnsutils
$/etc/init.d/bind9 stop

Den bind9 konfigurieren, damit er chrooted läuft:

## file: "/etc/default/bind9"
OPTIONS="-u bind -t /var/named"
RESOLVCONF=yes

Wir haben also soeben definiert, dass der bind9 seine Umgebung in /var/named haben soll. Dieses Verzeichnis sowie alle anderen benötigten müssen nun erst einmal erstellt und mit den korrekten Rechten versehen werden:

$ mkdir -p /var/named/etc
$ mkdir /var/named/dev
$ mkdir -p /var/named/var/cache/bind
$ mkdir -p /var/named/var/run/bind/run
$ mknod /var/named/dev/null c 1 3
$ mknod /var/named/dev/random c 1 8
$ chmod 666 /var/named/dev/null /var/named/dev/random
$ chown -R bind:bind /var/named/var/*

Mittels apt-get wurde das Paket in die üblichen Pfade installiert. Nun muss dafür gesorgt werden, dass der Dienst in /var/named auch seine Konfiguration findet, die per default ja in /etc herumliegt. Damit hier nichts schiefgeht, kopieren wir die Konfiguration nach /var/named und setzen anschließend einen Symlink nach /etc:

$ mv /etc/bind /var/named/etc
$ chown -R bind:bind /var/named/etc/bind
$ ln -s /var/named/etc/bind /etc/bind

Im letzten Schritt muss die Konfiguration des syslogd so angepasst werden, dass bind9 ihn weiterhin benutzen kann:

## file: "/etc/default/syslogd"
SYSLOGD="-a /var/lib/named/dev/log"

Zuletzt werden zuerst der sysklogd und anschließend der bind9 neu gestartet:

$ /etc/init.d/sysklogd restart
$ /etc/init.d/bind9 restart

Auf eventuelle Fehlerausgaben in den Logs achten! Bis hierhin ist das Setup nichts Unübliches und eigentlich nichts, was man nicht schon einmal gemacht hätte; die DNSSEC-spezifischen Schritte folgen nun.

DNSSEC: Keys erstellen

Die grundsätzlichen Schritte zur DNS-Konfiguration möchte ich hier nicht erläutern – hierzu gibt es massenhaft Dokumentation im Netz. Wir gehen nun davon aus, dass uns die Domain example.com gehört und wir für diese Domain eine Konfiguration erstellt haben.

$ dnssec-keygen -a DSA -b 768 -n ZONE example.com

Die resultierenden Files heißen

  • Kexample.com.+003+44994.key und
  • Kexample.com.+003+44994.priv

DNSSEC: Zone signieren

$ dnssec-signzone example.com

Dieser Vorgang nimmt Zeit in Anspruch – abhängig von der Anzahl der Einträge bis zu mehrere Stunden. Das resultierende File heißt in unserem Falle example.com.signed und muss anstelle des bisherigen example.com in die /etc/named.conf eingebunden werden; anschließend den Restart des bind9 nicht vergessen.

DNSSEC: Output beim Restart

Jan 22 14:36:34 alert named[25208]: loading configuration from '/etc/bind/named.conf'
Jan 22 14:36:34 alert named[25208]: zone example.com/IN: loaded serial 2009012202 (signed)
Jan 22 14:36:34 alert named[25208]: zone c.b.a.in-addr.arpa/IN: zone serial unchanged
Jan 22 14:36:34 alert named[25208]: zone c.b.a.in-addr.arpa/IN: loaded serial 2009012202
Jan 22 14:36:34 alert named[25208]: zone example.com/IN: sending notifies (serial 2009012202)

Und nicht vergessen (in named.conf.options): dnssec-enable yes; :D Jetzt können (und sollten) Testabfragen initiiert werden:

$ dig @127.0.0.1 +dnssec example.com SOA
; <<>> DiG 9.3.4-P1.1 <<>> @127.0.0.1 +dnssec example.com SOA
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50821
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;example.com.			IN	SOA

;; ANSWER SECTION:
example.com.		7200	IN	SOA	dns.example.com. root.example.com. 2009012202 86400 7200 604800 172800
example.com.		7200	IN	RRSIG	SOA 3 2 7200 20090221122154 20090122122154 44994 example.com. BGtUEm6uwbtbv6MSEcLxT6xJlEAVEstEYWdZz63WYpar/v102e2gCXs=

;; AUTHORITY SECTION:
example.com.		7200	IN	NS	ns.nameserver.net.
example.com.		7200	IN	RRSIG	NS 3 2 7200 20090221122154 20090122122154 44994 example.com. BEICtkQ6JIiTGof0WFwQgdB/V9eXkmZC5Z6TxjX7ySmcvk66Dxm0fZ0=

;; ADDITIONAL SECTION:
ns.nameserver.net.	172585	IN	A	m.n.o.p

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jan 22 15:09:59 2009
;; MSG SIZE  rcvd: 378

Auf die RRSIG-Ausgabe achten!

Nochmal: die Zone signen

$ dnssec-signzone -v 20 -o example.com example.com Kexample.com.+003+22333 
dnssec-signzone: using 2 cpus
dnssec-signzone: debug 1: no_references: delete from rbt: 0x51fc00 example.com
dnssec-signzone: debug 1: calling free_rbtdb(.)
dnssec-signzone: debug 1: done free_rbtdb(.)
dnssec-signzone: debug 1: no_references: delete from rbt: 0x51ebd0 example.com
dnssec-signzone: debug 1: calling free_rbtdb(.)
dnssec-signzone: debug 1: done free_rbtdb(.)
dnssec-signzone: example.com/NSEC:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
dnssec-signzone: host1.example.com/NSEC:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
dnssec-signzone: host2.example.com/SOA:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
dnssec-signzone: example.com/NS:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
dnssec-signzone: example.com/MX:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
dnssec-signzone: example.com/DNSKEY:
dnssec-signzone: 	signing with dnskey example.com/DSA/22333
...

Mögliche Fehler

  1. dnssec-signzone: failed to find keys at the zone apex: not found → im Zonen-File einfügen: $include (Keyfile).key
  2. dns_master_load: /etc/bind/zone.example.com:1: Kzone.example.com.+003+61750.key: file not found → hier den vollständigen Pfad zur Datei angeben.
  3. /etc/bind/Kzone.example.com.+003+61750.key:1: no TTL specified; zone rejected Jan 22 13:47:01 alert named[24137]: zone example.com/IN: loading master file /etc/bind/zone.example.com: no ttlerst die TTL, dann das $include mit dem Key angeben.
Alle Bilder dieser Seite: © Marianne Spiller – Alle Rechte vorbehalten
Hintergrundbild: 2448x 2448px, Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten

Eure Gedanken zu „Grundsätzliche Inbetriebnahme von DNSSEC“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.