Firewall einrichten

(Zur Vertiefung siehe auch: Wiki)

Die von Canonical angebotenen Ubuntu Binärdownloads installieren standardmäßig keine Firewall. OpenSim muss im derzeitigen Entwicklungsstadium noch als unsicher eingestuft werden, denn das Suchen nach Sicherheits-Schwachstellen ist noch zweitrangig gegenüber der Implementierung und Stabilisierung der Funktionalitäten. Deshalb ist es sinnvoll, für eingeschränkte Accounts alle nicht zwingend benötigten Ports zu schließen. Dies erschwert einem Angreifer, den Server mit Hilfe nachinstallierter Software für Angriffe auf Drittrechner zu benutzen … zumindest, so lange er keine Administrator-Rechte erlangt.

Aus obigen Gründen wird in dieser Anleitung die im Linux-Kernel eingebaute Firewall konfiguriert. Dazu sind als Benutzer root zwei Schritte erforderlich:

1) Folgendes Bash-Script mit Rechten ausschließlich für root abspeichern (chmod 700), zum Beispiel im Verzeichnis /root.

Hinweis: Auf sehr minimalistischen Ubuntu-Installationen muss möglicherweise das Paket „iptables“ noch installiert werden.

Hinweis: Für SSH ist hier noch Port 22 angegeben, obwohl das im Kapitel „SSH härten“ bereits auf einen anderen Port verstellt wurde. In der Firewall muss natürlich ggf. der geänderte Port angegeben werden!

Hinweis: Der Name der Netzwerkschnittstelle ist je nach Betriebssysteminstallation unterschiedlich, er muss angepasst werden! Mit dem Kommando ip address wird er in der linken Spalte der Ausgabe angezeigt, bei mehreren Schnittstellen helfen die ebenfalls angezeigten IP-Adressen bei der Identifizierung.

#!/bin/bash

# durch den Provider vorgegebener Name der Netzwerk-Schnittstelle
interface="eth0"

#### IPv6 Konfigurationsblock ####

# alle alten Regeln löschen
ip6tables -F
ip6tables -t nat -F

# alle Ports schließen
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

# lokalen Datenverkehr erlauben, notwendig für das Betriebssystem!
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

#### IPv4 Konfigurationsblock ####

# alle alten Regeln löschen
iptables -F
iptables -t nat -F

# alle Ports schließen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# lokalen Datenverkehr erlauben, notwendig für das Betriebssystem!
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# spezielle Steuersignale für IPv4 Kommunikation
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# bereits bestehenden Verbindungen das Antworten erlauben
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

# ausgehend TCP für alle unprivilegierten Ports freigeben
iptables -A OUTPUT -o ${interface} -p tcp --dport 1024:65535 -m conntrack --ctstate NEW -j ACCEPT

# eingehend SSH erlauben, eventuell Portnummer anpassen (für Fernwartung)
iptables -A INPUT -i ${interface} -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# ausgehend DNS erlauben (für Auflösung von Domainnamen)
iptables -A OUTPUT -o ${interface} -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT

# ausgehend HTTP und HTTPS erlauben (für Software-Updates)
iptables -A OUTPUT -o ${interface} -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

# ausgehend NTP erlauben (für Zeitsynchronisation, entfällt bei virtuellen Servern)
iptables -A OUTPUT -o ${interface} -p udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT

# Hier weitere Ports nach Bedarf öffnen analog zu SSH und DNS. Jeweils anpassen:
# => Richtung "INPUT -i" (einwärts) oder "OUTPUT -o" (auswärts)
# => Protokoll "udp" oder "tcp"
# => Portnummer

# eigener Server (wie in OpenSim.ini angegeben, Default ist 9000)
iptables -A INPUT -i ${interface} -p tcp --dport 9000 -m conntrack --ctstate NEW -j ACCEPT

# eigene Regionen (wie in Regions.ini angegeben, pro Region ein Port)
iptables -A INPUT -i ${interface} -p udp --dport 9050 -m conntrack --ctstate NEW -j ACCEPT

2) Einen Aufruf des Scriptes in den Autostart einbauen (dort bereits berücksichtigt).

Eigener Server: Der Port kann in der Konfigurationsdatei OpenSim.ini frei gewählt werden, Default ist 9000. Wenn du mehrere Instanzen von OpenSim auf dem selben Rechner mit einer gemeinsamen IP-Adresse betreibst, wähle für jede Instanz einen separaten Port.

Eigene Regionen: Jede Region braucht einen eigenen UDP-Port, wie in der Regions.ini konfiguriert. Auch bei mehreren Instanzen von OpenSim auf dem selben Rechner darf es nicht zu Überschneidungen kommen.

Achtung! Wenn nach einem Rechnerstart dieses Script nicht aufgerufen wurde, dann ist der Rechner völlig ungeschützt! Deshalb ist empfehlenswert, bis zur fertigen Konfiguration auch des Autostarts möglichst außer SSH keine vom Internet zugänglichen Dienste zu starten. Und nicht vergessen, die Firewall zu testen!

Hinweis: Generell empfiehlt es sich, diese Konfiguration nur vorzunehmen, wenn ein aktuelles Backup des Gesamtsystems vorhanden ist. Starte die Firewall manuell, bevor du sie in den Autostart einbaust! Es ist durchaus möglich, sich mit Firewall-Konfigurationsfehlern endgültig aus dem System auszusperren.
Notanker: Die meisten Serververmieter bieten (nach Kundenlogin) auf den Webseiten zur Serverkonfiguration die Möglichkeit, von einem Rettungssystem zu booten. Von dort sind Korrekturen an der Konfigurationsdatei noch möglich, das Rettungssystem mountet den gemieteten Server als gewöhnliche Festplatte.

Hinweis: Wenn du außer OpenSim noch weitere Software auf dem Server betreibst, sind unter Umständen weitere Portfreigaben für die andere Software nötig. Ein gewöhnlicher Webserver zum Beispiel würde noch INPUT für die Ports 80 und 443 benötigen. Ebenfalls ist es sinnvoll IPv6 zu benutzen, wenn eine Software damit umgehen kann.


Weiter: Autostart einrichten

Nach oben