original in fr Vincent Renardias
fr to en Georges Tarbouriech
en to de Hermann-Josef Beckers
GNU/Linux-Benutzer seit 1993, ist Vincent Renardias seit 1996 in dessen Entwicklung involviert: Debian-Entwickler, franz�sischer �bersetzer von GIMP und GNOME, Gr�nder der Linux-Anwendergruppe in Marseille (PLUG) ... Nun Manager f�r Forschung und Entwicklung bei der Firma EFB2, tr�gt er weiterhin zu GNU/Linux bei.
Dieser Artikel wurde zuerst in einer Spezial-Ausgabe des franz�sischen Linux-Magazins ver�ffentlich, die sich auf Sicherheit konzentrierte. Der Editor, die Autoren und die �bersetzer haben LinuxFocus freundlicherweise erlaubt, jeden Artikel aus dieser Spezialausgabe zu ver�ffentlichen. Entsprechend wird LinuxFocus diese Artikel ver�ffentlichen, sobald diese ins Englische �bersetzt sind. Dank an alle Personen, die an dieser Arbeit beteiligt sind. Dieser Abstrakt wird f�r jeden Artikel reproduziert, der den gleichen Ursprung hat.
Eine der guten M�glichkeiten, Einbruchsversuche zu verhindern, ist es zu filtern, was in einem Netzwerk nutzlos ist. Diese Aufgabe wird normalerweise einer Maschine �bertragen, die als Firewall genutzt wird.
In diesem Artikel pr�sentieren wir die erforderlichen Grundlagen f�r die Implementierung und Konfiguration eines solchen Systems.
Der Filtermechanismus kann als ein Netz betrachtet werden, das einige unerw�nschte Pakete stoppt. Das Wichtigste ist es, die richtige Gr��e der Maschen zu bestimmen und den rechten Ort f�r die Installation.
Um Pakete ordnungsgem�� filtern zu k�nnen, muss der Filtermechanismus physikalisch zwischen dem zu sch�tzenden Netzwerk und dem "Rest der Welt" positioniert sein. Dies wird durch eine Maschine mit zwei Netzwerk-Karten (normalerweise Ethernet) erreicht, eine mit dem internen Netzwerk verbunden und die andere mit dem Router, der den Zugang nach aussen erm�glicht. Auf diese Art muss alle Kommunikation durch die Firewall gehen, die diese Kommunikation in Abh�ngigkeit von ihrem Inhalt blockt oder passieren l�sst.
Der Rechner mit dem Filtermechanismus kann auf drei verschiedene Arten konfiguriert werden:
- "einfaches" Gateway: dies ist die h�ufigste Konfiguration. Der Rechner wird als Gateway zwischen zwei Netzwerken oder Subnetzwerken benutzt. Die Computer im lokalen Netzwerk werden so konfiguriert, dass sie die Firewall anstelle des Routers f�r ihre Default-Route benutzen.
- "Proxy-ARP"-Gateway: die vorstehende Konfiguration impliziert die Aufteilung des Netzwerkes in zwei Subnetz-Bereiche, wobei die H�lfte der verf�gbaren IP-Adressen verloren geht. Dies ist etwas �rgerlich. Beim Beispiel eines Subnetzwerkes mit 16 Adressen (und einer 28-Bit-Netzmaske) gehen wir von 14 auf nur 6 verf�gbare Adressen, da die Netzwerk- und Broadcast-Adresse benutzt werden. Durch Hinzuf�gen eines Bits zur Subnetzmaske verringern wir von 14 auf 6 verf�gbare Adressen (8 IPs abz�glich der f�r Netzwerk und Broadcast). Wenn Sie sich es nicht leisten k�nnen, die H�lfte der verf�gbaren IP-Adressen zu verlieren, k�nnen Sie die Technik nutzen, die etwas sp�ter im Artikel erl�utert wird. Weiterhin erfordert diese Technik keine �nderung in der Netzwerk-Konfiguration der vorhandenen Maschinen, weder am Router noch an den gesch�tzten Computern.
- Ethernet-Br�cke: Installation eines Ethernet-Gateways (nicht eines IP-Gateways) macht den Filtermechanismus f�r andere Rechner unsichtbar. Eine solche Konfiguration kann vorgenommen werden, ohne den Ethernet-Schnittstellen IP-Adressen zuzuweisen. Die Maschine ist dann mittels ping, traceroute usw. nicht zu entdecken. Wir m�ssen beachten, dass eine Paketfilter-Implementation in einer solchen Konfiguration einen 2.2.x-Kernel erfordert, da die Portierung dieser Eigenschaft auf die 2.4.x-Kernel noch nicht fertig ist.
Da wir nun wissen, wo wir unseren Filter installieren, m�ssen wir definieren, was er blockieren und was akzeptieren soll.
Es gibt zwei M�glichkeiten, einen Filter zu konfigurieren:
- Die gute: Es sind nur Pakete zul�ssig, die von einer Regel akzeptiert werden.
- Die schlechte: (leider oft benutzt) nur ausdr�cklich verbotene Pakete werden blockiert, alle anderen werden akzeptiert.
Dies ist einfach zu erkl�ren: im ersten Fall f�hrt das Vergessen einer Regel dazu, dass ein Dienst nicht ordentlich oder gar nicht funktioniert. Dies f�llt normalerweise recht schnell auf und dann reicht es, die passende Regel zu aktivieren, damit wieder alles funktioniert.
Im zweiten Fall bedeutet das Vergessen einer Regel eine m�gliche Verletzbarkeit, die vielleicht schwer zu finden ist ... wenn wir sie �berhaupt finden.
Die am h�ufigsten verwendete Paketfilter-Software in Linux 2.4 ist Netfilter; es ersetzt das in Linux-Kernel 2.2 genutzte 'ipchains' recht gut. Netfilter besteht aus zwei Teilen: der Kernel-Unterst�tzung, die in Ihrem Kernel einkompiliert sein muss und dem 'iptables'-Befehl, der in Ihrem System verf�gbar sein sollte.
Ein kommentiertes Beispiel ist besser als eine lange Rede, daher beschreiben wir als n�chstes, wie man einen Filtermechanismus installiert und einrichtet. Zun�chst wird die Maschine als Gateway unter Benutzung von Proxy-ARP konfiguriert, um die Anzahl der IP-Adressen zu begrenzen und wir werden das Filtersystem einrichten.
Der Autor hat eine Vorliebe f�r die Debian-Distribution, um solch ein System einzurichten, aber jede andere Distribution ist genauso gut.
Testen Sie zuerst, ob Ihr Kernel �ber Netfilter-Unterst�tzung verf�gt. Wenn dies der Fall ist, finden Sie in den Boot-Nachrichten folgendes:
ip_conntrack (4095 buckets, 32760 max)
ip_tables: (c)2000 Netfilter core team
Andernfalls m�ssen Sie den Kernel neukompilieren, nachdem Sie die Netzfilter-Unterst�tzung aktiviert haben. Die entsprechenden Optionen finden sich im Untermen� "Netzwerk-Paketfilterung" des Men�s "Netzwerk-Optionen". Aus dem Abschnitt "Netfilter-Konfiguration" w�hlen Sie die von Ihnen ben�tigten Optionen. Im Zweifel k�nnen Sie alle aktivieren. Desweiteren ist es besser, Netfilter in den Kernel zu legen und keine Module zu benutzen. Wenn aus irgendeinem Grund eines der Netfilter-Module fehlt oder nicht geladen wird, funktioniert die Filterung nicht und wir reden besser nicht �ber die Risiken, die das impliziert.
Sie sollten auch das Paket 'iproute2' installieren (dies ist nicht obligatorisch, aber unser Beispiel benutzt es, da es uns erm�glicht, das Konfigurations-Skript einfacher zu gestalten). Mit Debian reicht der Befehl 'apt-get install iproute'.
Bei anderen Distributionen m�ssen Sie das entsprechende Paket installieren. Der �bliche Weg ist es, die Software aus den Quellen zu installieren, die Sie von der folgenden Adresse abrufen k�nnen:
ftp://ftp.inr.ac.ru/ip-routing/
Nun m�ssen die 2 Ethernet-Karten konfiguriert werden. Wir m�ssen beachten, dass der Linux-Kernel bei der Auto-Erkennung der Hardware mit der Suche nach Netzwerk-Karten aufh�rt, sobald eine gefunden wurde. Dementsprechend wird nur die erste erkannt.
Eine einfache L�sung f�r dieses Problem besteht darin, der lilo.conf-Datei folgende Zeile hinzuzuf�gen:
append="ether=0,0,eth1"
Nun m�ssen wir die Ethernet-Schnittstellen konfigurieren. Die Methode, die wir benutzen, erlaubt es uns, die gleiche IP-Adresse f�r beide Karten zu verwenden und damit eine Adresse zu sparen:
Wir nehmen an, dass wir ein 10.1.2.96/28-Subnetzwerk haben, d.h. Adressen von 10.1.2.96 bis 10.1.2.111 einschlie�lich. Der Router erh�lt die Adresse 10.1.2.97 und unser Filter-Rechner die 10.1.2.98. Die eth0-Schnittstelle wird mit dem Router �ber ein RJ45-Cross-Kabel verbunden, wenn beide ohne einen Hub/Switch direkt verbunden sind; die eth1-Schnittstelle wird mit dem Hub/Switch verbunden und von dort mit den Rechnern im lokalen Netzwerk.
Entsprechend werden beide Schinttstellen mit den folgenden Parametern konfiguriert:
Adresse : 10.1.2.98 Netzmaske : 255.255.255.240 Netzwerk : 10.1.2.96 Broadcast: 10.1.2.111 Gateway : 10.1.2.97
Als n�chstes benutzen wir das folgende Skript, das nach der Initial-Konfiguration der Netzwerk-Karten gestartet werden muss, um die Einrichtung zu beenden.
net.vars: Konfigurations-Variablen PREFIX=10.1.2 DMZ_ADDR=$PREFIX.96/28 # Schnittstellen-Definitionen BAD_IFACE=eth0 DMZ_IFACE=eth1 ROUTER=$PREFIX.97 net-config.sh: Netzwerk-Konfigurationsskript #!/bin/sh # Aktivieren Sie die n�chste Zeile, um die Befehle w�hrend der Ausf�hrung anzuzeigen # set -x # Wir lesen die definierten Variablen aus der vorherigen Datei source /etc/init.d/net.vars # Wir entfernen die aktuellen Routen aus dem lokalen Netzwerk ip route del $PREFIX.96/28 dev $BAD_IFACE ip route del $PREFIX.96/28 dev $DMZ_IFACE # Wir definieren, dass das lokale Netzwerk �ber eth1 erreicht wird # und der Router �ber eth0. ip route add $ROUTER dev $BAD_IFACE ip route add $PREFIX.96/28 dev $DMZ_IFACE # Wir aktivieren Proxy-ARP f�r beide Schnittstellen echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp # Wir aktivieren IP-Forwarding, damit die Pakete von einer Karte zur anderen # geleitet werden k�nnen. echo 1 > /proc/sys/net/ipv4/ip_forward
Wir kehren nun zum Proxy-ARP-Mechanismus zur�ck, den wir f�r unsere Konfiguration ben�tigen.
Wenn ein Rechner mit einem anderen im gleichen Netzwerk Verbindung aufnehmen m�chte, ben�tigt er dessen Ethernet-Adresse (oder MAC- oder Hardware-Adresse), die der IP-Adresse des Zielrechners entspricht. Der Quellrechner sendet dann die Frage "Wie lautet die MAC-Adresse der Schnittstelle, die die IP-Adresse 1.2.3.4 besitzt?", und der Zielrechner muss antworten.
Hier ist ein Beispiel eines solchen "Gespr�chs", mittels tcpdump aufgezeichnet:
- die Anforderung: der Rechner 172.16.6.72 fragt nach der MAC-Adresse zur IP-Adresse 172.16.6.10.
19:46:15.702516 arp who-has 172.16.6.10 tell
172.16.6.72
- die Antwort: der Rechner 172.16.6.10 teilt seine Karten-Nummer mit:
19:46:15.702747 arp reply 172.16.6.10 is-at
0:a0:4b:7:43:71
Dies bringt uns zum Ende dieser kurzen Erkl�rung: Die ARP-Anforderungen werden mittels Broadcast (Rundspruch) vorgenommen und sind daher auf ein physikalisches Netzwerk begrenzt. Entsprechend sollte die Anforderung von einer gesch�tzten Maschine, die MAC-Adresse des Routers herauszufinden, von dem Filter-Rechner geblockt werden. Die Aktivierung der Proxy-ARP-Eigenschaft erlaubt uns die L�sung dieses Problems, da die ARP Anfragen und Antworten, die zu der Karte kommen, dann weitergeleitet werden.
Zu diesem Zeitpunkt sollten Sie �ber ein funktionierendes Netzwerk verf�gen mit einem Rechner, der den gesamten Verkehr zwischen dem lokalen Netzwerk und der Au�enwelt verwaltet.
Nun m�ssen wir das Filtersystem mittels Netfilter einrichten.
Netfilter erlaubt es, direkt auf den Paketfluss zu reagieren. In der Basiskonfiguration werden die Pakete �ber 3 Regel-Ketten verwaltet:
- INPUT: f�r die �ber eine Schnittstelle hereinkommenden Pakete,
- FORWARD: f�r alle Pakete, die von einer zur anderen Schnittstelle weitergeleitet werden,
- OUTPUT: f�r die �ber eine Schnittstelle herausgehenden Pakete.
Der 'iptables'-Befehl erlaubt es, Regeln in jeder dieser Ketten hinzuzuf�gen, zu �ndern oder zu entfernen, um das Filter-Verhalten zu modifizieren.
Weiterhin hat jede Kette eine Standard-Regelung, d.h. sie weiss, was zu tun ist, wenn keine Regel in der Kette auf ein Paket zutrifft.
Die vier h�ufigsten Optionen sind:
- ACCEPT: das Paket kann passieren,
- REJECT: das Paket wird zur�ckgewiesen und das entsprechende Fehlerpaket wird gesendet (ICMP Port Unreachable, TCP RESET, je nach Fall),
- LOG: schreibt einen Paket-Hinweis in syslog,
- DROP: das Paket wird ignoriert und keine Antwort gesendet.
Hier sind die Hauptoptionen von iptables, die die Manipulation ganzer Ketten erm�glichen. Wir werden sie sp�ter noch erl�utern:
-N: erstellt eine neue Kette.
-X: entfernt eine leere Kette.
-P: �ndert die Standardregel einer Kette.
-L: listet die Regeln einer Kette auf.
-F: entfernt alle Regeln in einer Kette.
-Z: l�scht die Byte- und Paketz�hler, die die Kette durchlaufen haben.
Zum �ndern einer Kette gibt es die folgenden Befehle:
-A: f�gt eine Regel am Ende einer Kette an.
-I: f�gt eine neue Regel in einer bestimmten Position in einer Kette ein.
-R: ersetzt eine bestimmte Regel in einer Kette.
-D: l�scht eine Regel in einer Kette, entweder �ber deren Nummer oder die Beschreibung der Regel.
Ein kleines Beispiel: wir werden die PING-Antworten (das ist das ICMP-Paket 'echo-reply') blockieren, die von einer bestimmten Maschine kommen.
Zuerst testen wir, ob wir den Rechner mittels "ping" erreichen k�nnen:
# ping -c 1 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes 64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms --- 172.16.6.74 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.6/0.6/0.6 msNun f�gen wir der INPUT-Kette eine Regel hinzu, die die ICMP-Reply-Pakete ('-p icmp --icmp-type echo-reply') abf�ngt, die vom Rechner 172.16.6.74 ('-s 172.16.6.74') kommen. Diese Pakete werden ignoriert ('-j DROP').
# iptables -A INPUT -s 172.16.6.74 -p icmp --icmp-type echo-reply -j DROP
Nun PINGeln wir diesen Rechner erneut an:
# ping -c 3 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes --- 172.16.6.74 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss
Wie wir erwarten konnten, wurden diese Antworten nicht durchgelassen. Wir k�nnen �berpr�fen, dass die 3 Antworten geblockt wurden (3 Pakete mit insgesamt 252 Byte):
# iptables -L INPUT -v Chain INPUT (policy ACCEPT 604K packets, 482M bytes) pkts bytes target prot opt in out source destination 3 252 DROP icmp -- any any 172.16.6.74 anywhere
Um zur Ausgangssituation zur�ckzukehren, m�ssen wir nur die erste Regel aus der INPUT-Kette entfernen:
# iptables -D INPUT 1
Nun sollte PING wieder funktionieren:
# ping -c 1 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes 64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms --- 172.16.6.74 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.6/0.6/0.6 ms #
Es klappt!
Sie k�nnen weitere Regelketten zu den 3 vordefinierten hinzuf�gen (die Sie auf keinen Fall entfernen k�nnen) und Datenverkehr erzeugen, der diese Ketten durchl�uft. Dies kann z.B. n�tzlich sein, um doppelte Regeln in verschiedenen Ketten zu vermeiden.
Nun richten wir die erforderlichen Regeln f�r eine minimale Firewall ein. Diese wird die Dienste ssh, domain (DNS), http und smtp erlauben und sonst nichts.
Zur Vereinfachung schreiben wir die Einrichtungs-Befehle in ein Shell-Skript, um die Konfiguration zu erleichtern. Das Skript beginnt damit, die aktuelle Konfiguration zu l�schen, bevor die neue eingerichtet wird. Dieser kleine Trick erlaubt es, das Skript zu starten, wenn die Konfiguration aktiv ist, ohne doppelte Regeln zu riskieren.
rc.firewall #!/bin/sh # Verwerfen der bisherigen Regeln iptables -F iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD # Die Regelkette wird entsprechend der Richtung erstellt. # bad = eth0 (outside) # dmz = eth1 (inside) iptables -X bad-dmz iptables -N bad-dmz iptables -X dmz-bad iptables -N dmz-bad iptables -X icmp-acc iptables -N icmp-acc iptables -X log-and-drop iptables -N log-and-drop # Spezielle Regelkette zum Aufzeichnen von Paketen, bevor sie geblockt # werden iptables -A log-and-drop -j LOG --log-prefix "drop " iptables -A log-and-drop -j DROP # Pakete mit aktivierten TCP-Flags werden verworfen, ebenso diejenigen # ohne irgendwelche Flags (oft mit Nmap-Scans genutzt) iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j log-and-drop iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j log-and-drop # Pakete von reservierten Adressen werden verworfen, ebenso multicast iptables -A FORWARD -i eth+ -s 224.0.0.0/4 -j log-and-drop iptables -A FORWARD -i eth+ -s 192.168.0.0/16 -j log-and-drop iptables -A FORWARD -i eth+ -s 172.16.0.0/12 -j log-and-drop iptables -A FORWARD -i eth+ -s 10.0.0.0/8 -j log-and-drop # Zu einer bestehenden Verbindung geh�rende Pakete werden akzeptiert iptables -A FORWARD -m state --state INVALID -j log-and-drop iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # Die entsprechende Kette wird entsprechend der Paketquelle weitergeleitet iptables -A FORWARD -s $DMZ_ADDR -i $DMZ_IFACE -o $BAD_IFACE -j dmz-bad iptables -A FORWARD -o $DMZ_IFACE -j bad-dmz # Der gesamte Rest wird ignoriert iptables -A FORWARD -j log-and-drop # Akzeptierte ICMPs iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT iptables -A icmp-acc -j log-and-drop # Aussen -> Innen-Regelkette # mail, DNS, http(s) und SSH werden akzeptiert iptables -A bad-dmz -p tcp --dport smtp -j ACCEPT iptables -A bad-dmz -p udp --dport domain -j ACCEPT iptables -A bad-dmz -p tcp --dport domain -j ACCEPT iptables -A bad-dmz -p tcp --dport www -j ACCEPT iptables -A bad-dmz -p tcp --dport https -j ACCEPT iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT iptables -A bad-dmz -p icmp -j icmp-acc iptables -A bad-dmz -j log-and-drop # Innen -> Aussen-Regelkette # mail, DNS, http(s) und telnet werden akzeptiert iptables -A dmz-bad -p tcp --dport smtp -j ACCEPT iptables -A dmz-bad -p tcp --sport smtp -j ACCEPT iptables -A dmz-bad -p udp --dport domain -j ACCEPT iptables -A dmz-bad -p tcp --dport domain -j ACCEPT iptables -A dmz-bad -p tcp --dport www -j ACCEPT iptables -A dmz-bad -p tcp --dport https -j ACCEPT iptables -A dmz-bad -p tcp --dport telnet -j ACCEPT iptables -A dmz-bad -p icmp -j icmp-acc iptables -A dmz-bad -j log-and-drop # Regelketten f�r den Rechner selbst iptables -N bad-if iptables -N dmz-if iptables -A INPUT -i $BAD_IFACE -j bad-if iptables -A INPUT -i $DMZ_IFACE -j dmz-if # Externe Schnittstelle # auf diesem Rechner wird nur SSH akzeptiert iptables -A bad-if -p icmp -j icmp-acc iptables -A bad-if -p tcp --dport ssh -j ACCEPT iptables -A bad-if -p tcp --sport ssh -j ACCEPT ipchains -A bad-if -j log-and-drop # Interne Schnittstelle iptables -A dmz-if -p icmp -j icmp-acc iptables -A dmz-if -j ACCEPT
Einige Worte zur Dienst-Qualit�t ("quality of service"). Linux kann das ToS-("Type of Service")-Feld modifizieren und dessen Wert �ndern, um dem Paket eine andere Priorit�t zu geben. Z.B. �ndert der folgende Befehl die ausgehenden SSH-Pakete, um die Verbindungs-Antwortzeit zu verbessern.
iptables -A OUTPUT -t mangle -p tcp --dport ssh -j TOS --set-tos Minimize-Delay
In gleicher Weise k�nnten Sie f�r FTP-Verbindungen die Option '--set-tos Maximize-Throughput' nutzen, um die �bertragungsrate zum Nachteil der Sitzungs-Interaktivit�t zu �ndern.
Das wars. Nun kennen Sie die Grundlagen, um ein effektives Paketfilter-System aufzusetzen. Denken Sie jedoch daran, dass eine Firewall kein Allheilmittel ist, wenn es um Sicherheit geht. Er ist nur eine weitere Vorsichtsma�nahme. Die Einrichtung einer Firewall entbindet Sie nicht davon, starke Passw�rter zu nutzen, die aktuellen Sicherheits-Patches, Einbruchs-Entdeckungssysteme usw.