Gentoo Logo

[ << ] [ < ] [ Hauptseite ] [ > ] [ >> ]


12. Firewalls

Inhalt:

12.a. Eine Firewall

Oftmals wird eine Firewall als die ultimative Sicherheitsmaßnahme bezeichnet - was aber falsch ist. In den meisten Fällen kann eine falsch konfigurierte Firewall ein System sogar noch unsicherer machen, als es ohne eine Firewall wäre. Eine Firewall ist auch Software und sollte genau so wie jeder andere Dienst behandelt werden, denn auch hier können Bugs vorhanden sein.

Also denken Sie nach, bevor Sie eine Firewall in Betrieb nehmen! Brauchen Sie wirklich eine? Wenn Sie der Meinung sind, dass Sie eine brauchen, dann verfassen Sie eine Richtlinie wie sie funktionieren sollte, welcher Art sie sein soll und wer sie betreiben sollte. Aber lesen Sie zuerst diesen Leitfaden.

Firewalls werden für folgende zwei Zwecke verwendet:

  • Um Benutzer (Würmer/Angreifer) draußen zu halten
  • Um Benutzer (Angestellte/Kinder) drinnen zu halten

Es gibt im Allgemeinen drei Arten von Firewalls:

  • Paketfilter
  • Circuit Relay
  • Applikationsgateway

Eine Firewall sollte auf einer dedizierten Maschine ohne weitere Dienste laufen (und wenn, dann höchstens noch sshd) und so abgesichert werden, wie dieser Leitfaden es vorschlägt.

12.b. Paketfilter

Jeglicher Netzwerkverkehr basiert auf Paketen. Große Datenmengen werden in kleinere Pakete zerlegt (da diese einfacher zu handhaben sind) und bei der Ankunft am Ziel wieder zusammengesetzt. Jedes Paket enthält im Header Informationen darüber wie es wohin transportiert werden soll. Und genau diese Informationen macht sich eine Firewall mit Paketfilter zu nutze. Filtern basiert auf:

  • Erlauben oder verbieten von Paketen entsprechend der Quell-/Ziel-IP-Adresse
  • Erlauben oder verbieten von Paketen entsprechend des Quell-/Ziel-Ports
  • Erlauben oder verbieten von Paketen entsprechend dem verwendeten Protokoll
  • Erlauben oder verbieten von Paketen entsprechend von bestimmten Einstellungen im Protokoll

Mit anderen Worten, diese Filterung basiert auf den Daten im Header eines Pakets und nicht auf dessen Inhalt.

Schwächen:

  • Adressinformationen in einem Paket könnten eine vom Sender gefälschte IP-Adresse beinhalten (oder wie wir sagen: vom Sender gespoofed sein).
  • Daten oder Anfragen im erlaubten Paket könnten ungewollte Daten enthalten die ein Angreifer zu seinen Zwecken benutzen könnte, um z.B. Schwächen in den Diensten oder hinter der Firewall auszunutzen.
  • Normalerweise kann ein Fehler die Firewall unbrauchbar machen

Vorteile:

  • Einfach und schnell zu implementieren
  • Kann Warnungen zu möglichen Angriffen liefern, bevor diese stattfinden (z.B. erkennen von Portscans).
  • Gut geeignet um SYN-Attacken zu stoppen

Beispiele für freie Paketfilter unter Linux:

Notiz: Es wird empfohlen iptables zu verwenden, da ipchains obsolet ist.

12.c. Circuit Relay

Circuit Level Gateways sind Firewalls, die Verbindungen validieren bevor die Erlaubnis für den Datenaustausch erteilt wird. Dies bedeutet, dass Pakete nicht nur aufgrund des Inhalts des Paket-Headers erlaubt oder verboten werden, sondern auch geprüft wird, ob die Verbindung an beiden Enden gültig entsprechend konfigurierbarer Regeln ist, bevor eine Sitzung geöffnet und Datenaustausch erlaubt wird. Filtern basiert auf:

  • Quell-/Zieladresse
  • Quell-/Zielport
  • Zeitraum
  • Protokoll
  • Nutzer
  • Passwort

Jeglicher Verkehr wird validiert, überwacht und ungewollter Verkehr verboten.

