[ << ]
[ < ]
[ 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 |
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
# 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:
-
Erstellen Sie die Richtlinie für die Firewall, bevor Sie diese implementieren.
- Halten Sie diese einfach
-
Erlangen Sie Wissen über die Protokolle (lesen Sie das passende
RFC (Request For Comments))
-
Denken Sie daran, dass eine Firewall ein weiteres Softwarepaket ist, welches
als root ausgeführt wird.
- 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:
-
Eine Firewall kann ein Risiko in sich sein. Eine schlecht konfigurierte
Firewall ist schlechter als überhaupt keine.
-
Wie man ein grundlegendes Gateway und einen transparenten Proxy erstellt.
-
Der Schlüssel zu einer guten Firewall ist es, die Protokolle zu kennen, die
Sie zulassen wollen.
-
Dass IP-Traffic nicht immer legitime Daten beinhaltet, z.B. ein ICMP Paket mit
böswilliger Nutzlast.
- Wie man SYN Angriffen vorbeugt
-
Filtern von HTTP-Traffic indem man anstößige Bilder und das Herunterladen von
Viren verhindert.
-
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 ]
[ > ]
[ >> ]
Die Inhalte dieses Dokuments sind, sofern nicht explizit
anders genannt, unter der Creative Commons -
Namensnennung / Weitergabe Lizenz lizenziert. Die Gentoo Name and Logo
Usage Guidelines treffen zu.
|