Skip to content

okawango-oss/DNS-layer-security

Repository files navigation

DNS-layer security auf dem RaspberryPi

Der Vorteil ist, dass Du die Möglichkeit hast, Bedrohungen zu blockieren, bevor sie Dich erreichen.

Sind DNS-Server sicher?

  • DNS-Tunneling wird häufig verwendet, um mittels DNS-Anfragen und -Antworten verschlüsselte Nutzdaten zu übermitteln, Daten aus kompromittierten Netzwerken zu exfiltrieren und Command-and-Control-Angriffe durchzuführen.
  • DNS-Beaconing wird häufig verwendet, um die Kommunikation mit einem Command-and-Control-Server ausschließlich über DNS herzustellen, was in einem Netzwerk fast immer erlaubt ist.

Diese Taktiken, Techniken und Verfahren (TTPs) spielen bei modernen Cyberangriffen oft eine wichtige Rolle und werden durch cname-cloaking begünstigt. Bei vielen bekannten Ransomware-Angriffen wurde DNS-Beaconing eingesetzt, der Supply-Chain-Angriff SUNBURST nutzte DNS-Tunneling während der Post-Exploitation, und die APT-Gruppe OilRig verwendet häufig DNS-Tunneling zur Datenexfiltration. Was kann man also tun, um DNS-Aktivitäten im heimischen Netzwerk / KMU abzusichern?

Wie die Sicherheit auf DNS-Ebene hilft, Cyberangriffe zu stoppen:

Da alle Internet-Aktivitäten durch DNS ermöglicht werden, kann die Überwachung von DNS-Anfragen - sowie der darauffolgenden IP-Verbindungen - einen großen Beitrag zur Sicherung Deines Netzwerks leisten. Die Einrichtung von Sicherheitsprotokollen zur Erkennung anomaler DNS-Aktivitäten kann eine bessere Genauigkeit und Erkennung bösartiger Aktivitäten und kompromittierter Systeme ermöglichen, die Sicherheitstransparenz verbessern und den Netzwerkschutz erhöhen. Hierzu bietet suricata die detection von Netzwerkprotokoll Anomalien. Im IPS mode werden Attacken gleich gestoppt. DNS Filtering mittels Pi-hole Blocklisten und DNSSEC Validierung verhindert die Kontaktierung zu kompromittierten Seiten und Malvertising oder zur Malware und Botnet Infrastruktur. Nichts stoppt Angriffe früher als die Sicherheit der DNS-Schicht. Schließlich ist DNS der erste Schritt bei der Herstellung einer Verbindung im Internet. Wenn eine gefährliche Verbindung auf der DNS-Ebene blockiert wird, endet der Angriff dort.

image

Abbildung 1: Die blauen Schilder zeigen, wo die DNS-Sicherheitsschicht die Kommunikation von Angreifern stoppt.

In der obigen Abbildung sieht man, wie die DNS-Sicherheitsebene feststellt, wo bösartige Domänen und andere gefährliche Internet-Infrastrukturen untergebracht sind. Sichere DNS-Server blockieren dann Anfragen, die von diesen Staging-Sites über einen beliebigen Port oder ein beliebiges Protokoll kommen, und verhindern so sowohl Infiltrations- als auch Exfiltrationsversuche. Die Sicherheit auf der DNS-Schicht stoppt Malware früher und verhindert Rückrufe an Angreifer, wenn sich infizierte Rechner mit Ihrem Netz verbinden.

Pi-hole

Das Image pihole-dhcp.img basiert auf dem Betriebssystem dietpi bzw. debian bookworm. Mittels dietpi-launcher wurde Pi-hole und der Resolver Unbound aus den Paketquellen installiert. Die Netzwerkkonfiguration ist auf dhcp voreingestellt. 84 Blocklisten sind eingepflegt worden und filtern Werbung + malicious domains. Die wichtige Option DNSSEC validiert die signierten domains und bietet dadurch einen Grundschutz. Angreifer können durch sogenanntes cname cloaking (DNS alias) versuchen dnssec zu umgehen. Deshalb wurden zusätzliche Filter gewählt, um bekannte malicious domains zu filtern. Für systemd-resolved ist DNSSEC aktiviert worden. Da DNSSEC zeitkritisch ist, hat sich der ntp server chrony bewährt. Abschließend wurde Suricata als Applikation Firewall (NGFW) im IPS-Modus mit der stateful Firewall ufw ergänzt.

Links:

Hardwarevoraussetzungen:

  • Raspberry Pi 4 Model B Rev 1.5, 2GB RAM
  • SANDISK Extreme PRO® UHS-I, Micro-SDXC, 32 GB

Download des Images pihole-dhcp.img ca. 3,5 GB

  • pihole-dhcp.img https://1drv.ms/f/s!AkAr4GI6DPy8bU7_Na-vQclJckY?e=4MwRjB onedrive location in einem neuen Tab öffnen, falls eine Anmelde Aufforderung erscheint.

  • shasum -a 512 pihole-dhcp.img:

    01ad216afe18165b99a8360555967b737205cc48a97c5c8921cb058db8c9da471116e09b8d232ca40bf440ef1cdf8d83b9a0fa427f29f93dfccbaaaee9df4c12

Empfehlung:

