OpenSUSE 42.1/Firewall

Aus Hyperweb & OpenSim
Wechseln zu: Suche

Firewall einrichten

Die über Yast konfigurierbare SuseFirewall2 erzeugt eine undurchsichtige Vielzahl von Filterregeln, aber ermöglicht nicht das Schließen von Ports für vom eigenen Rechner ausgehende Verbindungen. 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 ohne Zuhilfenahme eines Tools konfiguriert. Dazu sind als Benutzer root drei Schritte erforderlich:

1) Die SuseFirewall in Yast abschalten, damit sie beim Rechnerstart nicht mehr aktiviert wird: "Sicherheit und Benutzer -> Firewall". Falls hier eine Fehlermeldung wegen fehlender Pakete erscheint, ist wahrscheinlich das Paket SuSEfirewall2 noch nicht installiert. In diesem Fall erübrigt sich das Abschalten natürlich.

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

#!/bin/bash

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

#### IPv6 Konfigurationsblock ####

# alle alten Regeln löschen
ip6tables -F

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

#### IPv4 Konfigurationsblock ####

# alle alten Regeln löschen
iptables -F

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

# spezielle Steuersignale für IPv4 Kommunikation
iptables -A INPUT -p icmp --icmp-type destination-unreachable -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 OUTPUT -p icmp -j ACCEPT

# lokalen Datenverkehr erlauben, notwendig für das Betriebssystem!
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -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

# 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

# ein- und ausgehend HTTP erlauben (für SW-Updates und Webserver)
iptables -A INPUT -i ${interface} -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 80 -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

# zentrale OpenSim Dienste
iptables -A OUTPUT -o ${interface} -p tcp --dport 8002 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 8003 -m conntrack --ctstate NEW -j ACCEPT
# Die folgenden 5 Zeilen nur für das Metropolis Grid
iptables -A OUTPUT -o ${interface} -p tcp --dport 8000 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 8001 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 8004 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 8005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o ${interface} -p tcp --dport 8006 -m conntrack --ctstate NEW -j ACCEPT
# eigener Server
iptables -A INPUT -i ${interface} -p tcp --dport 9000 -m conntrack --ctstate NEW -j ACCEPT
# eigene Regionen
iptables -A INPUT -i ${interface} -p udp --dport 9001 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -i ${interface} -p udp --dport 9002 -m conntrack --ctstate NEW -j ACCEPT
# alle fremden akzeptierten Regionen, auch Hypergrid
iptables -A OUTPUT -o ${interface} -p tcp --dport 9000:65535 -m conntrack --ctstate NEW -j ACCEPT

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

Achtung! Wenn nach einem Rechnerstart weder SuseFirewall2 läuft noch dieses Script 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.

Optional: Firewall für IPv6 öffnen

OpenSim läuft noch ausschließlich mit IPv4, aber der optionale Webserver kann bereits mit IPv6 erreicht werden, falls der Provider des Servers bereits solche neuen IP-Adressen zugeteilt hat. Bitte nicht vergessen, in der Webserver-Konfiguration die auskommentierte Zeile für IPv6 zu aktivieren.

Am Ende des "IPv6 Konfigurationsblocks" füge dafür noch folgende Zeilen in das Bash-Script ein:

# spezielle Steuersignale für IPv6 Kommunikation
ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type redirect -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT

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

# eingehend HTTP erlauben (für Webserver)
ip6tables -A INPUT -i ${interface} -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT

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



Weiter: Autostart einrichten