PDF-Version
Transcrição
PDF-Version
Foliensatz 8 Paketfilter Inhalt • Paketfilter/Firewall mit iptables • NAT mit iptables • iptables konfigurieren mit Puppet Paketfilter • Ein Paketfilter verarbeitet Netzwerkpakete, d.h. er entscheidet auf Grund von bestimmten Merkmalen eines Pakets und seiner Konfiguration, was mit einem Paket gemacht werden soll. Die Palette reicht dabei von annehmen oder verwerfen bis hin zur Änderungen von Informationen im Paket selbst. • Paketfilter werden z.B. zur Implementierung von Firewalls benutzt. Eine Firewall kann dabei der Sicherung eines ganzen Netzwerks (externe Firewall) oder eines einzelnen Computers dienen. • Wenn ein einzelner Computer geschützt werden soll, so wird die Paketfilter-Software auf dem Computer selbst installiert und der Administrator muss sicherstellen, dass Schadprogramme die Paketfilter nicht manipulieren. • Eine externe Firewall hat den Vorteil, dass sie vor Manipulationen besser geschützt ist und bietet, weil sie üblicherweise durch eine dezidierte Hardware implementiert ist, meist besseren Schutz und höhere Geschwindigkeit. • Es gibt verschiedene Arten, wie eine Firewall Netzwerkzugriffe unterbinden kann, z.B. durch das Sperren von bestimmten IP-Adressen (Internetschicht) oder das Sperren von bestimmten Ports oder durch anderen Informationen (Transportschicht). Paketfilter in Linux - netfilter • Die Paketfilterung in Linux wird durch das netfilter-Framework, das Teil des Linux-Kernels ist, bewerkstelligt. • Dieses Framework ermöglicht neben der zustandslosen und zustandsorientierten Paketfilterung auch Adressübersetzung (z.B. NAT), zusätzliche Paketmanipulationen (z.B. connection tracking) und Logging. • Der für uns interessante Bestandteil des netfilter-Frameworks heißt iptables. Dieser umfasst mehrere Kernelmodule, die die verschiedenen Funktionalitäten implementieren (dadurch kann das Framework leicht erweitert werden), und ein gleichheißendes Programm zur Verwaltung der Regeln. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 1 von 9 Paketfilter in Linux - netfilter - Fortsetzung • Die Implementierung der Paketfilter-Mechanismen direkt im Kernel hat den Vorteil, dass die IPPakete sehr schnell verarbeitet werden können. • Randnotiz: Der erste Paketfilter hieß ipfw, basierte auf BSD-Code und wurde 1994 implementiert. Mitte 1998 wurde dann für Linux 2.2 ein neuer Paketfilter namens ipchains eingeführt, der dann von iptables abgelöst wurde. Aber auch die Tage von iptables sind gezählt, denn diese Implementierung soll durch die schnelleren nftables abgelöst werden. Links: Homepage des netfilter-Frameworks, Fruzentux iptables Tutorial, Linux 2.4 Packet Filtering HOWTO, man iptables, man iptables-extensions. iptables - Tabellen und Ketten • Mit Hilfe des iptables-Befehls werden Filterregeln in Filterketten (chains) hinterlegt, die wiederum zu Tabellen (tables) gehören. Die Filterregeln legen fest, wie Pakete verarbeitet werden sollen. • Die standardmäßig vorhandenen /proc/net/ip_tables_names): • Tabellen sind (alle vorhandenen • filter: Die Standardtabelle, in der man allgemeine Filter hinterlegen kann. • nat: Eine spezielle Tabelle für NAT (network address translation). • mangle: Eine spezielle Tabelle für Veränderungen an Paketen. sieht man in In der Standardtabelle filter gibt es immer die folgenden drei Filterketten: • INPUT: Für Pakete, die lokal zugestellt werden sollen. • FORWARD: Für Pakete, die der Computer weiterleiten soll. • OUTPUT: Für Pakete, die lokal generiert werden. • Zusätzlich zu den diesen Ketten können auch weitere Ketten angelegt werden. • Da die Tabellen im gesicherten Speicher des Kernels hinterlegt sind, muss man die Regeln beim Start des Systems in den Kernel laden (z.B. mittles der Befehle iptables-save und iptablesrestore). iptables - Durchlaufen der Tabellen und Ketten ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 2 von 9 Achtung: Nicht alle Ketten sind eingetragen! Siehe auch: Traversing of tables and chains iptables - Filterregeln und deren Verarbeitung • In einer Filter-Kette werden die eigentlichen Regeln hinterlegt, die der Reihe nach durchgearbeitet werden. • Eine Regel besteht dabei aus einer oder mehreren Bedingungen und einem Ziel, das angibt, was mit einem passenden Paket gemacht werden soll. • • Es gibt sehr viele Bedingungen, die man verwenden kann. Meist braucht man aber nur einen kleinen Teil davon. • Ein Ziel kann entweder der Name einer Kette sein (dann werden die Regeln dieser Kette der Reihe nach abgearbeitet) oder ein spezielles Ziel (ACCEPT, DROP, …). Passen alle Bedingungen einer Regel auf ein Paket, so wird diese Regel angewandt und zu dem in der Regel definierten Ziel gesprungen. Falls eine Regel nicht passt, wird die nächste Regel in der Kette probiert. Passen alle Regeln einer Kette nicht, so wird zum Standardziel der Kette (chain policy, nur für eingebaute Ketten) gesprungen. iptables - Chain Policy • Je nachdem, ob als Standardziel einer Kette ACCEPT oder DROP verwendet wird, spricht man von einem Blacklist- oder Whitelist-Filterdesign. • Verwendet man eine Blacklist, so ist grundsätzlich alles erlaubt, was nicht explizit verboten wurde. Daher ist das Standardziel ACCEPT und die Filterregeln bestimmen, welche Pakete abgelehnt werden sollen. • Im Gegensatz dazu wird bei einer Whitelist von vorne herein nichts erlaubt. D.h. das Standardziel ist DROP und die Filterregeln bestimmen, welche Pakete dennoch durchgelassen werden. • Wenn man davon ausgehen kann, dass es nur wenige, „falsche“ Pakete gibt, so eignet sich dafür eine Blacklist. Obwohl der Whitelist-Ansatz meist ein wenig aufwändiger zu implementieren ist (z.B. muss für jeden neuen Dienst zumindest eine Regel hinzugefügt werden), ist er inhärent sicherer und man ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 3 von 9 hat mehr Kontrolle. iptables - Ziele • • Es gibt drei eingebaute Ziele: • ACCEPT: Paket akzeptieren. • DROP: Paket verwerfen und keine Rückmeldung an den Sender schicken. • RETURN: Aktuelle Kette verlassen und bei der nächsten Regel der vorigen Kette weitermachen. Weiters gibt es auch noch einige durch Erweiterungen verfügbare Ziele: • LOG: Informationen zum Paket in das Kernel-Log schreiben. Achtung: Es wird bei der nächsten Regel weitergemacht! • REJECT: Paket verwerfen, aber zusätzlich ein Antwortpaket zurückschicken. Mittels der Option --reject-with Typ wird festgelegt, welches Antwortpaket zurückgeschickt wird, standardmäßig wird „Port nicht verfügbar“ (icmp-port-unreachable) verwendet. iptables Befehl - Allgemeines iptables, ip6tables - Administrieren der IPv4/IPv6 Paketfilter. » Das sind die Programme, mit denen man die Paketfilter im Kernel verwalten kann. Man braucht root-Rechte für das Ausführen. » Es unterstützt alle Filtermethoden, die durch Kernel-Module bereitgestellt werden, d.h. man braucht wirklich nur dieses Programm. » Alle Unterbefehle (zum Erstellen/Löschen von benutzerdefinierten Ketten und Verwalten von Ketten) sind ähnlich aufgebaut und unterstützen eine Unmenge von Optionen. Wir sehen uns die Unterbefehle der Reihe nach an. » Standardmäßig wird die filter-Tabelle benutzt. » Globale Optionen: • -t TABELLE → Die angegebene Tabelle anstatt der filter-Tabelle verwenden. • -n → Keine Namensauflösung durchführen. • -v → Detailierte Ausgabe verwenden. • --line-numbers → Zeilennummer bei Regeln anzeigen. iptables Befehl - Ketten verwalten Optionen zum Verwalten von Ketten » -L [Kette] → Anzeigen der Regeln der spezifizierten Kette oder von allen Ketten. » -N Kette → Eine neue, benutzerdefinierte Kette anlegen. » -F [Kette] → Alle Regeln der spezifizierten Kette oder aller Ketten löschen. » -X [Kette] → Die spezifizierte oder alle benutzerdefinierten Ketten löschen (dürfen keine Regeln enthalten und auch nirgends referenziert werden). » -Z [Kette] → Die Zähler der spezifizierten Kette oder aller Ketten zurücksetzen. » -P Kette Ziel → Das Standardziel der Kette definieren. » # Zurücksetzen auf den Ursprungszustand $ iptables -F $ iptables -X ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 4 von 9 $ $ $ $ iptables iptables iptables iptables -Z -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT iptables Befehl - Regeln verwalten Optionen zum Verwalten von Regeln » -A Kette Regel → Anfügen einer Regel an eine Kette. » -D Kette Regel|Zeile → Löschen einer Regel (durch Angabe der Regel oder der Zeilennummer). » -I Kette [Zeile] Regel → Einfügen der Regel in die erste oder der spezifizierten Zeile. » -R Kette Zeile Regel → Ersetzen der Regel in der spezifizierten Zeile. » -j Ziel → Spezifiziert das Ziel einer Regel. » # Einige Beispielaufrufe $ iptables -A INPUT -p tcp -j $ iptables -D INPUT -p tcp -j $ iptables -I INPUT -p tcp -j $ iptables -I INPUT -p udp -j $ iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source DROP udp -- anywhere DROP tcp -- anywhere DROP DROP # oder: iptables -D INPUT 1 DROP DROP destination anywhere anywhere iptables Befehl - Standardbedingungen Nützliche Standardbedingungen für Regeln » -p Protokoll → Angabe des Protokolls (z.B. tcp oder udp). » -i Schnittstelle → Angabe der Netzwerkschnittstelle, über die das Paket hereingekommen ist (z.B. lo oder eth0). » -o Schnittstelle → Angabe der Netzwerkschnittstelle, über die das Paket versandt werden wird. » -s Quelladresse → Angabe der Quell-IP oder des Quell-Netzes (z.B. 131.130.16.0/22). » -d Zieladresse → Angabe der Ziel-IP oder Ziel-Netzes. » Das Voranstellen eines Rufzeichens vor einer der obigen Bedingungen invertiert die Bedingung. » -m Modul → Modul für erweiterte Bindungen verwenden. » # $ # $ Alle Pakete iptables -A Alle Pakete iptables -A wegwerfen, außer die von einem bestimmten Netz INPUT ! -s 131.130.16.0/22 -j DROP an eine bestimmte IP wegwerfen OUTPUT -o eth0 -d 131.130.16.5 -j DROP iptables Befehl - Bedingungen für TCP/UDP/ICMP Zusätzliche Bedingungen für TCP/UDP/ICMP » -m tcp → Bedingungen für TCP-Pakete (wenn -p tcp) • --sport Port → Quellport • --dport Port → Zielport • --tcp-flags Maske Vergleich → Betrachtet alle über „Maske“ festgelegten Flags; alle in „Vergleich“ gelisteten müssen gesetzt sein, die anderen fehlen. • --syn → Paket, bei dem das SYN-Flag gesetzt und RST-, ACK- und FIN-Flags nicht gesetzt sind (erstes Paket bei Verbindungsaufbau) » -m udp → Bedingungen für UDP-Pakete (wenn -p udp) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 5 von 9 • --sport Port → Quellport • --dport Port → Zielport » -m icmp/icmp6 → Bedingungen für ICMP(v6)-Pakete (wenn -p icmp(6)) • --icmp-type Typ, --icmpv6-type Typ → ICMP(v6)-Pakete des angegebenen Typs » # Das erste Paket einer TCP-Verbindung akzeptieren $ iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j ACCEPT # äquivalent zu: --syn # Alle Pakete an TCP-Port 80 zulassen $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables Befehl - Bedingungen für den Verbindungsstatus Zusätzliche Bedingungen für den Verbindungsstatus » Wie anfangs erwähnt, kann in Filterregeln der Zustand einer Verbindung berücksichtigt werden. Hinweis: Der Befehl conntrack aus dem gleichnamigen Paket erlaubt das Anzeigen der aktuell verfolgten Verbindungen. » -m state → Bedingungen für Verbindungsstatus • --state Status[,Status,...] → Verbindungsstatus muss einem der Werte entsprechen. Mögliche Werte: • NEW → Paket baut eine neue Verbindung auf. • ESTABLISHED → Paket gehört zu einer aufgebauten Verbindung. • RELATED → Paket hat eine neue Verbindung aufgebaut, steht aber in Beziehung zu einer bereits aufgebauten Verbindung (z.B. Datentransfer bei FTP). • INVALID → Paket gehört zu keiner bekannten Verbindung. » # Alle Pakete, die zu einer aufgebauten Verbindung gehören, zulassen $ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables - Beispielkonfiguration # Pakete von der lokalen Schnittstelle werden immer akzeptiert $ iptables -A INPUT -i lo -j ACCEPT # Pakete von aufgebauten Verbindungen werden erlaubt $ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Pakete zum Verbindungsaufbau an den OpenSSH-Server sind erlaubt $ iptables -A INPUT -p tcp -m tcp --dport 22 --syn -j ACCEPT # $ $ $ Standardziele der Ketten zum Abschluss sinnvoll setzen iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables - IP-Forwarding • Der Linux-Kernel kann, wie auch in der Grafik zu Beginn gezeigt, Pakete von einer Schnittstelle an eine andere weiterleiten. Dazu muss aber der sysctl-Wert net.ipv4.ip_forward = 1 sein. • Die zur Weiterleitung bestimmten Pakete können dann in der FORWARD-Kette gefiltert werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 6 von 9 • Beispiel: # Erlauben des Weiterleitens von Paketen, die an Port 22 gehen $ iptables -A FORWARD -p tcp --dport 22 -j ACCEPT iptables - NAT • Network Address Translation (NAT) wird verwendet, um einen Addressbereich auf einen anderen abzubilden. Dies wird z.B. oft bei WLAN-Routern benutzt, um viele private IP-Adressen hinter einer öffentlichen zu verbergen. • Man unterscheidet zwischen Source NAT (SNAT) und Destination NAT (DNAT). Mit Hilfe von SNAT kann die Quelladresse/der Quellport, mit Hilfe von DNAT die Zieladresse/der Zielport eines Pakets verändert werden. • Unter Linux wird NAT mittels iptables eingerichtet. Dafür gibt es eine eigene nat-Tabelle mit den folgenden Standardketten: • PREROUTING: Zur Verarbeitung, sobald die Pakete von Netzwerk hereinkommen. • INPUT: Zur Verarbeitung von lokal zugestellten Paketen. • OUTPUT: Zur Verarbeitung von lokal erzeugten Paketen. • POSTROUTING: Zur Verarbeitung, bevor die Pakete ins Netzwerk gehen. iptables - NAT - Fortsetzung • Weiters gibt es drei spezielle Ziele: • SNAT: Für SNAT, nur gültig in den POSTROUTING- und INPUT-Ketten Mit --to-source [ipaddr][:port] kann die Quelladresse/der Quellport angegeben werden. SNAT wird z.B. benutzt, um viele IP-Adressen hinter einer zu verbergen. • DNAT: Für DNAT, nur gültig in den PREROUTING- und OUTPUT-Ketten. Mit --to-destination [ipaddr][:port] kann die Zieladresse/der Zielport angegeben werden. DNAT wird oft zum Weiterleiten von Ports verwendet, d.h. ein Computer kann damit eingehende Verbindungen an einen gewissen Port an einen anderen Computer weiterleiten: $ iptables -t nat -A PREROUTING -p tcp --dport 12299 -j DNAT --to-destination 10.10.10.199:22 • MASQUERADE: Nur gültig in der POSTROUTING-Kette. Dieses Ziel ist eine Variante von SNAT, die automatisch die Quelladdresse der Netzwerkschnittstelle benutzt, über die das Paket verschickt wird. Dies ist vor allem für Netzwerkschnittstellen ohne statische IP-Adressen nützlich. $ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j MASQUERADE iptables - Konfiguration mit Puppet • Um iptables mit Puppet zu verwalten, verwendet man am besten das puppetlabs/firewall Modul. Dieses erlaubt die Nutzung aller iptables-Befehle, um den Packetfilter zu konfigurieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 7 von 9 • Die Regeln werden automatisch durch Benutzung des Pakets iptables-persistent dauerhaft gespeichert. • Zuerst konfiguriert man das System so, dass alle nicht von Puppet verwalteten Regeln gelöscht werden: resources {'firewall': purge => true, } • Bei den Regeln, die über die Ressource firewall definiert werden, muss man im Namen am Anfang eine Zahl angeben, welche benutzt wird, um die Regeln zu sortieren. iptables - Konfiguration mit Puppet - Fortsetzung • Anschließend erstellt man eine Grundkonfiguration, damit man bei der Aktivierung der Regeln nicht aus dem System gesperrt wird: class firewall_pre { Firewall { require => undef, } firewall { '000 Akzeptieren von ICMP-Paketen': proto => 'icmp', action => 'accept', }-> firewall { '001 Akzeptieren von Paketen von der Loopback-Schnittstelle': proto => 'all', iniface => 'lo', action => 'accept', }-> firewall { '002 Verwerfen von lokalen Paketen, die nicht auf der LoopbackSchnittstelle sind': iniface => '! lo', proto => 'all', destination => '127.0.0.1/8', action => 'reject', }-> firewall { '003 Akzeptieren von Paketen von verwandten/aufgebauten Verbindungen': proto => 'all', state => ['RELATED', 'ESTABLISHED'], action => 'accept', } } iptables - Konfiguration mit Puppet - Fortsetzung • Dann werden noch Regeln gebraucht, um die restlichen Pakete zu verwerfen: class firewall_post { firewall { '999 Verwerfen von allen Paketen: proto => 'all', action => 'drop', before => undef, } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 8 von 9 } • Der letzte Schritt ist das Aktivieren der obigen Konfiguration: Firewall { before => Class['firewall_post'], require => Class['firewall_pre'], } class { ['firewall_pre', 'firewall_post']: } class {'firewall': } iptables - Konfiguration mit Puppet - Fortsetzung • Jetzt können die eigentlichen Regeln definiert werden: firewall { "100 Pakete an den SSH-Server erlauben": proto => 'tcp', dport => 22, action => accept, } firewall { "100 DNAT zur Portweiterleitung": table => 'nat', chain => 'PREROUTING', proto => 'tcp', dport => "12299", jump => 'DNAT', todest => "10.10.10.199:22", } firewall { "100 SNAT/MASQUERADE von Paketen aus dem internen Netz": table => 'nat', proto => all, chain => 'POSTROUTING', source => '10.10.10.0/24', jump => 'MASQUERADE', } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-08 21:37 Seite 9 von 9