TAOFirewall – Skript für iptables [Update]

Zur Absicherung unserer Server verwenden wir ein selbst geschriebenes Skript, das auf dem Progamm iptables für die Firewall des Linux-Kernels aufbaut. Die Variante, die wir für unsere Xen-Dom0s verwenden, möchten wir in diesem Beitrag vorstellen. Die jeweils aktuellste Variante findet sich bei gisthub bzw. direkt am Ende dieses Artikels, wenn man die Einbindung des JavaScript von gisthub erlaubt.

Vorsicht: Dieses Skript wurde für Xen-Dom0s entwickelt, die ihre DomUs im routed-Modus ans Netzwerk anbinden. Ob sie im bridged-Modus ebenfalls funktionieren, wurde (noch) nicht getestet. Der routed-Modus ist z.B. bei Hetzner Root-Servern notwendig.

Das Skript besteht im wesentlichen aus drei Teilen: Dem eigentlichen Skript, der Dom0-Konfigurationsdatei und den DomU-Konfigurationsdateien. Im folgenden wird angenommen, dass alle nötigen Dateien ins Heimatverzeichnis hochgeladen wurden. Die Installation des Firewallskriptes gestaltet sich auf Debian einfach:

$> sudo chown root:root firewall
$> sudo chmod 744 firewall
$> sudo mv firewall /etc/init.d/

Als nächstes wollen wir uns der Konfiguration der Firewall zuwenden. Dazu müssen wir einen Ordner taofirewall in /etc erstellen, in den wir die Dateien taofirewall.conf und Dom1.conf kopieren. Anschließend öffnen wir diese im Editor unserer Wahl, in unserem Fall vim.

$> sudo vim /etc/taofirewall/taofirewall.conf /etc/taofirewall/Dom1.conf

/etc/taofirewall/taofirewall.conf

# IP of the Dom0
SELF="192.168.2.130"
# Users which ought to be allowed to connect to certain ports
ADMIN_IPS="192.168.0.100 192.168.1.16/28"
ADMIN_PORTS="22"
# Services which need access to specific ports and which connect from
# a distinct IP
# Nagios, Munin
SERVICE_IPS="192.168.2.0/24"
SERVICE_PORTS="5666 4949"
# Ports open to all IPs
USER_PORTS=""

# Set up iptables rules for this DomUs
#
# Mind: DomUs without a configuration file and nomination right in the
# following variable will be completely blocked.
# To disable iptables for a DomU create a configuration file in
# /etc/taofirewall/, e.g. domu.conf. Then you need to define
# SELF (IP address of the DomU) and DISABLE - set the latter to "true"
VIRTUAL_MACHINES="Dom1 Dom2 Dom3"
/etc/taofirewall/Dom1.conf
# Recommended for Windows-VMs
# Default: false
DISABLE=true

# IP of the DomU
SELF="192.168.2.131"
# Users which ought to be allowed to connect to certain ports
ADMIN_IPS="192.168.0.100 192.168.1.16/28"
ADMIN_PORTS="22"
# Services which need access to specific ports and which connect from
# a distinct IP
# Nagios, Munin
SERVICE_IPS="192.168.2.0/24"
SERVICE_PORTS="5666 4949"
# Ports open to all IPs
USER_PORTS="80 443"

Die Konfigurationsdateien sollten weitgehend selbsterklärend sein, nur ein Punkt ist wichtig: Die Namen in der Variable VIRTUAL_MACHINES stehen für die Namen der Konfigurationsdateien bzw. Regelketten der einzelnen DomUs. Folglich muss die Konfigurationsdatei auch nicht Dom1.conf heißen, sondern kann fast beliebig benannt werden – wobei geraten wird, sich auf alphanumerische Zeichen, Unter- und Bindestriche zu beschränken; im Endeffekt gehen jedoch alle Beschränkungen von der Bash oder iptables aus. Dazu noch ein Beispiel:

VIRTUAL_MACHINES="vm1 blah-2 irg_end_was"

würde zum Aufruf folgender Konfigurationsdateien führen: /etc/taofirewall/vm1.conf, /etc/taofirewall/blah-2.conf und /etc/taofirewall/irg_end_was.conf. Sollte eine der Dateien nicht vorhanden sein, gibt das Skript eine Warnung aus und ignoriert die Datei beim weiteren Vorgehen.

ACHTUNG: DomUs ohne Konfigurationsdatei sind nach dem Starten der Firewall vollständig isoliert. Darum kann man die Firewall auch gezielt für einzelne DomUs deaktivieren, indem man DISABLE auf true setzt. In diesem Fall muss nur die Variable SELF zusätzlich gesetzt sein.

Sobald die Konfiguration abgeschlossen kann man die Firewall das erste Mal mittels

$> sudo /etc/init.d/firewall start

starten. Man sollte nun kontrollieren, ob die Regeln richtig übernommen wurden. Hierzu ruft man

$> iptables -L

auf. Sollten diese Regeln zutreffen, kann man die Firewall in die Bootsequenz übernehmen:

$> update-rc.d firewall defaults

Es gibt noch einige ungelöste Probleme; so entsteht beim Entfernen einer DomU-Konfigurationsdatei und anschließendem Firewallneustart eine verwaiste Regelkette, was jedoch keine weiteren Auswirkungen hat. Ein größeres Problem ist möglicherweise die fehlerhafte Isolierung der DomUs untereinander. Durch die sequenzielle Abarbeitung kann es dazu kommen, dass Regeln für später ausgelesene Konfigurationsdateien für früher abgearbeiteten DomUs ignoriert werden. Für uns ist jedoch die Abschottung nach außen hin das eigentliche Ziel, darum haben wir diesen Aspekt vorerst vernachlässigt. Eine Aktualisierung, die das Problem behebt, ist aber in Vorbereitung.

[UPDATE] Die Aktualisierung wurde eingespielt. Außerdem steht nun auch eine IPv6-Variante zur Verfügung.