Eine der Hauptgründe wieso Linux zum Einsatz kommt ist das Argument, dass Linux sicherer sei, als Windows basierte Systeme. Auf die Gefahr hin dass ihr mich nun als Verräter bezeichnet behaupte ich aber, dass jedes System so sicher ist, wie man es macht.
Firewalls sind eine nette Möglichkeit um den Zugriff auf diverse Ports zu begrenzen oder gar zu unterbinden. Iptables, als Frontend für Netfilter mag vielen Administratoren und solchen die es noch werden wollen einen Schauer über den Rücken jagen, da es doch unter Umständen sehr aufwändig sein kann, diverse Regeln zu erstellen. Hier kommt Shorewall ins Spiel.
Sehen wir uns einmal an was der Entwickler Tom Eastep zu sagen hat:
The Shoreline Firewall, more commonly known as “Shorewall”, is high‐level tool for configuring Netfilter. You describe your firewall/gateway requirements using entries in a set of configuration files. Shorewall reads those configuration files and with the help of the iptables utility, Shorewall configures Netfilter to match your requirements.
Mit anderen Worten ist Shorewall das, was uns das simple konfigurieren einer Firewall ermöglicht. Wichtig dabei ist, dass im Kernel sämtliche IPTables‐Module zu bauen damit sie uns später zur Verfügung stehen. Weitere Pakete die wir brauchen sind iptables, iproute2 und natürlich Shorewall selbst.
Shorewall beheimatet die Konfigurationsdateien in /etc/shorewall, welche wir nun Stück für Stück anpassen. Ich beginne mit der Annahme, dass unser System nur eine Netzwerkkarte besitzt und einen mehr oder weniger klassischen Desktop darstellt.
Shorewall benötigt Informationen über unsere Netzwerk‐Interfaces. Eth0 ist in meinem Beispiel die einzige Netzwerkkarte. Sie bezieht ihre Adresse via DHCP und soll keine Broadcasts verstärken. Um dies zu erreichen passen wir die Datei /etc/shorewall/interfaces an:
/etc/shorewall/interfaces:
##############################################################################
ZONE INTERFACE BROADCAST OPTIONS
net eth0 detect dhcp,nosmurfs
LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE
Nun gilt es Shorewall beizubringen, was generell mit unserem Netzwerk‐Traffic passieren soll. Es soll alles verboten werden, was wir nicht explizit erlauben. Dies geschieht in den Policies.
/etc/shorewall/policy:
###############################################################################
SOURCE DEST POLICY LOG LIMIT:BURST
# LEVEL
net all DROP info# THE FOLLOWING POLICY MUST BE LAST
all all REJECT info
LAST LINE — DO NOT REMOVE
Es mag zwar jetzt alles dicht sein, jedoch ist es nicht unbedingt sinnvoll alle Ports dicht zu machen, da wir so auch uns aus dem Netz ausgegrenzt haben. Also beginnen wir ein paar Löcher aufzumachen durch die wir ganz gezielt Traffic erlauben.
/etc/shorewall/rules:
####################################################################################################
ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/
# PORT PORT(S) DEST LIMIT GROUP
ACCEPT fw net tcp 80 #http
ACCEPT fw net udp 80 #http
ACCEPT fw net tcp 443 #https
ACCEPT fw net udp 443 #https
ACCEPT fw net tcp 21 #ftp
ACCEPT fw net tcp 53 #DNS
ACCEPT fw net udp 53 #DNS
ACCEPT fw net tcp 110 #unsecure Pop3
ACCEPT fw net tcp 995 #Secure Pop3
ACCEPT fw net tcp 873 #rsync
ACCEPT fw net tcp 25 #unsecure SMTP
ACCEPT fw net tcp 465 #SMTP over SSL
ACCEPT fw net tcp 5190 #AIM/ICQ
DROP net fw tcp 23 #TELNET — wir erlauben es einfach nichtLAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE
Wer jetzt die Shorewall Scripts startet (shorewall start) wird nach Kurzem in seinem Syslog ein paar Meldungen finden, was am Netzwerk passiert ist. Um ehrlich zu sein — es ist eine Menge an Daten die da in unseren Logs landen. Mit Syslog‐NG lassen sich diese jedoch schön in ein eigenes File bannen:
destination d_shorewall{ file („/var/log/shorewall/shorewall.log“); };
filter f_shorewall { match („Shorewall“); };## /var/log/messages sauber halten
filter f_not_shorewall { not match („Shorewall“); };
## Logs entsprechend zusammenführen
log { source(src); filter (f_shorewall); destination (d_shorewall); };
## /var/log/messages sauber halten und die Shorewall‐Messages
## ausfilternlog { source(src); filter (f_not_shorewall);destination(messages); };