Raspberry Pi geschützt durch eine DMZ
Bei der Verwendung eines Computers sollte man sich immer Gedanken über die Sicherheit machen. Zwar sind Linux Systeme im Gegensatz zu Windows Systemen nicht so stark durch Viren gefährdet, herausfordern sollte man die Sache aber nicht. Problematisch sind vor allem jene Systeme, die eine Verbindung mit dem Internet benötigen (Fileserver, Mailserver, Webserver, …). Ein in der IT übliches Vorgehen ist es, zwischen Router und internes Netzwerk eine so genannte DMZ („demilitarisierte Zone„) einzuführen in der alle solchen Server stehen und die nicht unbedingt Zugriff auf die Rechner des internen Netzwerks benötigen. Diese Zone kann man über 1 bis 2 Firewalls schützen, die einzelne Verbindungen erlaubt, oder verweigert.
Raspberry Pi geschützt durch eine DMZ
Der Plan ist nun die Verbindung vom Raspberry Pi zum Router so einzuschränken, dass nur noch Port 80 und 443 durchgelassen werden. Im Fall eines Webservers kann man so von außen nur durch HTTP oder HTTPS auf den Pi zugreifen. Wer unbedingt auch den Pi von außen bedienen können muss, kann hier auch den SSH Port freigeben (22) oder besser einen anderen SSH Port definieren (zB 22356 oder ähnliches).
Konfiguration
Um den Netzwerk Verkehr zu kontrollieren brauchen wir iptables. Dafür müssen wir folgendes machen:
Zuerst müssen wir sichergehen, dass wir die aktuellsten CA (Certificate authorities) installiert haben:
sudo apt-get install ca-certificates
Als nächstes benötigen wir die IP Adresse des Routers. Außerdem müssen wir herausfinden wie der Raspberry Pi mit dem Router kommuniziert. Das geht mit dem folgenden Kommando:
ifconfig
hier ist entweder wlan0 konfiguriert und hat eine IP Adresse oder eth0. Je nachdem ob der Pi WLAN verwendet oder kabelgebunden am Router steckt. Als nächstes erstellen wir nun die Regeln für die iptable:
sudo bash -c 'iptables-save > /etc/network/iptables'
In der network interfaces Datei müssen wir noch eine Zeile hinzufügen, damit die Einstellungen auch nach dem Systemstart enthalten bleiben:
sudo nano /etc/network/interfaces
Ganz ans Ende folgende Zeile einfügen:
pre-up iptables-restore < /etc/network/iptables
Nun müssen wir die Regeln unserer Firewall definieren:
sudo nano /etc/network/iptables
Eine mögliche Konfiguration ist folgende:
*filter :INPUT DROP [23:2584] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1161:105847] -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.1.0/24 -j ACCEPT -A INPUT -s 192.168.1.1/32 -i tcp -p tcp -m tcp --dport 22 -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT
Diese Konfiguration erlaubt nur noch HTTP und HTTPS Verbindungen. Sollte man über SSH am Raspberry Pi über den Router verbunden sein, so funktioniert das danach nicht mehr. Soll man trotzdem auch weiterhin SSH über Port 22 verwenden ist diese Konfiguration besser:
*filter :INPUT DROP [7:2625] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1727:207707] -A INPUT -i lo -j ACCEPT -A INPUT -i wlan0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -i wlan0 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i wlan0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 192.168.1.0/24 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -i wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT
Wichtig ist bei beiden Konfigurationen, dass sie auf das eigene System angepasst werden. Je nachdem ob man WLAN oder die Ethernet Schnittstelle zum Netzwerk nutzt muss man entweder wlan0 oder eth0 verwenden. Bei den IP Adressen bitte die des eigenen Netzes angeben. 192.168.1.1 ist bei mir der Router.
Der letzte Schritt ist die Konfiguration der Firewall mitteilen:
sudo iptables-restore /etc/network/iptables
Man kann nun mit folgendem Kommando testen, ob die Firewall korrekt eingestellt ist:
sudo iptables-save
Die Ausgabe ist die aktuelle Firewall Konfiguration.
Probleme
Sollte man über SSH arbeiten und sich irrtümlich selbst ausgesperrt haben, dann bleibt nur noch eins: Bildschirm und Tastatur einstecken und die Firewall manuell am Raspberry Pi ändern.
Danke für diese tolle How To.
Werde ich gleich mal ausprobieren!
„Sollte man über SSH arbeiten und sich irrtümlich selbst ausgesperrt haben, dann bleibt nur noch eins: Bildschirm und Tastatur einstecken und die Firewall manuell am Raspberry Pi ändern.“
Geht einfacher:
Endweder die SD Karte irgendwo passend Mounten
oder schlichtweg die SystemConsole nutzen. (Serielle Schnittstelle) bei so Headless system vorsehen. Ist viel einfacher als das mit dem Monitor zu machen.