Schwächen:

  • Operiert auf der Transportebene und kann unter Umständen grundlegende Veränderungen in der Programmierung der Programme, die normalerweise die Transportfunktionen regeln, erfordern.

12.d. Applikationsgateway

Das Gateway auf der Applikationsebene ist ein Proxy für Anwendungen, die Daten mit einem entfernenten System im Auftrag der Clients austauscht. Es wird sicher vor der Öffentlichkeit hinter einer DMZ (De-Militarized Zone, demilitarisierte Zone: der Abschnitt eines privaten Netzwerkes, welches durch die Firewall sichtbar ist), oder einer Firewall die keine Verbindung von der Außenwelt erlaubt, geschützt. Filterung basiert auf:

  • Erlauben oder verbieten basierend auf Herkunfts/Ziel IP-Adresse
  • Basiert auf dem Paketinhalt
  • Dateizugriff abhängig von Dateityp oder -erweiterung beschränken

Vorteile:

  • Dateien können zwischengespeichert werden - das erhöht die Netzwerkleistung
  • Detaillierte Protokollierung aller Verbindungen
  • Skaliert gut (manche Proxy-Server können die zwischengespeicherten Daten teilen)
  • Kein direkter Zugriff von Außen
  • Kann den Paketinhalt sogar "on the fly" modifizieren

Schwächen:

  • Die Konfiguration ist Komplex

Applikationsgateways werden als die sicherste Lösung angesehen, da sie nicht als root laufen müssen und die Hosts dahinter aus dem Internet nicht erreichbar sind.

Beispiel eines freien Applikationsgateways:

12.e. Iptables

Um iptables zu verwenden, muss es im Kernel aktiviert werden. Ich habe sie als Module hinzugefügt (das Kommando iptables wird diese wenn benötigt laden) und den Kernel neu kompiliert (aber Sie möchten iptables eventuell einkompilieren, wenn Sie ladbare Kernelmodule, wie oben diskutiert, deaktivieren wollen). Für mehr Informationen, wie Sie Ihren Kernel für iptables konfigurieren, lesen Sie Iptables Tutorial Chapter 5: Preparations. Nachdem Sie den Kernel neu kompiliert haben (oder während der Kernel kompiliert wird) müssen Sie den iptables Befehl hinzufügen. Führen Sie einfach nur emerge iptables aus und alles sollte funktionieren.

Probieren Sie nun bitte ob alles funktioniert, indem Sie iptables -L ausführen. Wenn dies fehlschlägt, dann stimmt etwas nicht und Sie müssen die Konfiguration nochmals überprüfen.

Iptables ist der neue und extrem verbesserte Paketfilter in Linux 2.4.x. Es ist der Nachfolger von ipchains aus dem Linux 2.2.x Kernel. Eine der großen Verbesserungen ist, dass iptables nun in der Lage ist "stateful" Paketfilterung durchzuführen. Mit "stateful" Paketfilterung ist es möglich jede etablierte TCP-Verbindung im Auge zu behalten.

Eine TCP Verbindung besteht aus einer Serie von Paketen die Informationen über die Quelladresse, die Zieladresse, den Quell- und Zielport enthält, sowie eine Sequenznummer, welche das verlustfreie Zusammensetzen der Daten ermöglicht. TCP ist im Gegensatz zu UDP ein verbindungsorientiertes Protokoll, UDP stützt sich nicht auf die Verbindung.

Bei der Prüfung der Header der TCP Pakete kann ein "stateful" Paketfilter bestimmen, ob ein empfangenes TCP Paket zur einer bestehenden Verbindung gehört oder nicht und das Paket entweder akzeptieren oder verwerfen.

Mit einem "stateless" Paketfilter is es möglich, dem Paketfilter Pakete durch die Manipulation des TCP Paket Header unterzuschieben, die eigentlich verworfen werden sollten. Dies kann durch das manipulieren des SYN Flag oder anderer Flags im TCP Header erreicht werden, so dass ein böswilliges Paket wie ein Teil einer bestehenden Verbindung aussehen würde (da der Paketfilter selbst keine Überwachung der Verbindungen durchführt). Mit "stateful" Paketfiltern ist es möglich solche Pakete zu verwerfen, da Sie keiner bestehenden Verbindung zuzuordnen sind. Damit wird auch die Möglichkeit von "stealth scans" verhindert; dies ist ein Typ von Portscan, bei dem der Scanner Pakete mit Flags versendet, deren Protokollierung von einer Firewall viel unwahrscheinlicher ist, als bei gewöhnlichen SYN Paketen.

