dns dnssec bind

wall < "Grundsätzliche Inbetriebnahme von DNSSEC"

Broadcast message from spillerm@unixe.de (pts/1) (Do Apr 08 10:04:11 2010):
4
Diesen Beitrag schrieb ich vor 9 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

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:

## /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 ersteinmal 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 anschliessend 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:

## /etc/default/syslogd
SYSLOGD=”-a /var/lib/named/dev/log”

Zuletzt werden zuerst der sysklogd und anschliessend 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 schoneinmal 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 heissen

  • 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 heisst in unserem Falle example.com.signed und muss anstelle des bisherigen example.com in die /etc/named.conf eingebunden werden; anschliessend 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 ttl

    Erst die TTL, dann das $include mit dem Key angeben.

4