Auskunft mit Siegel: dnsmasq als DNSSEC-validierender Resolver

Überprüfen PCs die Antworten von DNS-Servern per DNSSEC, lassen sich ihre Internetverbindungen nicht mehr so leicht von Hackern kapern. Mit den folgenden Schritten bekommt man den DHCP-Server und DNS-Proxy dnsmasq dazu, Antworten des Upstream-Servers auf Echtheit zu prüfen.

In Pocket speichern vorlesen Druckansicht 8 Kommentare lesen
Lesezeit: 7 Min.
Inhaltsverzeichnis

Aktuelle Linux-Distributionen wie Opensuse seit 13.2 und Ubuntu seit 14.10 bringen dnsmasq in einer Version mit, die DNS-Auskünfte eines Upstream-Servers per DNSSEC auf Unverfälschtheit prüfen kann. Während Opensuse in der Grundeinstellung das Tool nicht benutzt, führt dnsmasq unter Ubuntu die Validierung schlicht nicht aus. Beides lässt sich in wenigen Minuten beheben. Wer mit einer älteren Linux-Version arbeitet, die keinen DNSSEC-fähigen dnsmasq mitbringt, erfährt weiter unten, wie man die aktuelle Version mit DNSSEC-Unterstützung erzeugt.

Um DNSSEC-Validierung in Opensuse 13.2 zu erhalten, aktivieren Sie zunächst dnsmasq in der Diensteverwaltung des Systemverwaltungstools Yast. Dann ändern Sie in Yasts Netzwerkeinstellungen unter dem Reiter Hostname/DNS die DNS-Konfiguration auf eine "Benutzerdefinierte Richtlinie", stellen diese im dahinter folgenden Ausklapper auf "STATIC" und tragen als einzigen Server bei "Nameserver 1" die Adresse 127.0.0.1 ein, also den später lokal laufenden dnsmasq.

