===== DNSsec mit Bind9 ===== Standards für die "Domain Name System Security Extensions (DNSSEC)": RFC 4033, RFC 4034, RFC 4035, RFC 5011 und RFC 5155. \\ \\ === Entropie zur Schlüsselgenerierung === Um genügend Entropie für die Erzeugung der Schlüssel zur Verfügung zu haben, sollte z.B. "haveged" installiert werden. Bei aktuellen Distributionen sollte dies allerdings nicht mehr unbedingt notwendig sein: root@noc:~# apt install haveged root@noc:~# haveged === Einstellungen für Bind === dnssec-validation ist seit BIND Version 9.8 default auf yes, sollte aber für das Management des root-key (/var/cache/bind/managed-keys.bind) in /etc/bind/named.conf auf dnssec-validation auto gestellt werden. Ferner sollte mit der Option key-directory für die Schlüssel ein eigenes Verzeichnis angegeben werden, in denen BIND beim Signierten nach gültigen DNSKEYs sucht. root@noc:~# less /etc/bind/named.conf options { .... key-directory "/var/chache/bind/keys"; dnssec-validation auto; dnssec-lookaside auto; ... }; root@noc:~# mkdir -p /var/cache/bind/keys/ root@noc:~# chown -R bind:bind /var/chache/bind/keys/ Danach BIND mit root@noc:~# systemctl restart bind9 neu starten. === Zone-signing Keys erstellen === Mit dnssec-keygen wird ein Zone-signing-key-Paar aus öffentlichem (.key) und privatem (.private) Schlüssel erzeugt Der "haveged"-Daemon erzeugt eine große Entropy in /dev/random. Alternativ kann auch das "non-blocking" pseudo-random device /dev/urandom verwendet werden. Hierbei sinkt jedoch die Sicherheit etwas. === Zone Signing Key (ZSK) generieren === root@noc:/var/cache/bind/keys# dnssec-keygen -3 -a RSASHA512 -b 2048 -n ZONE -r /dev/random hackerbruecke.net Generating key pair.......+++++ ...............................................+++++ Khackerbruecke.net.+010+09558 * "-3" aktiviert NSEC3 * "-a RSASHA512" bestimmt den Typ der Signatur (muss wegen "-3" kompatibel sein! RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256, ECDSAP384SHA384, ED25519 und ED448 stehen zur Auswahl) * "-b" gibt die gewünschte Blockgröße an * "-n" spezifiziert den Nametyp wie ZONE, HOST, USER * "-r" wählt das Random-Device aus === Key Signing Key (KSK) generieren === root@noc:/var/cache/bind/keys# dnssec-keygen -3 -a RSASHA512 -b 4096 -n ZONE -r /dev/random -f KSK hackerbruecke.net Generating key pair........................................................++++ .................................................................................................++++ Khackerbruecke.net.+010+48817 * "-3" aktiviert NSEC3 * "-a RSASHA512" bestimmt den Typ der Signatur (muss wegen "-3" kompatibel sein! RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256, ECDSAP384SHA384, ED25519 und ED448 stehen zur Auswahl) * "-b" gibt die gewünschte Blockgröße an * "-n" spezifiziert den Nametyp wie ZONE, HOST, USER * "-r" wählt das Random-Device aus * "-f KSK" setzt das Flag im KEY/DNSKEY record === Owner und Rechte auf Schlüssel setzen === root@noc:/var/cache/bind/keys# chown -R bind:bind /var/cache/bind/keys/ === Zone signieren === Im praktischen Betrieb werden Zonen nicht per Hand auf der Kommandozeile signiert. Zum einmaligen Signieren per Hand verwenden, kann aber dnssec-signzone verwendet werde: root@noc:/var/cache/bind/keys# dnssec-signzone -S -o hackerbruecke.net /var/cache/bind/hackerbruecke.zone * "-S" aktiviert "smart signing", d.h. es wird im in /etc/bind/named.conf angegebenen key directory nach Schlüsseln gesucht, die zum Signieren verwendet werden * "-o hackerbruecke.net" gibt die Zone mit dem Namen "hackerbruecke.net" als Origin an, nach der in der Datei /var/cache/bind/hackerbruecke.zone gesucht wird === DS Resource Record im Parent veröffentlichen === Wenn die Zone online geht, muss noch der DS RR im Parent eingetragen werden. Dank "smart signing" hat dnssec-signzone für uns diesen schon für den verwendeten KSK erstellt. root@noc:/var/cache/bind/keys# ls -lthr total 16K -rw------- 1 root root 3.3K Apr 7 16:35 Khackerbruecke.net.+010+48817.private -rw-r--r-- 1 root root 964 Apr 7 16:35 Khackerbruecke.net.+010+48817.key -rw------- 1 root root 1.8K Apr 7 16:36 Khackerbruecke.net.+010+09558.private -rw-r--r-- 1 root root 618 Apr 7 16:36 Khackerbruecke.net.+010+09558.key === Signieren der Zone === for key in `ls Khackerbruecke.net.*.key` do echo "\$INCLUDE /var/cache/bind/keys/$key">> /var/cache/bind/hackerbruecke.zone done dnssec-signzone -3 `head -c 512 /dev/random | sha1sum | cut -b 1-16` -z -H 330 -K /var/cache/bind/keys -t -o hackerbruecke.net /var/cache/bind/hackerbruecke.net Durch das Signieren wird eine neue Zonendatei mit dem Suffix ".signed" erzeugt. === Owner und Rechte der Zonefiles setzen === root@noc:/var/cache/bind/keys# chown -R bind:bind /var/cache/bind/ === Zone veröffentlichen === root@noc:/var/cache/bind/keys# vim /etc/bind/named.conf zone hackerbruecke.net { type master; file "/var/cache/bind/hackerbruecke.net.zone.signed"; allow-transfer { "slaves"; }; notify yes; }; BIND neu starten: root@noc:/var/cache/bind/keys# systemctl restart bind9 === DNSsec-Schlüssel beim Registrar bekanntgeben === Für die Aktivierung ist die Angabe des richtigen KSK von großer Bedeutung. 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. === Testen === root@noc:/var/cache/bind/keys# dig hackerbruecke.net dnskey +noall +answer +multiline root@noc:/var/cache/bind/keys# dig A www.hackerbruecke.net +dnssec https://dnssec-analyzer.verisignlabs.com/ http://dnsviz.net/ === Wichtig === Nach jeder Änderung in der Zonendatei, muss diese neu signiert werden! \\ \\ <- [[linux:linux|zurück]]