Aus LinuxUser 05/2002

Paketfilter-Firewall (Seite 2)

Diese Methode ist nicht nur ziemlich weit verbreitet, sondern auch außerordentlich gefährlich: Vergisst man ein unerwünschtes Ereignis, ist es durch die Voreinstellung erlaubt. Das gilt auch für Angriffe, die man zum Zeitpunkt des Firewall-Designs noch gar nicht kennt, und das sind schließlich die eigentlich gefürchteten! (Bekannte Sicherheitslücken sollte man so möglich ohnehin korrigieren.)

Jede sinnvolle und sichere Sicherheitslösung folgt daher dem zweiten Weg: Ein unbekanntes Ereignis ist immer verboten; ein unbekanntes Paket wird nicht angenommen. Alles, was erlaubt ist, muss explizit definiert werden.

Das bringt einen riesigen Nachteil mit sich: Solange eine neu entwickelte Firewall unvollständig oder fehlerhaft ist, funktioniert der Netzwerkzugriff nicht vernünftig. Jedes neue Anwendungsprogramm, das ein neues Netzwerkprotokoll verwendet, muss in der Firewall erst einmal aktiviert werden. Für diese Mühen erhält man jedoch ein recht zuverlässig abgeschirmtes System.

Bei Linux-Firewalls werden diesen beiden Prinzipien durch Policies umgesetzt. Die im Folgenden vorzustellende Lösung verwendet eine DROP-Policy und verwirft somit alle unbekannten Pakete. Firewall-Regeln definieren wir für alle von uns verwendeten Protokolle so, dass die entsprechenden Pakete durch eine ACCEPT-Regel angenommen werden.

Kernel-Tuning

Eine ganze Reihe von Kernel-Parametern beeinflusst das Verhalten Ihres Linux-Systems im Umgang mit IP-Paketen. Streng genommen gehört das zwar nicht zur Firewall-Funktionalität; trotzdem passt es ganz gut hierher.

Diese Variablen sind über das so genannte sysctl-Interface zugänglich: Besondere Dateien in /proc/sys/net/ipv4 zeigen die aktuelle Konfiguration beziehungsweise erlauben Modifikationen. Zum Auslesen der momentan gültigen Einstellungen lassen Sie sich die Dateien mit cat anzeigen. Neue Werte speichern Sie einfach in der entsprechenden Datei ab. Im Allgemeinen aktivieren Sie ein Feature, indem Sie eine 1 in die entsprechende Datei schreiben; 0 schaltet es wieder aus.

Für uns sind folgende Einstellungen besonders wichtig:

conf/*/accept_source_route regelt den Umgang mit Paketen, deren Routing-Weg vom Absender festgelegt wurde. Diese IP-Option ist im Allgemeinen unerwünscht. (Der * steht für die einzelnen Verzeichnisse unterhalb von /proc/sys/net/ipv4/conf. Sie steuern die verschiedenen Netzwerk-Interfaces Ihres Computers und setzen Voreinstellungen. Soll eine Änderung für alle Interfaces gelten, schreiben Sie sie in alle gleichnamigen Dateien.)

  • conf/*/accept_redirects legt fest, ob Linux fremden Systemen die Änderung der eigenen Routing-Tabellen gestattet.
  • icmp_echo_ignore_broadcasts unterbindet die Reaktion auf pings, die an alle Rechner in einem Netzwerk verschickt werden. Einen Schritt weiter geht icmp_echo_ignore_all, das alle ping-Pakete ignoriert. Natürlich ließe sich ein ähnliches Verhalten erreichen, indem man entsprechende Firewall-Regeln definiert.
  • tcp_syncookies schaltet einen Schutzmechanismus ein, der einen Angriff durch unzählige gefälschte Verbindungsanfragen erschwert. * ip_forward entscheidet, ob der Kernel Pakete an andere Rechner weiterleitet oder nur als Endknoten agiert. Diese Option ist für den Aufbau eines privaten LANs mit Linux als Router wichtig.
  • icmp_ratelimit, tcp_fin_timeout, tcp_max_orphans und tcp_max_syn_backlog sind Beispiele für zusätzliche Schutzmechanismen, die in erster Linie Denial-of-Service-Angriffe erschweren, also einem Angreifer die Erschöpfung unserer Systemressourcen verwehren. Das Tuning dieser Parameter kann auch für große Serversysteme hilfreich sein.