Nun bearbeiten Sie /etc/dnsmasq.conf und weisen dnsmasq durch Entfernen des Kommentarzeichens (#) vor dem Parameter dnssec an, das Protokoll zu verwenden. In der direkt davor stehenden conf-file-Zeile löschen Sie ebenfalls den # und ersetzen %%PREFIX%% durch /usr, sodass der Eintrag tatsächlich auf den mitinstallierten Trust Anchor zeigt. Weisen Sie dnsmasq durch Entfernen des # vor no-resolv an, nur die in dieser Datei definierten DNS-Server zu verwenden. Fügen Sie gleich zwei in den nächsten beiden Zeilen ein:

server=IP-Adresse1
server=IP-Adresse2

Ihr Provider sollte passende Adressen wissen. Eine Liste öffentlicher, DNSSEC-fähiger Server führt beispielsweise das IPFire-Projekt. Für einen kurzzeitigen Test können Sie die Server der tschechischen NIC verwenden (217.31.204.130, 217.31.204.131). Damit ist die Bearbeitung der dnsmasq-Konfiguration abgeschlossen.

Damit dnsmasq den eben definierten Trust Anchor lesen kann, braucht es noch das entsprechende Recht, was Sie durch Anhängen der Zeile

/usr/share/dnsmasq/* r

Zeigt der Resolvertest nach dem Aufsetzen von dnsmasq nicht diese Erfolgsbestätigung, löschen Sie den Browsercache und starten den Test noch mal.

an die Datei /etc/apparmor.d/local/usr.sbin.dnsmasq gewähren. Nach dem nun fälligen Neustart vergewissern Sie sich mit einem Aufruf des Online-Tools der Uni Duisburg-Essen, dass dnsmasq tatsächlich validiert.

Wenn dnsmasq nicht nur auf host-lokale Anfragen antworten soll, sondern auch auf welche aus dem lokalen Subnetz, dann setzen Sie in /etc/dnsmasq.conf die Schnittstelle, an der dnsmasq lauschen soll (interface=enp0s8 oder ähnlich). Damit der in dnsmasq integrierte DHCP-Server nicht dem Ihres Routers in die Quere kommt, schalten Sie die Funktion ab (no-dhcp-interface=enp0s8). Je nachdem, in welcher Firewall-Zone die Schnittstelle eingeordnet ist, müssen Sie eventuell in der Opensuse-Firewall noch eine Freigabe für DNS-Anfragen und -Antworten eintragen.

In der Standardinstallation von Ubuntu 14.10 und 15.04 kümmert sich der NetworkManager um das Einrichten der Schnittstellen. Das Tool startet beim Booten einen DNSSEC-fähigen dnsmasq 2.72 und konfiguriert ihn über die Systembus-Schnittstelle DBUS. Die Konfiguration ist jedoch derart vernagelt, dass wir DNSSEC damit nicht zum Laufen bekamen.

Als Lösung blieb nur, den NM-gestarteten dnsmasq zu deaktivieren (dns=dnsmasq in /etc/NetworkManager/NetworkManager.conf mit Voranstellen von # auskommentieren), das reguläre dnsmasq-Paket zu installieren (sudo apt-get install dnsmasq) und den dann durch Bearbeiten der Konfigurationsdatei /etc/dnsmasq.conf wie oben bei Opensuse 13.2 beschrieben zum Validieren zu bewegen. Anders als bei Opensuse liegt der Trust Anchor hier in /usr/share/dnsmasq-base/trust-anchors.conf. Nun sollte Ubuntu nach einem Neustart ebenfalls validieren, was Sie mit dem Aufruf des Online-Tools der Uni Duisburg-Essen prüfen können.

Wer den etwa auch im Router-Betriebssystem OpenWRT steckenden, schlanken dnsmasq als validierenden DNS-Resolver einsetzen will, muss ihn eventuell von Hand übersetzen und konfigurieren. Das geht mit der bei Redaktionsschluss aktuellen Version 2.72 unter OpenSuse 13.1 so: Zunächst laden Sie die SSL-Bibliothek Nettle in Version 2.71 herunter. Entpacken Sie sie, bauen Sie alle Komponenten (./configure ; make all) und installieren Sie diese (sudo make install). Zwischendurch angemeckerte fehlende Pakete ziehen Sie mit dem Paketmanager Ihrer Distribution nach. Anschließend entpacken Sie dnsmasq und bauen es statisch mit:

make all COPTS='-DHAVE_DNSSEC -DHAVE_DNSSEC_STATIC -DHAVE_DBUS'

Danach installieren Sie dnsmasq (sudo make install). Dabei landet das Binary dnsmasq in /usr/local/sbin. Benennen Sie als Root das originale dnsmasq in /usr/sbin in dnsmasq.orig um und setzen Sie einen symbolischen Link auf die neue Version (ln -s /usr/local/sbin/dnsmasq /usr/sbin/dnsmasq).

Aus dem Quellenverzeichnis kopieren Sie die Datei trust-anchors.conf nach /etc. Den dnsmasq-Aufruf ergänzen Sie an der für Ihre Distribution richtigen Stelle um die DNSSEC-Parameter, bei Opensuse 13.1 steckt er in /usr/lib/systemd/system/dnsmasq.service:

/usr/sbin/dnsmasq ... --dnssec --dnssec-check-unsigned

Hängen Sie an die dnsmasq-Konfigurationsdatei (typischerweise /etc/dnsmasq.conf) diesen Eintrag an:

conf-file=/etc/trust-anchors.conf

Falls Sie einen internen DNS-Resolver betreiben, der Anfragen nach lokalen Hosts beantwortet, kann dnsmasq für bestimmte Domains diesen statt des externen verwenden. Dazu fügen Sie für jeden lokalen Resolver eine Zeile à la

server=/heise.de/ct.de/ix.de/ 10.10.10.32

ein. Weisen Sie dnsmasq ferner an, als externe Server welche zu nehmen, die DNSSEC liefern:

server=IP-Adresse1
server=IP-Adresse2

Die Adressen finden Sie wie vorn bei Opensuse beschrieben. Stellen Sie nun den Host so ein, dass er sich selbst befragt (nameserver 127.0.0.1 in /etc/resolv.conf).

Damit DNSSEC funktioniert, muss der Host die richtige Zeit haben, die das Betriebssystem beim Booten normalerweise aus der batteriegestützten Mainboard-Uhr (RTC) holt. Die gibt es auf Routern nicht, weshalb dort beim Booten ein Tool wie Chrony oder NTP die Zeit aus dem Netz holt.

Weil das Tool aber Servernamen per DNS auflösen muss, weist der zusätzliche Parameter --dnssec-no-timecheck dnsmasq beim Start an, bei Validierungen zunächst nicht die Zeit zu überprüfen. Bauen Sie im Bootprozess an passender Stelle – nachdem die Zeit gestellt ist – den Befehl killall -HUP dnsmasq ein. Das Signal lässt dnsmasq seinen Cache leeren und setzt das No-Timecheck-Flag zurück, sodass die folgenden Validierungen auch die Zeit berücksichtigen. (ea)