Iptables bietet einige weitere Möglichkeiten wie zum Beispiel NAT (Network Address Translation) und Wiederholungsbegrenzung (rate limiting). Letzteres ist extrem nützlich, wenn man versucht bestimmte DoS (Denial of Service) Angriffe, wie auch einen SYN-Angriff, zu verhindern.

Eine TCP-Verbindung wird durch einen sogenannten Drei-Wege-Handschlag aufgebaut. Wenn eine TCP Verbindung etabliert wird, sendet die Client-Seite ein Paket mit einem SYN Flag an den Server. Wenn die Server-Seite das SYN-Paket empfängt, antwortet sie dem Client mit einem SYN+ACK Paket. Wenn das SYN+ACK vom Client empfangen wurde, erkennt dieser wiederum mit einem dritten ACK-Paket die Verbindung an.

Ein SYN-Angriff geschieht, wenn nur ein SYN-Paket gesendet wird, aber die Antwort auf das SYN+ACK Paket ausbleibt. Der Client kann ein Paket mit einer gefälschten IP-Adresse senden, da es keine Antwort benötigt. Der Server wird beim Empfang eines SYN Paket einen Eintrag in die Warteschleife halb-geöffneter Verbindungen machen und dann auf das finalen ACK warten, bevor der Eintrag gelöscht wird. Die Warteschleife fasst nur eine begrenzte Anzahl von Einträgen, wenn alle Plätze belegt sind können keine neuen Verbindungen aufgebaut werden. Wenn das ACK nicht innerhalb eines begrenzten Zeitraums beim Server ankommt wird der Eintrag automatisch aus der Warteschleife getilgt. Die Timeout Einstellungen variieren, liegen aber generell im Bereich von 30 bis 60 Sekunden oder sogar mehr. Die Clientseite initiiert den Angriff durch das Aussenden einer größtmöglichen Zahl von SYN Paketen mit verschiedenen Quell IP-Adressen. Dadurch wird die Liste halb-geöffneter Verbindungen schnell gefüllt, so dass andere Clients davon abgehalten werden eine legitime Verbindung zu diesem Server aufzubauen.

Hier wird das Ratenlimit besonders hilfreich. Es ist möglich die Anzahl von SYN-Pakten von einer bestimmten Quelle zu begrenzen, aber durch Gebrauch von -m limit --limit 1/s begrenzt dies das Limit der SYN-Pakete für eins pro Quelle und daher begrenzt die SYN-Flut auf unsere Ressourcen.

Notiz: Eine weitere Möglichkeit SYN-Fluten vorzubeugen sind SYN cookies, welche es dem Computer erlauben auf SYN Pakete zu Antworten ohne die Verbindungswarteschleife aufzufüllen. SYN cookies können in der Linux Kernelkonfiguration aktiviert werden; z. Z. werden sie aber als experimentell angesehen.

Jetzt einiger praktischer Kram!

Wenn iptables in den Kernel geladen wird, hat es fünf Aufhänger an die Sie Ihre Regeln hängen können. Sie heißen INPUT, OUTPUT, FORWARD, PREROUTING und POSTROUTING. Diese Listen nennt man Ketten, da sie per zugefügter Regel funktionieren und überprüfen die Regeln eine nach der anderen in der Reihenfolge wie sie hinzugefügt wurden. Wenn eine Regel auf ein Paket nicht zutrifft wird es an die nächste Regel in der Kette weitergeleitet.

Sie können Regeln direkt in die fünf Hauptketten setzen oder Ketten erstellen und diese als Regel zu einer existierenden Kette hinzufügen. Iptables unterstützt die folgenden Optionen.

Option: Beschreibung:
-A Anhängen
-D Löschen
-I Einfügen
-R Ersetzen
-L Auflisten
-F Löscht alle Regeln in der Kette oder in allen Ketten
-Z Zähler auf null in der Kette oder in allen Ketten
-C Teste dieses Paket an der Kette
-N Erstellen einer neuen benutzerdefinierten Kette
-X Löschen einer benutzerdefinierten Kette
-P Richtlinie der Kette bezüglich des Ziels ändern
-E Ändern des Kettennamens
-p Protokoll
-s Quelladresse/maske
-d Zieladresse/maske
-i Eingabename (Ethernetname)
-o Ausgabename (Ethernetname)
-j Jump (Ziel für Regel)
-m Erweiterter Treffer (Kann Erweiterung benutzen)
-n Numerische Ausgabe von Adressen und Ports
-t Zu ändernde Tabelle
-v Ausführliche Ausgabe
-x Zahlen erweitern (exakte Werte anzeigen)
-f Nur auf die zweiten oder weitere Fragmente achten
-V Paketversion
--line-numbers Zeilennummern mit ausgeben

Zuerst werden wir versuchen alle ICMP-Pakete an unsere Maschine zu blocken - nur um uns mit iptables vertraut zu machen.

Befehlsauflistung 5.1: Alle ICMP-Pakete blockieren

# iptables -A INPUT -p icmp -j DROP

Zuerst legen wir die Kette fest, an die es angehängt werden soll, dann das Protokoll und schließlich das Ziel. Das Ziel kann eine vom Benutzer spezifierte Regel oder eines der speziellen Ziele ACCEPT, DROP, REJECT, LOG, QUEUE, MASQUERADE sein. In diesem Fall benutzen wir DROP, welches das Paket ohne irgendeine Antwort an den Client fallen lässt.

Notiz: Das LOG Ziel ist bekannt als "nicht-terminierend". Falls eine Regel mit dem Ziel LOG auf ein Paket zutrifft, wird dieses Paket auch weitere Regeln durchlaufen und die weitere Verarbeitung wird nicht abgebrochen. Dies erlaubt das Protokollieren von Paketen, wobei diese normal weiter verarbeitet werden.

Versuchen Sie nun ein ping localhost. Es wird nicht möglich sein eine Antwort zu bekommen, da das komplette ICMP-Protokoll eingehend geblockt wird. Es wird auch nicht möglich sein, andere Maschinen zu pingen, da die ICMP-Antwortpakete nicht mehr von den anderen Rechnern in unseren Rechner kommen können. Leeren Sie die Kette nun um ICMP wieder zum Laufen zu bekommen.

Befehlsauflistung 5.2: Alle Regeln leeren (Flush)

# iptables -F

Nun sehen wir uns die "stateful" Paketfilterung in iptables an. Wenn wir eine Prüfung bezüglich des Verbindungszustandes an eth0 haben wollen, könnten wir dies folgendermaßen aktivieren:

Befehlsauflistung 5.3: Pakete die zu einer bereits bestehenden Verbindung gehören akzeptieren

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Dies wird in der INPUT-Kette alle Pakete, die zu einer bereits bestehenden oder einer verwandten Verbindung gehören, akzeptieren. Man könnte auch jedes Paket, dass nicht in der Zustandstabelle abgedeckt wurde, fallen lassen, indem man iptables -A INPUT -i eth0 -m state --state INVALID -j DROP direkt davor aufruft. Dies aktiviert die "stateful" Paketfilterung in iptables indem es die Erweiterung "state" lädt. Wenn Sie nun anderen erlauben wollen sich mit Ihrer Maschine zu verbinden, dann könnten Sie das --state NEW Flag benutzen. Iptables enthält einige unterschiedliche Module für unterschiedliche Anwendungszwecke. Einige dieser Module sind:

Modul/Treffer Beschreibung Erweiterte Optionen
mac Passende Erweiterungen der Quell-MAC-Adressen für eingehende Pakete. --mac-source
state Prüfung auf Zustand Enables stateful inspection --state (passende Werte sind ESTABLISHED,RELATED, INVALID, NEW)
limit Trefferrate begrenzen --limit, --limit-burst
owner Prüfung auf diverse Charakteristika des Paketgenerators --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid
unclean Diverse Gültigkeitsprüfungen auf den Paketen

