Eigene Cloudserver, die über die heimische Leitung ins Internet gehängt werden, sind Dank Raspberry Pi, Banana Pi & Co. gerade schwer in Mode. Systeme, die im Internet erreichbar sind, bieten eine gewisse Angriffsfläche. Eine Grundabsicherung per Firewall ist hier natürlich ein Muss. Unter Linux eignet sich hier iptables, um sowohl den IPv4 als auch IPv6 Datenverkehr zu kontrollieren. Der Einsatz einer Statefull Firewall mit iptables ist hier beschrieben: Klick
Was passiert jedoch, wenn der Cloudserver doch kompromittiert wird? Da das System in aller Regel im eigenen Netz hängt und nur Ports von außen auf das System geöffnet wurden, ist es für einen Angreifer ein Leichtes, sich Zugriff auf weitere Ressourcen im Netzwerk zu verschaffen. Abhilfe schafft hier eine DMZ (Demilitarisierte Zone). Eine DMZ trennt einen gewissen Bereich vom eigenen Netzwerk. Zugriffe vom eigenen Netz in die DMZ sind erlaubt. Zugriffe von der DMZ in das eigene Netz werden im Optimalfall komplett unterbunden. Eine detaillierte Beschreibung zum Thema DMZ gibt es bei Wikipedia: Klick Wer einen Router mit OpenWRT betreibt, kann sich eine DMZ mit einem dedizierten VLAN selbst konfigurieren. Die Basis dieser Anleitung basiert auf dem entsprechenden OpenWRT Wiki Artikel: Klick Es gibt jedoch ein paar wichtige Einstellungen, die beim Einsatz eines Cloudservers nicht fehlen dürfen. Generell sind folgende Aktionen erforderlich:
- Einrichtung eines neuen VLANs
- Neues Netzwerkinterface
- Neue Firewall Zone
- Port Forwarding um Cloudserver öffentlich erreichbar zu machen
- Diverse kleinere Konfigurationen
Als Erstes wird mit einem neuen VLAN begonnen. Damit wird der neue Netzbereich auf einen dedizierten Port am Router beschränkt. Dies ist erforderlich, um die Netze LAN und DMZ voneinander zu trennen. In der Weboberfläche Luci wird hierzu über den Menüpunkt „Switch“ ein neues VLAN hinzugefügt. Wichtig ist, dass der CPU Port auf „tagged“ und der gewünschte physische Port auf „untagged“ gesetzt wird. Alle anderen Ports können auf „off“ gesetzt werden.
Als nächstes wird für das neue VLAN ein eigenes Netzwerkinterface über den Menüpunkt „Interfaces“ mit dem Namen „DMZ“ hinzugefügt.
Die Netzwerkadresse wird auf „statisch“ gesetzt und muss sich vom internen Netz unterscheiden. Wenn das LAN z.B. auf 192.168.1.0/24 konfiguriert ist, kann für die DMZ 192.168.11.0/24 verwendet werden.
Zusätzlich wird für die DMZ noch ein eigener DHCP Server konfiguriert. In OpenWRT lässt sich für jeden Client ein statischer DHCP Eintrag hinterlegen, damit das System über DHCP immer die gleiche IP Adresse zu gewiesen bekommt.
Über den Reiter „Physical Settings“ wird das neue Interface dem neu erstellten VLAN zugeordnet. Hierbei ist darauf zu achten, dass die richtige VLAN ID ausgewählt wird!
Nachdem das VLAN und das dazugehörige Netzwerkinterface eingerichtet wurden, muss für die DMZ eine neue Firewall Zone konfiguriert werden. Die Zone mit dem Namen „DMZ“ kann über den Menüpunkt „Firewall“ angelegt werden.
Wichtig ist, dass die Regeln wie folgt gesetzt werden müssen.
INPUT = REJECT
OUTPUT = ACCEPT
FORWARD = REJECT
Die Detaileinstellungen sehen wie folgt aus. Wenn der Zugriff vom LAN in die DMZ komplett möglich sein soll, kann der Haken bei „forward to destination zones“ bei LAN gesetzt werden. Alternativ lassen sich nachträglich auch einzelne Ports konfigurieren.
Die DMZ ist jetzt erstmal in den Grundzügen fertig eingerichtet. Damit der Cloudserver auch aus dem Internet erreichbar ist, müssen die benötigten Ports geöffnet werden. Für Webapplikationen reichen die Ports 80 und 443 für http bzw. https. Alles Weitere muss individuell konfiguriert werden. In den Firewall Einstellungen lassen sich die benötigten Ports über den Reiter „Port Forwards“ öffnen.
Jetzt fehlen noch ein paar Firewall Einstellungen, damit DNS und DHCP funktionieren und dedizierte Zugriffe auf den Cloudserver gesetzt werden. Letzteres ist nur nötig, wenn in den vorherigen Einstellungen der Zugriff aus dem LAN in die DMZ nicht schon geregelt wurde. Natürlich lassen sich hier noch weitere individuelle Regeln konfigurieren.
Ab jetzt hängt das System in einem eigenen Netzsegment, welches komplett vom internen LAN getrennt ist. Sollte ein Angreifer das System übernehmen, hat er nicht automatisch Zugriff auf weitere Systeme im Netzwerk. Zugriffe von außen funktionieren jetzt auch wie gewünscht. Versucht man jedoch aus dem eigenen LAN auf z.B. den Webserver zuzugreifen wird man feststellen, dass keine Seite angezeigt werden kann. Um den Webserver über seinen Public Name „mycloud.example.com“ aus dem Internet zu erreichen, wird noch eine weitere Firewall Regel benötigt, die bei den „Custom Rules“ eingetragen werden muss. Die Regel selbst sieht wie folgt aus:
iptables -t nat -A PREROUTING -p tcp --dport 443 -d x.x.x.x -j DNAT --to 192.168.11.10
x.x.x.x ist hier die WAN IP Adresse. Die Zieladresse „192.168.11.10“ muss dem DMZ Server entsprechen. Bei privaten Anschlüssen kommt jetzt das Problem dazu, dass sich die WAN Adresse regelmäßig ändert. Damit nicht bei jedem IP Adresswechsel die Regel angepasst werden muss, wird die Adresse dynamisch per Skript ermittelt. Dazu werden bei den „Custom Rules“ folgende Zeilen eingetragen:
LAN=$(uci get network.lan.ipaddr) WAN=$(ifconfig eth0.2 | grep inet | awk '{print $2}' | awk -F 'addr:' '{print $2}') iptables -t nat -A PREROUTING -p tcp --dport 443 -d $WAN -j DNAT --to 192.168.11.10
Der Adapter „eth0.2“ muss an den eigenen WAN Adapter angepasst werden. Jetzt wird immer die aktuelle WAN IP Adresse in die Firewall Regeln eingetragen. Damit jedoch bei einem IP Wechsel automatisch die Firewall Regeln neu eingelesen werden, sind zwei weitere Aktionen erforderlich. Diese Einstellungen sind nicht über das Webinterface umsetzbar. Hierzu muss eine SSH Session auf den Router aufgebaut werden. Die erste Konfigurationsänderung besteht darin, dass die Custom Firewall Regeln auch beim einem Firewall Reload neu geladen werden. Standardmäßig passiert das nur bei einem Firewall Neustart. Dazu wird die bereits vorhandene Firewall Konfiguration angepasst.
vi etc/config/firewall
Der bereits vorhandene Eintrag mit „option path ‚/etc/firewall.user’“ wird um „option reload ‚1‘“ erweitert.
config include option path '/etc/firewall.user' option reload '1'
Dadurch werden die eigenen Firewall Regeln auch bei einem Firewall Reload neu eingelesen. Damit dies jetzt auch passiert, muss dafür gesorgt werden, dass die Firewall Regeln automatisch neu geladen werden, sobald sich die WAN IP Adresse ändert. Dazu kann ein „if-up“ Skript angelegt werden.
vi /etc/ppp/ip-up
#!/bin/sh # Reload Firewall Rules, when WAN IP changes /etc/init.d/firewall reload
Das Skript muss noch ausführbar gemacht und mit den richtigen Berechtigungen versehen werden.
chmod +x /etc/ppp/ip-up
chmod 755 /etc/ppp/ip-up
Ab jetzt wird automatisch die aktuelle WAN IP in den Firewall Regeln eingetragen, damit keine manuellen Schritte mehr notwendig sind. Für all diejenigen, die alles ohne Luci konfigurieren möchten, gibt es jetzt die erforderlichen Konfigurationen.
VLAN und Netzwerk Interface:
Hier müssen die IP Adressen und VLAN IDs an die eigenen Gegebenheiten angepasst werden.
/etc/config/network
config interface 'DMZ' option proto 'static' option ifname 'eth0.3' option ipaddr '192.168.11.1' option netmask '255.255.255.0'
config switch_vlan option device 'switch0' option vlan '3' option vid '3' option ports '0t 3'
DHCP Server:
/etc/config/dhcp
config dhcp 'DMZ' option start '100' option leasetime '12h' option interface 'DMZ' option limit '10'
Firewall Einstellungen:
Hier müssen auch die IP Adressen und Ports ggf. an die eigenen Bedürfnisse angepasst werden.
/etc/config/firewall
config zone option name 'dmz' option forward 'REJECT' option output 'ACCEPT' option network 'DMZ' option input 'REJECT'
# allow DNS requests config rule option src 'dmz' option proto 'tcpudp' option dest_port '53' option target 'ACCEPT' option name 'DMZ DNS'
# allow DHCP config rule option src 'dmz' option proto 'udp' option dest_port '67-68' option src_port '67-68' option target 'ACCEPT' option name 'DMZ DHCP'
# Open Port 80 from WAN to DMZ Host config redirect option target 'DNAT' option src 'wan' option proto 'tcp' option src_dport '80' option dest_port '80' option name 'Allow Cloud HTTP' option dest 'dmz' option dest_ip '192.168.11.10'
# Open Port 443 from WAN to DMZ Host config redirect option target 'DNAT' option src 'wan' option proto 'tcp' option src_dport '443' option dest_port '443' option name 'Allow Cloud HTTPS' option dest 'dmz' option dest_ip '192.168.11.10'
# add the option reload line, if special firewall.user rules are added config include option path '/etc/firewall.user' option reload '1'
# allow DMZ Hosts internet access config forwarding option dest 'wan' option src 'dmz'
# only needed if complete access from LAN to DMZ should be allowed config forwarding option dest 'dmz' option src 'lan'
# for example if just SSH access to a specific target withih the DMZ should be possible config rule option target 'ACCEPT' option src 'lan' option dest 'dmz' option name 'Allow LAN DMZ SSH access' option dest_port '22' option proto 'tcp'
Diese Anleitung darf gerne für eigene Zwecke veröffentlicht werden. Ich würde mich dann jedoch über eine Quellenangabe freuen, da doch recht viel Arbeit in diesem Projekt steckt. Anmerkungen, Ideen oder Verbesserungsvorschläge werden sehr gerne in den Kommentaren gesehen.