Stateful Packet Inspection

Dieser Artikel ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Angaben ohne ausreichenden Beleg könnten demnächst entfernt werden. Bitte hilf Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst.
Der Artikel gibt Spezialwissen wieder; es liegt auch nicht auf der Hand, wo dies nachgelesen werden kann => Belege erforderlich.

Stateful Packet Inspection (SPI; deutsch Zustandsorientierte Paketüberprüfung) ist bei Firewalls eine Paketfiltertechnik, bei der jedes Datenpaket dynamisch einer Sitzung zugeordnet wird. Der Sitzungszustand wird in die Filterentscheidung mit einbezogen, wodurch ein größeres Schutzniveau erreicht wird als es mit einer zustandslosen Paketfilterung möglich ist.

Bei dieser Technik werden die ein- und ausgehenden Datenpakete auf Internet- und Transportschicht analysiert und deren zugehöriger Sitzungszustand in einer dynamischen Zustandstabelle gespeichert. Für die Entscheidung über die Weiterleitung eines Datenpakets wird neben statischen Paketfilterregeln auch der aktuelle Sitzungszustand herangezogen.[1] So kann beispielsweise bei einem aus dem Internet erhaltenen Datenpaket berücksichtigt werden, ob bereits eine aufgebaute Verbindung zu dieser Netzwerkadresse existiert. Stateful Packet Inspection ist bei verbindungsorientierten Netzwerkprotokollen wie dem Transmission Control Protocol (TCP) am wirkungsvollsten, kann mit Einschränkungen aber auch bei verbindungslosen Protokollen wie dem User Datagram Protocol (UDP) eingesetzt werden. In Verbindung mit Deep Packet Inspection kann Stateful Packet Inspection auch auf der Anwendungsschicht angewandt werden.

Der Firewall-Hersteller Check Point nimmt für sich in Anspruch, diese Technik im Jahr 1993 erfunden zu haben.[2]

Funktionsweise

Stateful Inspection: die Eigenschaften ausgehender Datenpakete werden in einer Statustabelle gespeichert. Mit dieser werden eingehende Datenpakete verglichen

Kommuniziert ein Rechner A mit einem Rechner B über einen einfachen Paketfilter (also ohne Stateful Packet Inspection), so muss dieser in seinem Regelwerk zwei Verbindungen erlauben:

  • Quelle A nach Ziel B mit Dienst HTTP (für die Anfrage, z. B. „Schicke mir Webseite www.example.com“)
  • Quelle B nach Ziel A mit Dienst HTTP (für die Antwortpakete, in diesem Beispiel der Inhalt von www.example.com)

Dadurch ist das Regelwerk unsicherer als eigentlich nötig, da B jederzeit an A senden darf, auch wenn A gar keine Webseite angefordert hat (Bei Netfilter kann mit Hilfe des 'Sync-Flags' verhindert werden, dass B zu A eine Verbindung aufbaut).

Bei der zustandsgesteuerten Filterung (also mit Stateful Packet Inspection) wird nur eine Regel benötigt (bzw. die zweite wird über eine allgemeine Regel (ESTABLISHED/RELATED) erlaubt). Damit wird der Regelsatz wesentlich übersichtlicher:

  • Quelle A nach Ziel B

Der Paketfilter merkt sich, wenn Rechner A mit Rechner B kommuniziert, und erlaubt nur dann Antworten darauf von Rechner B an Rechner A. Rechner B kann dadurch nicht ohne Anforderung von A beginnen.

Die Regeln für Antwortpakete werden dynamisch erzeugt und nach Eintreffen der Antwort oder nach einem Timeout automatisch gelöscht.

Noch weitergehende Systeme prüfen zusätzlich, ob ein Paket zu einem bestimmten Zeitpunkt in der Kommunikation überhaupt erlaubt ist (zum Beispiel weitere Pakete schicken, obwohl der andere Teilnehmer die Kommunikation bereits abgeschlossen hat).

Stateful Inspection bei UDP-Paketen