Lassen Sie uns nun eine benutzerdefinierte Kette erstellen und in einer der existierenden Ketten einbetten:

Befehlsauflistung 5.4: Eine benutzerdefinierte Kette erstellen

(Neue Kette mit einer Regel erstellen)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Die Standardrichtlinie sagt, dass jeglicher ausgehender Verkehr erlaubt ist, aber eingehender verboten.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(Schließlich hinzufügen zur INPUT-Kette)
# iptables -A INPUT -j mychain

Indem man die Regel in die INPUT-Kette einpasst bekommt man die Richtlinie: Alles darf raus, aber alles reinkommende wird verworfen ("gedroppt").

Man findet Dokumentation in der Netfilter/iptables Dokumentation.

Schauen wir uns nun ein komplettes Beispiel an. In diesem Falle sagt meine Firewall-/Gateway-Richtlinie:

  • Verbindungen zur Firewall wird nur über SSH erlaubt (Port 22)
  • Das lokale Netz soll Zugriff auf HTTP, HTTPS und SSH haben (DNS sollte auch erlaubt sein)
  • ICMP-Verkehr könnte kritische Daten enthalten und sollte deswegen nicht erlaubt sein. Natürlich muss gewisser ICMP-Verkehr erlaubt sein.
  • Portscans sollten erkannt und aufgezeichnet werden
  • SYN-Angriffe sollten abgewehrt werden
  • Jeglicher anderer Verkehr sollte blockiert und aufgezeichnet werden

Befehlsauflistung 5.5: /etc/init.d/firewall

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net
}

rules() {
  stop
  ebegin "Setze interne Regeln"

  einfo "Setze Standardregel auf fallenlassen"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #Standardregel
  einfo "Erstelle Zustands-Kette"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
      "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #ICMP Verkehr
  einfo "Erstelle ICMP-Kette"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Eingehender Verkehr
  einfo "Erstelle Kette für eingehenden SSH-Verkehr"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood-Schutz
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

  #Ausgehender Verkehr
  einfo "Erstelle Kette für ausgehenden SSH-Verkehr"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Erstelle Kette für ausgehenden DNS-Verkehr"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
     -j ACCEPT

  einfo "Erstelle Kette für ausgehenden http/https Verkehr"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Portscanner fangen
  einfo "Erstelle Portscan-Erkennungs-Kette"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Ungültige Zustände in den Ketten einpassen
  einfo "Passe Ketten in INPUT an"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -p icmp -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Passe Ketten in FORWARD an"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -p icmp -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Passe Ketten in OUTPUT an"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -p icmp -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  #erlaube den Clients über NAT (Network Address Translation) zu routen
  $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE
  eend $?
}

start() {
  ebegin "Starte firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} existiert nicht. Benutze Standardregeln."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Halte Firewall an"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setze Panikregeln"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Sichere Firewallregeln"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Stelle Firewallregeln wieder her"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      wird die Standardeinstellung wieder herstellen oder andernfalls zu Regeln zwingen"
  echo "stop)       alle Regeln löschen und alles akzeptieren"
  echo "rules)      Einstellungen der neuen regeln erzwingen"
  echo "save)       speichert die Regeln in ${FIREWALL}"
  echo "restore)    stellt die Regeln von ${FIREWALL} wieder her"
  echo "showstatus) Status anzeigen"
}

Einige Ratschläge für das Erstellen einer Firewall:

  1. Erstellen Sie die Richtlinie für die Firewall, bevor Sie diese implementieren.
  2. Halten Sie diese einfach
  3. Erlangen Sie Wissen über die Protokolle (lesen Sie das passende RFC (Request For Comments))
  4. Denken Sie daran, dass eine Firewall ein weiteres Softwarepaket ist, welches als root ausgeführt wird.
  5. Testen Sie die Firewall

Wenn Sie denken, dass iptables schwer zu verstehen sind oder es zu lange dauert eine sinnvolle Firewall zu erstellen, dann könnten Sie auch Shorewall benutzen. Es benutzt im Grunde genommen iptables um Firewallregeln zu erstellen, aber es konzentriert sich auf Regeln und nicht auf spezielle Protokolle.

