Grundsätzliche Inbetriebnahme von DNSSEC

Diesen Beitrag schrieb ich 12 Jahre und 1 Monat zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. 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.