DNS (Domain Name System) ist eine kritische Komponente des Internets, die dafür verantwortlich ist, Domainnamen in IP-Adressen zu übersetzen. Ein DNS-Server ist daher ein besonders lohnendes Ziel für Angreifer, da ein erfolgreicher Angriff dazu führen kann, dass Benutzer zu falschen oder bösartigen Seiten umgeleitet werden. Die Sicherung eines DNS-Servers ist somit von höchster Priorität für jeden Systemadministrator.
In diesem Blog-Beitrag lernst du, wie du deinen DNS-Server unter Linux mit BIND9 sicherst, welche Bedrohungen bestehen und welche Best Practices du befolgen solltest, um deinen DNS-Server gegen Angriffe zu schützen.
Bedrohungen für DNS-Server
Bevor wir uns der Sicherung widmen, ist es wichtig, die gängigen Angriffsvektoren auf DNS-Server zu verstehen:
- DNS Spoofing (Cache Poisoning): Bei einem DNS-Spoofing-Angriff wird der Cache des DNS-Servers manipuliert, sodass falsche IP-Adressen zurückgegeben werden, was zu Phishing oder bösartigen Websites führen kann.
- DDoS-Angriffe (Distributed Denial of Service): Angreifer versuchen, durch das Überfluten des DNS-Servers mit Anfragen, die Dienste lahmzulegen.
- DNS Amplification: Eine Art von DDoS-Angriff, bei dem DNS-Server missbraucht werden, um die Angriffe auf andere Ziele zu verstärken.
- Unberechtigte Zonentransfers: Angreifer könnten versuchen, über Zonentransfers die DNS-Daten eines Servers abzufangen, um so Informationen über das Netzwerk zu gewinnen.
- Kompromittierte DNS-Server-Konfiguration: Schwachstellen in der DNS-Konfiguration oder falsche Berechtigungen könnten ausgenutzt werden, um die DNS-Serverfunktion zu beeinträchtigen.
Schritte zur Sicherung eines DNS-Servers unter Linux
1. BIND9 auf dem neuesten Stand halten
Einer der wichtigsten ersten Schritte bei der Sicherung eines DNS-Servers ist sicherzustellen, dass du die neueste Version von BIND9 oder der von dir verwendeten DNS-Software installiert hast. Aktualisierungen schließen oft sicherheitsrelevante Schwachstellen und sollten regelmäßig durchgeführt werden.
Für Debian/Ubuntu-Systeme:
sudo apt update
sudo apt upgrade bind9
Für Red Hat/CentOS-Systeme:
sudo yum update bind
2. DNSSEC aktivieren
DNSSEC (Domain Name System Security Extensions) schützt vor DNS-Spoofing und Cache Poisoning, indem es kryptografische Signaturen verwendet, um die Authentizität der DNS-Daten sicherzustellen.
Um DNSSEC in BIND9 zu aktivieren, musst du in der Datei /etc/bind/named.conf.options
den Parameter dnssec-validation
auf auto
setzen:
sudo nano /etc/bind/named.conf.options
Füge die folgenden Optionen hinzu oder bearbeite sie:
options {
directory "/var/cache/bind";
dnssec-validation auto;
// Optional: Forwarder hinzufügen, falls gewünscht
forwarders {
8.8.8.8; // Google DNS
1.1.1.1; // Cloudflare DNS
};
listen-on-v6 { any; };
};
Speichere die Datei und starte BIND9 neu:
sudo systemctl restart bind9
DNSSEC stellt sicher, dass DNS-Einträge kryptografisch signiert werden und nur authentische Informationen weitergegeben werden. Dies schützt vor Manipulationen der DNS-Daten.
3. Zonentransfers beschränken
Ein unkontrollierter Zonentransfer kann es einem Angreifer ermöglichen, die DNS-Daten einer Domain auszulesen und somit wertvolle Informationen über die Struktur deines Netzwerks zu gewinnen. Es ist daher ratsam, Zonentransfers nur an vertrauenswürdige DNS-Server zuzulassen.
Füge in der Konfigurationsdatei /etc/bind/named.conf.local
für jede Zone, die du eingerichtet hast, den Parameter allow-transfer
hinzu, um nur bestimmte IP-Adressen für Zonentransfers zuzulassen:
sudo nano /etc/bind/named.conf.local
Beispiel:
bazone "example.com" {
type master;
file "/etc/bind/db.example.com";
allow-transfer { 192.168.1.2; }; # Nur der DNS-Slave auf 192.168.1.2 darf Zonentransfers durchführen
};
Auf diese Weise verhinderst du unberechtigte Zonentransfers. Starte BIND9 nach der Änderung neu:
sudo systemctl restart bind9
4. Zugriff auf den DNS-Server einschränken
Um sicherzustellen, dass dein DNS-Server nur Anfragen aus vertrauenswürdigen Netzwerken akzeptiert, kannst du den Zugriff auf den DNS-Dienst einschränken. Dies kann insbesondere nützlich sein, wenn dein Server nur für interne Netzwerke oder bestimmte Clients zur Verfügung stehen soll.
In der Datei /etc/bind/named.conf.options
kannst du den Parameter listen-on
verwenden, um den DNS-Dienst nur auf bestimmten Schnittstellen oder IP-Adressen zu lauschen:
sudo nano /etc/bind/named.conf.options
Füge Folgendes hinzu:
options {
directory "/var/cache/bind";
listen-on { 127.0.0.1; 192.168.1.10; }; # DNS-Anfragen nur auf localhost und einer bestimmten internen IP annehmen
listen-on-v6 { none; }; # IPv6 deaktivieren, falls nicht benötigt
allow-query { 192.168.1.0/24; }; # Nur Anfragen aus dem lokalen Netzwerk zulassen
};
Mit dieser Konfiguration werden nur Anfragen vom lokalen Netzwerk (192.168.1.x) oder von localhost akzeptiert. Externe DNS-Anfragen werden blockiert.
5. Rate Limiting konfigurieren
Um deinen DNS-Server vor DDoS-Angriffen oder Brute-Force-Angriffen zu schützen, kannst du Rate Limiting aktivieren. Dies begrenzt die Anzahl der DNS-Anfragen, die innerhalb eines bestimmten Zeitraums verarbeitet werden, und schützt den Server vor Überlastung.
In BIND9 kannst du Rate Limiting mit der Option rate-limit
konfigurieren. Füge diese in der Datei /etc/bind/named.conf.options
hinzu:
sudo nano /etc/bind/named.conf.options
Füge die folgende Zeile hinzu:
rate-limit {
responses-per-second 10; # Maximal 10 Antworten pro Sekunde
};
Speichere die Datei und starte den DNS-Server neu:
sudo systemctl restart bind9
Durch die Konfiguration von Rate Limiting schützt du deinen Server vor einer Überflutung durch zu viele Anfragen in kurzer Zeit.
6. Logging und Überwachung aktivieren
Überwachung und Protokollierung sind entscheidend, um verdächtige Aktivitäten auf deinem DNS-Server zu erkennen. Stelle sicher, dass du Protokolle aktivierst, um DNS-Anfragen und Serverereignisse zu überwachen.
BIND9 bietet eine flexible Möglichkeit, Logging zu konfigurieren. Öffne die Datei /etc/bind/named.conf
und füge eine Protokollierungsrichtlinie hinzu:
sudo nano /etc/bind/named.conf
Füge das folgende Protokollierungs-Setup hinzu:
logging {
channel default_file {
file "/var/log/named/default.log" versions 3 size 5m;
severity info;
print-time yes;
};
category default { default_file; };
category queries { default_file; };
};
Dieses Setup protokolliert allgemeine Ereignisse sowie DNS-Anfragen in der Datei /var/log/named/default.log
. Stelle sicher, dass du die richtigen Berechtigungen setzt:
sudo mkdir /var/log/named
sudo touch /var/log/named/default.log
sudo chown bind:bind /var/log/named/default.log
Starte BIND9 neu:
sudo systemctl restart bind9
Du kannst jetzt die Protokolle überwachen, um sicherzustellen, dass keine ungewöhnlichen oder verdächtigen Aktivitäten auftreten.
7. Firewall-Regeln einrichten
Schütze deinen DNS-Server zusätzlich durch Firewall-Regeln. Verwende iptables
oder firewalld
, um den Zugriff auf Port 53 (UDP und TCP), den DNS-Port, nur für vertrauenswürdige Quellen zuzulassen.
Mit iptables
kannst du zum Beispiel folgende Regeln setzen:
sudo iptables -A INPUT -p udp --dport 53 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 53 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j DROP
sudo iptables -A INPUT -p tcp --dport 53 -j DROP
Diese Regeln erlauben DNS-Verkehr nur aus dem lokalen Netzwerk und blockieren alle anderen Anfragen.
Fazit
Die Sicherung eines DNS-Servers unter Linux erfordert eine Kombination aus regelmäßigen Software-Updates, der Konfiguration von Sicherheitsfeatures wie DNSSEC, der Begrenzung von Zonentransfers, dem Einsatz von Firewall-Regeln und der Überwachung von Aktivitäten. Wenn du diese Best Practices befolgst, kannst du deinen DNS-Server gegen eine Vielzahl von Angriffen schützen und sicherstellen, dass deine DNS-Dienste zuverlässig und sicher bleiben.