12.f. Squid

Squid ist ein sehr leistungsstarker Proxy Server. Er kann Datenverkehr basierend auf Zeitpunkt, regulären Ausdrücken für Pfad/URI, Quell- und Zieladresse (IP), Domäne, Browser, dem authentifizierten Benutzernamen, MIME-Typ und Port (Protokoll) filtern. Wahrscheinlich habe ich einige Funktionen vergessen, aber es ist schwer die gesamte Liste abzudecken.

Im folgenden Beispiel habe ich einen Banner Filter hinzugefügt, anstatt eines Filters basierend auf pornographischen Seiten. Der Grund dafür ist, dass Gentoo.org nicht als eine pornographische Seite aufgelistet werden sollte. Außerdem will ich meine Zeit nicht damit verbringen einige "gute" Seiten für Sie zu finden.

In diesem Fall diktiert meine Richtlinie:

  • Surfen (HTTP/HTTPS) ist während der Arbeitszeiten erlaubt (Mo-Fr 8-17 und Sa 8-13), wenn Angestellte länger da sind, sollten sie arbeiten und nicht surfen.
  • Das Herunterladen von Dateien ist nicht erlaubt (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg etc.)
  • Banner sind unerwünscht, daher werden sie herausgefiltert und mit einem transparenten GIF ersetzt (hier können Sie kreativ werden!).
  • Jede andere ein- oder ausgehende Verbindung mit dem Internet ist nicht erlaubt.

Dies wird in vier einfachen Schritten implementiert.

Befehlsauflistung 6.1: /etc/squid/squid.conf

# Anbinden an eine IP und einen Port
http_port 10.0.2.1:3128

# Standardkonfiguration
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# Hinzufügen von grundlegenden Listen der Zugriffskontrolle
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

# Hinzufügen wer auf diesen Proxy Server zugreifen kann
acl localnet src 10.0.0.0/255.255.0.0

# Und welche Ports
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE

# Hinzufügen von Listen zur Zugriffskontrolle basierend
# auf regelmäßigen Ausdrücken innerhalb von URLs
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"

# Hinzufügen von Listen zur Zugriffskontrolle basierend
# auf Datum und Uhrzeit
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00

acl CONNECT method CONNECT

# Erlauben von Managmentzugriff von Localhost
http_access allow manager localhost
http_access deny manager

# Nur Purge Anfragen von Localhost erlauben
http_access allow purge localhost
http_access deny purge

# Verweigern von Anfragen an unbekannte Ports
http_access deny !Safe_ports

# Verweigern von CONNECT an alle außer SSL Ports
http_access deny CONNECT !SSL_ports

# Meine eigenen Regeln

# Hinzufügen einer Seite zur Darstellung,
# wenn ein Banner entfernt wurde
deny_info NOTE_ADS_FILTERED url_ads

# Dann diese verweigern
http_access deny url_ads

# Verweigern aller Archive
http_access deny archives

# Begrenzung des Zugriffs auf Arbeitszeiten
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends

# Verweigern von allem anderen
http_access deny all

Fügen Sie als nächstes alle Dateitypen ein, von denen Sie nicht wollen, dass Ihre Benutzer sie herunterladen können. Ich habe zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz und z Dateien gewählt.

Befehlsauflistung 6.2: /etc/squid/files.acl

\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$

Notiz: Beachten Sie bitte die [] mit Groß- und Kleinbuchstaben für jeden Buchstaben. Dies dient dazu, dass niemand es umgehen kann indem er eine Datei mit AvI abruft anstatt avi.

Als nächstes fügen wir die regulären Ausdrücke um Banner zu identifizieren ein. Sie werden wahrscheinlich viel kreativer sein als ich:

Befehlsauflistung 6.3: /etc/squid/banner-ads.acl

/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif

Nun der letzte Teil: Wir wollen diese Datei anzeigen, wenn das Banner entfernt wird. Es ist im Prinzip eine halbe HTML Datei mit einem 4x4 transparenten GIF Bild.

