Validace DNSSEC pomocí Dnsmasq

Dnsmasq je jednoduchá implementace základních síťových služeb — vše v jednom: DNS, DHCP, router advertisement a bootování ze sítě. Pro svou velikost (maličkost) a nenáročnost na systémové prostředky si našel místo na mnoha domácích routerech. Dnsmasq také spravuje virtuální sítě v sadě nástrojů libvirtd. A v neposlední řadě je k nalezení i na některých smartphonech (včetně Androidu), kde se používá pro tethering.

9. dubna 2014 vyšel Dnsmasq verze 2.69, který do vínku dostal podporu validace DNSSEC. To určitě stojí za vyzkoušení.

Na stránkách projektu je k nalezení odkaz na stránku s distribučními tarbally, případně adresa Git repozitáře s aktuální vývojovou verzí. Já použiji verzi z Gitu:

git clone git://thekelleys.org.uk/dnsmasq.git
Cloning into 'dnsmasq'...
...
$ cd dnsmasq

Pro předklad budou potřeba knihovny nettlegmp. Na Fedoře instalujte balíčky nettle-develgmp-devel, na Debianu nettle-devlibgmp-dev. Na jiných systémech budete muset hledat.

(fedora) $ su -c 'yum install nettle-devel gmp-devel'
(debian) $ sudo apt-get install nettle-dev libgmp-dev

Podpora pro DNSSEC se ve výchozím stavu nepřekládá a instrukce pro zapnutí naleznete v souboru CHANGELOG. V podstatě stačí předat překladači parametr
-DHAVE_DNSSEC.

$ make COPTS="-DHAVE_DNSSEC"
make[1]: Entering directory `/tmp/dnsmasq/src'
cc -Wall -W -O2 -DHAVE_DNSSEC  -DVERSION='"2.71test2"' -c cache.c
cc -Wall -W -O2 -DHAVE_DNSSEC  -DVERSION='"2.71test2"' -c rfc1035.c
cc -Wall -W -O2 -DHAVE_DNSSEC  -DVERSION='"2.71test2"' -c util.c
...
cc  -o dnsmasq cache.o rfc1035.o util.o option.o forward.o network.o dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o helper.o tftp.o log.o conntrack.o dhcp6.o rfc3315.o dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o domain.o dnssec.o blockdata.o -lnettle -lhogweed  -lgmp
make[1]: Leaving directory `/tmp/dnsmasq/src

Výsledkem bude jediná binárka dnsmasq v adresáři src. Do systému můžete instalovat tradičním make install, pro testování to však není třeba.

Veškerou funkcionalitu Dnsmasq lze konfigurovat přes parametry příkazové řádky. Případně lze použít konfigurační soubor, který používá stejné volby. Nejlepším manuálem je tedy dnsmasq –help. Pro začátek můžeme vyzkoušet, zda funguje DNS bez DNSSECu:

$ src/dnsmasq --no-daemon --listen-address=127.0.0.1 --port 53533
dnsmasq: started, version 2.71test2 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 192.168.0.1#53
dnsmasq: read /etc/hosts - 21 addresses

Server se spustí na popředí, DNS server poběží na lokálním rozhraní a portu 53533. Dnsmasq bohužel pro resolvování potřebuje jiný rekurzivní DNS server a standardně používá systémové z /etc/resolv.conf.

Zda resolvování funguje můžeme ověřit pomocí nástroje kdig, dig, drill, … zkrátka podle osobních preferencí:

$ kdig @127.0.0.1 -p 53533 +short nic.cz NS
b.ns.nic.cz.
d.ns.nic.cz.
a.ns.nic.cz.

Pokud vše funguje jak má, můžeme ukončit Dnsmasq (Ctrl+C) a zkusíme zapnout DNSSEC. Tentokrát bude lepší zápis do konfiguračního souboru:

# nastavení daemona
no-daemon
listen-address=127.0.0.1
port=53533

# vypisování dotazů do konzole
log-queries

# nastavení DNSSEC
dnssec
dnssec-check-unsigned
trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5

