Paketfilter sind ein wichtiges Element in Firewallkonzepten. Auf Linux-Systemen bildet iptables trotz moderner Alternativen auch heute noch auf vielen Systemen die Grundlage für Paketfilter. Um die Anzahl und Komplexität der Regeln möglichst gering zu halten, ist es sinnvoll, Sender und Empfänger in Sets zu gruppieren und nur diese Sets in den Regeln zu referenzieren. Der Security-Tipp in diesem Monat zeigt Ihnen die grundlegende Verwendung und erste Schritte mit IPset.
Für das Management von Paketfilter-Regeln verwenden Administratoren unterschiedliche Tools. Grafische Interfaces unterstützen häufig nur das Erstellen oder Anpassen der Regeln mit einer grafischen Eingabemaske für die einzelnen Bestandteile. Da die Regeln am Ende dieselben sind, verzichten viele Administratoren jedoch direkt auf die Nutzung grafischer Tools und verwenden entsprechende Skripte für iptables. Zwar bietet der Linux-Kernel bereits seit vielen Jahren Unterstützung für nftables, allerdings hat es sich bis heute nicht umfassend durchgesetzt. Selbst moderne Software, wie etwa Docker für den Betrieb von Microservices, verwendet weiterhin iptables für die Netzwerkkonfiguration.
Je komplexer Ihre Konfiguration von iptables wird, desto schwieriger ist es, den Überblick zu behalten. Nutzen Sie in Ihrem Unternehmen separate Subnetze für einzelne Abteilungen und benötigen Sie abteilungsübergreifend Zugriff auf bestimmte Dienste für bestimmte Personen, wächst die Menge der Regeln schnell. Um den Überblick zu behalten und Filterregeln einfacher zu gruppieren, können Sie IPset [1] verwenden.
Erweiterungen für iptables
Bereits seit Beginn der Entwicklung des Netfilter-Projekts gibt es für iptables sogenannte Match-Extensions. Die Unterstützung für einzelne Extensions können Sie in der Kernel-Konfiguration aktivieren. Bekannt sind vor allem die Conntrack-Erweiterung, die auch grundlegend für die NAT-Funktionalität ist, und die State-Erweiterung, um den Status einer Verbindung zu prüfen. Neben vielen anderen Match-Extensions können Sie etwa mit der Owner-Match-Extension Pakete anhand der User-ID des Programms filtern, das die Netzwerkpakete erzeugt hat. Mit der Limit-Erweiterung implementieren Sie eine Bandbreitenlimitierung für passende Pakete. Einige iptables-Argumente, beispielsweise die Auswahl des Protokolls, implizieren die Verwendung entsprechender Match-Extensions von iptables.
Für das Management von Paketfilter-Regeln verwenden Administratoren unterschiedliche Tools. Grafische Interfaces unterstützen häufig nur das Erstellen oder Anpassen der Regeln mit einer grafischen Eingabemaske für die einzelnen Bestandteile. Da die Regeln am Ende dieselben sind, verzichten viele Administratoren jedoch direkt auf die Nutzung grafischer Tools und verwenden entsprechende Skripte für iptables. Zwar bietet der Linux-Kernel bereits seit vielen Jahren Unterstützung für nftables, allerdings hat es sich bis heute nicht umfassend durchgesetzt. Selbst moderne Software, wie etwa Docker für den Betrieb von Microservices, verwendet weiterhin iptables für die Netzwerkkonfiguration.
Je komplexer Ihre Konfiguration von iptables wird, desto schwieriger ist es, den Überblick zu behalten. Nutzen Sie in Ihrem Unternehmen separate Subnetze für einzelne Abteilungen und benötigen Sie abteilungsübergreifend Zugriff auf bestimmte Dienste für bestimmte Personen, wächst die Menge der Regeln schnell. Um den Überblick zu behalten und Filterregeln einfacher zu gruppieren, können Sie IPset [1] verwenden.
Erweiterungen für iptables
Bereits seit Beginn der Entwicklung des Netfilter-Projekts gibt es für iptables sogenannte Match-Extensions. Die Unterstützung für einzelne Extensions können Sie in der Kernel-Konfiguration aktivieren. Bekannt sind vor allem die Conntrack-Erweiterung, die auch grundlegend für die NAT-Funktionalität ist, und die State-Erweiterung, um den Status einer Verbindung zu prüfen. Neben vielen anderen Match-Extensions können Sie etwa mit der Owner-Match-Extension Pakete anhand der User-ID des Programms filtern, das die Netzwerkpakete erzeugt hat. Mit der Limit-Erweiterung implementieren Sie eine Bandbreitenlimitierung für passende Pakete. Einige iptables-Argumente, beispielsweise die Auswahl des Protokolls, implizieren die Verwendung entsprechender Match-Extensions von iptables.
Für den Einsatz von ipset in iptables muss Ihr Kernel die ipset-Extension unterstützen. Diese finden Sie in der Kernel-Konfiguration, jedoch nicht neben all den anderen Extensions, sondern unter "QoS and/or fair queueing" in den "Networking Options". Neben den aktiven Kernel-Modulen benötigen Sie für die Nutzung von ipset noch die Userspace-Tools. Damit können Sie komfortabel Sets anlegen, IP-Adressen zu diesen hinzufügen und entfernen.
Die Tools installieren Sie mit den üblichen Mitteln Ihrer Distribution direkt aus dem Repository. Anschließend können Sie mit dem Kommando ipset wie folgt Ihr erstes Set anlegen:
ipset create internal-services hash:ip
Den Namen, hier "internal-services", können Sie frei wählen. Mit "hash:ip" geben Sie vor dem Doppelpunkt die Art der Speicherung im Kernel-Space und danach den Typen der gespeicherten Information an. Hier können Sie unterschiedliche Arten wählen, etwa die Speicherung von Adressen als Bitmap, Hashwert oder auch die Referenz von Sets selbst. Dank Hashes geschieht der Lookup innerhalb einer Regel für den Kernel sehr einfach und schnell.
Infrastruktur erfassen
Zusätzlich zu einzelnen IP-Adressen können Sie ganze Subnetze, Ports oder Netzwerkinterfaces sowie entsprechende Kombinationen beim Erstellen eines Sets mit angeben. Damit beschreiben Sie auf der einen Seite Dienste, auf die Sie den Zugriff kontrollieren möchten, aber auch Clients mit Zugriffen auf Ihre Infrastruktur auf der anderen Seite.
Wenn Sie ipset verwenden, strukturieren Sie damit implizit Ihre vorhandene Infrastruktur. Angenommen, Sie betreiben Ihre Datenbanken in einem Cluster, der über unterschiedliche Standorte verteilt ist. Für einen MySQL-Cluster etwa benötigen Sie in der einfachsten Variante zwei Nodes. Für ein hochverfügbares Setup benötigen Sie mindestens vier. Diese sind bestenfalls verteilt und befinden sich in vier unterschiedlichen Subnetzen.
Für die Cluster-Kommunikation benötigen Sie die TCP-Ports 1186, 2202 und 3306. Daher wählen wir in diesem Fall einen Set-Typen, der IP-Adressen und Portnummern akzeptiert. Dieses legen wir mit dem Namen "dbcluster" einmalig an und fügen anschließend für jede IP-Adress-Port-Kombination einen Eintrag im Set "dbcluster" hinzu:
ipset create dbcluster hash:ip,port
ipset add dbcluster <IP-Adresse>,tcp:1186
ipset add dbcluster <IP-Adresse>,tcp:2202
ipset add dbcluster <IP-Adresse>,tcp:3306
Um nun allen Servern gegenseitigen Zugriff zu ermöglichen, fügen Sie in iptables eine entsprechende Regel hinzu:
iptables -A INPUT -m set --match-set dbcluster src -m set --match-set dbcluster dst -j ACCEPT
Für die ipset-Match-Extension geben Sie mit den Argumenten "src" und "dst" an, ob die im Set enthaltenen Einträge Quelle oder Ziel eines Pakets sind. Um nur den gegenseitigen Zugriff der Cluster-Nodes zu erlauben, benötigen Sie hier zwei Matches in der Regel. Eine Kombination von "src" und "dst" in einem Match ist zwar möglich, dies entspricht dann jedoch einem logischen "Oder", was in diesem Fall nicht gewünscht ist. Um Clientzugriffe auf die Nodes des Datenbankclusters zu erlauben, können Sie nun für jeden Client eine Regel erstellen, die den Zugriff auf das Set "dbcluster" erlaubt. Einfacher ist es aber natürlich, ein weiteres Set für alle MySQL-Clients zu erstellen.
Set-Verwaltung
Um die Einträge eines Sets anzuzeigen, nutzen Sie das "list"-Kommando von ipset. Damit bekommen Sie alle vorhandenen Sets mit entsprechenden Informationen angezeigt. Wenn Sie ein Set als weitere Option mit angeben, zeigt ipset Informationen nur zum entsprechenden Set. Einen Eintrag aus dem Set entfernen Sie mit "del", etwa wie in folgendem Kommando:
ipset del dbcluster <IP-Adresse>,tcp:3306
Zum Umbenennen eines Sets verwenden Sie das rename-Argument von ipset. Dies gelingt Ihnen jedoch nicht, wenn das Set bereits in iptables-Regeln verwendet wird. Dann erhalten Sie eine Fehlermeldung von ipset mit dem Hinweis, dass das Set noch an mindestens einer Stelle referenziert wird. Um trotz aktiver Referenz ein Set mit einem anderen auszutauschen – das bietet sich zum Beispiel im Falle eines Failovers an, wenn Sie größere Teile Ihrer Infrastruktur wechseln –, wechseln Sie die Einträge eines aktuellen Sets mit dem Namen "current" mit denen des neuen Sets namens "backup" einfach mit folgendem Kommando aus:
ipset swap current backup
Regelmanagement automatisieren
Mit ipset lässt sich auch das Hinzufügen von Regeln durch iptables automatisieren. Dafür können Sie alle iptables-Möglichkeiten nutzen, um Verbindungen zu identifizieren und diese dann zu Sets hinzufügen zu lassen. Ein einfaches Beispiel wäre die Auswertung von Zugriffsversuchen und das automatische Hinzufügen zu einer Blacklist. Bleiben wir beim Beispiel Ihres MySQL-Clusters:
Angenommen, Sie erhalten Anfragen an Ports anderer Datenbanken und möchten verhindern, dass ein Angreifer hier verfügbare Datenbanken erreichen kann. Mit den folgenden Kommandos können Sie etwa alle Clients mit Verbindungsversuchen zum MongoDB-Port 27017 automatisch für den Zugriff auf Ihre MySQL-Instanzen sperren:
ipset create dbblacklist hash:ip
iptables -A INPUT -p tcp --dport 27017 -j SET --add-set dbblacklist src
iptables -A INPUT -m set --match-set dbblacklist src -j DROP
Natürlich können Sie mit "--del-set" anstelle von "--add-set" auch Einträge aus einem Set entfernen. Diesen Automatismus können Sie zum Beispiel verwenden, wenn Sie generierte Sperrlisten mit Schadsoftware-IP-Adressen nutzen. Sollte einer Ihrer internen Hosts in eine solche Sperre laufen, können Sie diesen Host damit bis zum Abschluss weiterer Prüfungen automatisch vom Zugriff auf weitere interne Ressourcen ausschließen.
Fazit
Mit Sets der ipset-Match-Extension halten Sie die Regelsätze in iptables sauber. Der Security-Tipp hat Ihnen einfache Beispiele für die Anwendung von ipset für Ihren Paketfilter gezeigt.