Auf den ersten Blick sieht eine Stateful Packet Inspection bei UDP-Paketen wie ein Widerspruch aus, da UDP im Gegensatz zu TCP zustandslos arbeitet. Die meisten Implementierungen (z. B. Linux-Netfilter) behandeln UDP trotzdem als stateful, in dem Sinne, dass beim Versenden einer Anforderung per UDP für kurze Zeit eine dynamische Firewall-Regel für die Antwortpakete erzeugt wird. Im Beispiel DNS-Anfragen werden dadurch nur Antwortpakete von den Nameservern erlaubt, die man selbst gefragt hat.

Manche Programme – z. B. Skype – benutzen dies in einem als Hole Punching bezeichneten Verfahren, um durch Firewalls Punkt-zu-Punkt-Verbindungen aufzubauen. Beide Teilnehmer erfahren vom Skype-Server, auf welcher IP-Adresse und welchem Port Skype bei der Gegenseite arbeitet. Dann schicken beide ein UDP-Paket an die Gegenseite. Dort werden diese Pakete beim Eintreffen zwar verworfen, weil keine Input-Regel existiert, erzeugen aber auf der Firewall des ausgehenden Rechners eine Regel, die ab dann 'Antworten' erlaubt. Danach können beide Seiten miteinander kommunizieren. Mit TCP würde das (trivial) nicht funktionieren, da die Firewall aufgrund von Sequenznummern echte Antwortpakete erkennen kann.

Stateful Inspection bei ICMP

Wer Ping-Anfragen senden will, aber nicht auf Ping-Anfragen antworten möchte, definiert zuerst eine ausgehende Regel für ICMP, und danach eine eingehende Regel, die generell alle eingehenden Pakete zulässt, für die es bereits eine bestehende Sitzung gibt (RELATED). Die Ping-Antwort wird durchgelassen, wenn die Firewall anhand der Parameter aus dem Antwortpaket einen Zusammenhang zu der Ping-Anfrage erkennt. Dies funktioniert, obwohl es sich bei ICMP um ein verbindungsloses Protokoll handelt.

Stateful Inspection bei FTP

FTP ist problematisch. Es werden zwei Ports, 'ftp' und 'ftp-data' (21 und 20), verwendet. 'ftp' wird für die Übertragung von Kommandos verwendet, während ftp-data für Datenübertragung (Dateiinhalte oder Verzeichnisinhalte) verwendet wird. Hierbei gibt es zwei verschiedene Arten (active mode und passive mode), in welcher Richtung die Datenverbindung (ftp-data) aufgebaut wird. Im Linux-Kernel gibt es ein Kernelmodul, welches das Zusammenspiel beider Ports beherrscht.

Timeout

Sowohl TCP- als auch UDP-Verbindungen haben bei Stateful Packet Inspection immer einen zugewiesenen Timeout. Bei UDP, weil nicht erkennbar ist, wenn eine Verbindung beendet worden ist; bei TCP, weil es passieren kann, dass Verbindungen nicht ordnungsgemäß abgebaut werden. Der UDP-Timeout liegt üblicherweise im Bereich 20–40 Sekunden, bei TCP 15–60 Minuten.

Ist der Timeout nicht lang genug und werden legitime Verbindungen dadurch von der Firewall beendet, gibt es zwei Lösungsmöglichkeiten. Eine Verlängerung des Timeouts hilft zwar, erhöht aber auch den Speicherbedarf des Systems und reduziert die Sicherheit. Die bevorzugte Methode sollte daher der Einsatz von Keep-Alive-Paketen sein. Diese lassen sich in manchen Applikationen wie SSH-Clients oder auch im Betriebssystem konfigurieren.

Setzen des TCP-Keep-Alives unter Linux auf alle 120 Sekunden:

echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time

Beispiele für die Implementierung von Stateful Firewalls

Einzelnachweise

  1. William Stallings: Cryptography and Network Security: Principles and Practice. Global Edition. 8. Auflage. Pearson Education, Harlow, Vereinigtes Königreich 2023, ISBN 1-292-43748-0, S. 676 f. 
  2. Patent US5606668: System for securing inbound and outbound data packet flow in a computer network. Angemeldet am 15. Dezember 1993, veröffentlicht am 25. Februar 1997, Anmelder: Checkpoint Software Technologies Ltd., Erfinder: Gil Shwed.