Jednotlivé konfigurační volby pro DNSSEC si zaslouží vysvětlení:

  • Volba dnssec zapíná validaci DNSSECu, ale pouze u podepsaných odpovědí od upstream resolveru. Takže pokud útočník ze zprávy s odpovědí poslané resolverem odstraní DNSSEC informace, Dnsmasq bude obsahu zprávy důvěřovat.
  • Volba dnssec-check-unsigned zapne validaci DNSSECu i v případě, že od resolveru přijde odpověď bez DNSSEC informací. Dnsmasq tedy za cenu dalších dotazů provede sestavení celého řetězu důvěry. Ve většině případů má smysl tuto volbu zapínat.
  • Volba trust-anchor specifikuje DS záznam klíče, který slouží jako kořen důvěry.

Spustíme server:

$ src/dnsmasq -C dnssec.conf
dnsmasq: started, version 2.71test2 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC
dnsmasq: DNSSEC validation enabled
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 192.168.0.1#53
dnsmasq: read /etc/hosts - 21 addresses

A vyzkoušíme, zda validace funguje:

  • Zabezpečená doména:
    $ kdig @127.0.0.1 -p 53533 +short www.nic.cz
    217.31.205.50
  • Nezabezpečená doména:
    $ kdig @127.0.0.1 -p 53533 +short www.unsigned.cz
    217.31.205.51
  • Chybně podepsaná doména (server vrací SERVFAIL):
    $ kdig @127.0.0.1 -p 53533 +short www.rhybar.cz
    ; Warning: failed to query server 127.0.0.1#53533(UDP)
  • Chybně podepsaná doména a CD flag (checking disabled):
    $ kdig +cd @127.0.0.1 -p 53533 +short www.rhybar.cz
    217.31.205.55

Doporučuji se také podívat na výstup Dnsmasq, kde je vidět sestavování řetězu důvěry mezi doménou a důvěryhodným kořenem:

dnsmasq: query[A] www.nic.cz from 127.0.0.1
dnsmasq: forwarded www.nic.cz to 192.168.0.1
dnsmasq: dnssec-query[DNSKEY] nic.cz to 192.168.0.1
dnsmasq: dnssec-query[DS] nic.cz to 192.168.0.1
dnsmasq: dnssec-query[DNSKEY] cz to 192.168.0.1
dnsmasq: dnssec-query[DS] cz to 192.168.0.1
dnsmasq: dnssec-query[DNSKEY] . to 192.168.0.1
dnsmasq: reply . is DNSKEY keytag 40926
dnsmasq: reply . is DNSKEY keytag 19036
dnsmasq: reply cz is DS keytag 54576
dnsmasq: reply cz is DNSKEY keytag 54576
dnsmasq: reply cz is DNSKEY keytag 43883
dnsmasq: reply cz is DNSKEY keytag 8816
dnsmasq: reply nic.cz is DS keytag 59916
dnsmasq: reply nic.cz is DNSKEY keytag 59916
dnsmasq: reply nic.cz is DNSKEY keytag 18996
dnsmasq: validation result is SECURE
dnsmasq: reply www.nic.cz is 217.31.205.50

dnsmasq: query[A] www.unsigned.cz from 127.0.0.1
dnsmasq: forwarded www.unsigned.cz to 192.168.0.1
dnsmasq: dnssec-query[DS] www.unsigned.cz to 192.168.0.1
dnsmasq: dnssec-query[DS] unsigned.cz to 192.168.0.1
dnsmasq: validation result is INSECURE
dnsmasq: reply www.unsigned.cz is 217.31.205.51

dnsmasq: query[A] www.rhybar.cz from 127.0.0.1
dnsmasq: forwarded www.rhybar.cz to 192.168.0.1
dnsmasq: validation result is BOGUS

Podpora validace DNSSEC v Dnsmasq je určitě dobrá zpráva. Teď už zbývá jen doufat, že ji výrobci routerů začnou zapínat a že se tato technologie přenese zase o kousek blíže ke koncovým zařízením. Náš router Turris je možná jediný domácí router, který DNSSEC ve výchozím nastavení validuje (pomocí Unbound).

Autor:

Komentáře (1)

  1. Jirka Novák říká:

    Vas router Turris je super.

Zanechte komentář