Flashen der SD-Karte mit dem heruntergeladenen Image.

Zum Beispiel mit Balena Etcher:

Fritz.box

Remote Zugang per ssh für macOS, Linux oder Windows, nachdem der Raspi das erste Mal hochfährt.

Hinweis: Das Dollarzeichen ($) bedeutet: als root den Befehl eingeben und mit Return abschließen, das Doppelkreuz (#) markiert Kommentare

Terminal/Putty:

  • $ssh root@ip-adress #ip-adress siehe Fritzbox
  • dietpi #das initiale Passwort
  • $dietpi-launcher #config tool https://dietpi.com/docs/dietpi_tools/
  • im Menüpunkt DietPi Config/Network options Adapters: DHCP auf STATIC ip-adress ändern
  • im Menüpunkt DietPi Config/Security options: das Passwort ändern und den host Namen, wenn man 2 Pi-holes betreiben möchte

Passwörter für die Benutzer „dietpi“ und „omv“ ändern

  • $ssh dietpi@pi-hole # login als Benutzer dietpi: Passwort lautet dietpi

  • dietpi@pi-hole:~$ sudo su # eingeben und Return drücken

  • dietpi@pi-hole's password: # das aktuelle Passwort eingeben: dietpi + Return drücken

    Kontrolle durch Statusangabe P (=OK)

  • $passwd -aS | grep P # passwd -aS | grep P eingeben

    • root P # wurde schon per dietpi-launcher geändert, falls nicht bitte nachholen
    • dietpi P # wurde schon per dietpi-launcher geändert, falls nicht bitte nachholen
    • omv P # sollte jetzt geändert werden
  • root@pi-hole:~$passwd dietpi # passwd dietpi eingeben, ggf. überspringen wenn es schon neu gesetzt wurde

  • New password: # neues Passwort für den Benutzer dietpi eingeben + Return drücken

  • Retype new password: # neues Passwort wiederholen + Return drücken

  • neues Passwort notieren

  • root@pi-hole:~$passwd omv # passwd omv eingeben

  • New password: # neues Passwort für den Benutzer omv eingeben+ Return drücken

  • Retype new password: # neues Passwort wiederholen + Return drücken

  • neues Passwort notieren, ausloggen und fertig

Pihole web login Passwort ändern

Terminal/Putty:

  • $ssh root@ip-adress
  • $pihole -a -p # anschließend das neue Passwort eingeben

Aufruf der Pihole Seite

Funktionstest im Browser für DNSSEC

  • https://dnscheck.tools im Browser aufrufen #die unteren drei Blöcke sollten grün sein (DNSSEC), in der unteren Statusleiste -> links unten in der Ecke: sollte ein Wert zwischen 50 ms und 70 ms (Performance) angezeigt werden. In den pi-hole logs sieht man dann mehrere bogus Meldungen für dnscheck.tools.

Funktionstest Blocklisten, DNSSEC und normales surfen

Terminal/Putty:

  • $dig @localhost doubleclick.net #darf keine ip-adress anzeigen, stattdessen 0.0.0.0
  • $delv +dnssec +rtrace netdata.cloud # hier sollte "fully validated" erscheinen
  • $dig +dnssec go-unsigned-ipv4.dnscheck.tools # rfc6840 konformer DNSSEC-downgrade kann ausgenutzt werden, deshalb werden DNS Filter per Pi-hole eingesetzt
  • $dig +dnssec nosig.go-ipv4.dnscheck.tools # ANSWER: 0
  • $dig +dnssec badsig.go-ipv4.dnscheck.tools # ANSWER: 0
  • $dig +dnssec expiredsig.go-ipv4.dnscheck.tools # ANSWER: 0
  • $iptables -vnL
  • Optional: Pentesting mit dem dnssec-test.sh script, dauert mehrere Stunden.

Updates:

  • Es wird automatisch auf Updates geprüft, aber nicht automatisch das Update eingespielt (Empfehlung der Pihole Entwickler). Man erkennt ein verfügbares Update an der blinkenden Versionsangabe auf der admin Seite, ganz unten nach der Anmeldung auf http://ip-adress/admin

Terminal/Putty:

  • $pihole -up #eingeben, dann wird Pihole entsprechend aktualisiert
  • Die Blocklisten werden täglich und automatisch aktualisiert, ebenso security updates gemäß Debian standard
  • apt update && apt dist-upgrade && apt autoclean # Aktualisierung des Betriebsystems
  • suricata-update --no-test # aktualisiert die Firewall Regeln

Troubleshooting

  • Erscheint keine IP-Adresse für den Pi-hole in der Netzwerkübersicht der Fritz!Box, ist es notwendig Monitor und Tastatur am Pi anzuschließen und man meldet sich mit dem Benutzer root und dem Passwort dietpi an.
  • In der erscheinenden Bildschirminformation des dietpi wird die aktuelle IP-Adresse unterhalb der farbigen Temperaturanzeige angezeigt. Diese muss mit dem Adressbereich der Fritz!Box übereinstimmen. Falls es nicht der Fall sein sollte, ruft man mit $dietpi-config das Konfigurationstool auf und wählt „Netzwerk Options: Adapters“ anschließend „Ethernet“ aus. Über „Change Mode“ kann man dann die Netzwerkeinstellungen korrigieren.