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