Befehlsauflistung 6.4: /etc/squid/errors/NOTE_ADS_FILTERED

<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>FEHLER: Die angeforderte URL konnte nicht angezeigt werden</TITLE>
</HEAD>
<BODY>
<H1>Anzeige gefiltert!</H1>

Notiz: Schließen Sie die <HTML> <BODY> Tags nicht. Dies wird von Squid erledigt.

Wie Sie sehen können hat Squid eine Vielzahl von Möglichkeiten und ist sehr effektiv zum Filtern und als Proxy. Es kann sogar alternative Squid Proxies benutzen um an sehr große Netzwerke angepasst zu werden. Die Konfiguration, die ich hier aufgelistet habe ist hauptsächlich für kleine Netzwerke mit 1-20 Benutzern geeignet.

Jedoch die Kombination von Paketfilterung (iptables) und dem Applikationsgateway (squid) ist wahrscheinlich die beste Lösung, selbst wenn Squid selber an einem sicheren Ort stationiert ist und niemand von außerhalb darauf zugreifen kann, müssen wir uns weiterhin um Angriffe von Innen Gedanken machen.

Nun müssen Sie den Proxy Server in die Einstellungen des Browsers Ihrer Benutzer einbinden. Das Gateway verhindert, dass die Benutzer jeglichen Kontakt mit der Außenwelt haben, solange sie nicht den Proxy benutzen.

Notiz: In Mozilla Firefox geschieht dies in Bearbeiten->Einstellungen->Erweitert->Netzwerk (bzw. Edit->Preferences->Advanced->Network).

Es kann auch transparent geschehen, indem man iptables benutzt um den gesamten ausgehenden Datenverkehr an einen Squid Proxy weiterzuleiten. Dies kann erreicht werden, indem man eine Weiterleitungs/Prerouting Regel für das Gateway hinzufügt:

Befehlsauflistung 6.5: Ermöglichen von Portweiterleitung an unseren Proxy Server

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128

Notiz: Falls der Proxy auf dem Rechner läuft, der auch die Paketfilterung durchführt -- auch wenn dies nicht empfohlen wird, könnte es aufgrund von Mangel an Maschinen nötig sein -- benutzen Sie ein REDIRECT Ziel anstelle von DNAT (REDIRECT leitet Pakete an localhost weiter).

12.g. Gelernte Lektionen

Wir lernten, dass:

  1. Eine Firewall kann ein Risiko in sich sein. Eine schlecht konfigurierte Firewall ist schlechter als überhaupt keine.
  2. Wie man ein grundlegendes Gateway und einen transparenten Proxy erstellt.
  3. Der Schlüssel zu einer guten Firewall ist es, die Protokolle zu kennen, die Sie zulassen wollen.
  4. Dass IP-Traffic nicht immer legitime Daten beinhaltet, z.B. ein ICMP Paket mit böswilliger Nutzlast.
  5. Wie man SYN Angriffen vorbeugt
  6. Filtern von HTTP-Traffic indem man anstößige Bilder und das Herunterladen von Viren verhindert.
  7. Kombinieren von Paketfiltern und Applikationsgateways geben eine bessere Kontrolle.

Nun, wenn Sie wirklich müssen, erstellen Sie sich eine Firewall, die ihre Bedürfnisse deckt.


[ << ] [ < ] [ Hauptseite ] [ > ] [ >> ]


Drucken

Alles ansehen

Seite aktualisiert 2. April 2010

Zusammenfassung: Filtern Sie Ihre Pakete.

Kim Nielsen
Autor

John P. Davis
Bearbeiter

Eric R. Stockbridge
Bearbeiter

Carl Anderson
Bearbeiter

Jorge Paulo
Bearbeiter

Sven Vermeulen
Bearbeiter

Benny Chuang
Bearbeiter

Sune Jeppesen
Bearbeiter

Tiemo Kieft
Bearbeiter

Zack Gilburd
Bearbeiter

Dan Margolis
Bearbeiter

Joshua Saddler
Bearbeiter

Jan Hendrik Grahl
Übersetzer

Tobias Scherbaum
Übersetzer

Matthias Geerdsen
Übersetzer

Tobias Heinlein
Übersetzer

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.