In der Firewall könnte man die Kernel-Parameter beispielsweise mit folgendem Fragment setzen:

for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
  echo 0 >$i
done
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/tcp_syncookies

Die Netfilter-Firewall in Linux 2.4

Die folgenden Erklärungen beziehen sich ausdrücklich auf den so genannten Netfilter aus Linux 2.4. Die Kernel der 2.0- und 2.2-Serien benutzen mit IPFW (ipfwadm beziehungsweise ipchains) einen teilweise deutlich anderen Firewall-Mechanismus.

Eine Netfilter-Firewall kann drei verschiedene Tabellen verwenden: filter enthält die eigentlichen Firewall-Regeln; nat kann Absender und Empfänger von Paketen ändern; mangle erlaubt zusätzliche Modifikationen für Spezialzwecke. Praktisch alle für uns interessanten Regeln gehören in die filter-Tabelle. Da diese voreingestellt ist, werden wir sie nicht jedesmal extra angeben.

Innerhalb jeder Tabelle gibt es verschiedene Chains oder Ketten. Je nachdem, woher ein Paket kommt und wohin es geht, wird nur eine davon darauf angewendet. Abbildung 2 zeigt die Chains der filter-Tabelle, die für ein Einzelplatzsystem relevant sind. (Kasten 3 behandelt die Besonderheiten eines lokalen Netzwerks.)

Abbildung 2: Die Firewall-Chains für ein Einzelplatzsystem
Abbildung 2: Die Firewall-Chains für ein Einzelplatzsystem

Dabei durchlaufen alle Netzwerkpakete, die für den Linux-Rechner bestimmt sind, die Regeln der INPUT-Chain. IP-Pakete, die ein Programm auf dem Linux-Rechner erzeugt hat, müssen die OUTPUT-Chain passieren.

Alte Regeln weg und neue her

Beim Aufsetzen der Firewall vermeidet es Komplikationen, wenn man eventuell bereits systemseitig vorgefertigte Firewall-Konfigurationen abschaltet. Damit lautet der erste Eintrag in der Datei, in der wir die Firewall bauen

iptables -F

Anschließend sperren wir, unserer Default-Policy folgend, alles ab. Da davon der komplette Netzwerkverkehr betroffen ist, sollte man beim Erstaufruf des Firewall-Skripts direkt an der Konsole des Firewall-Rechners sitzen:

iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

Unsere erste Regel gilt dem WWW. Beim dort verwendeten HTTP baut ein Client auf unserem Computer, beispielsweise Netscape, eine Verbindung zu einem Web-Server auf. Dieser arbeitet in der Regel hinter dem Port 80. Anhand dieser Nummer erkennt die Firewall, dass es sich vermutlich um eine HTTP-Verbindung handelt.

Zum Erstellen der Regel kommt wieder der Befehl iptables zum Einsatz. Um TCP-Datenverkehr (-p tcp) an den „Destination Port“ 80 (–dport 80, in der Regel also HTTP-Server) rauszulassen (-j ACCEPT), gibt man Folgendes ein:

iptables -A OUTPUT -p tcp --sport 1024: --dport 80 -j ACCEPT

-A OUTPUT hängt die neue Regel an die OUTPUT-Chain an. –sport 1024: steht für Source Port; dieser muss in der Regel mindestens 1024 sein, aber durch den angehängten Doppelpunkt sind auch alle darüberliegenden Ports erlaubt. Jetzt können wir ein Paket an einen Web-Server schicken, allerdings kommen die Antworten noch nicht zu uns durch.

LinuxUser 05/2002 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: