In meinen Tutorials und Projekten weise ich immer wieder auf die Gefahren und etwaige Sicherheitsrisiken beim Betrieb eines Raspberry Pi am Internet hin, da in letzter Zeit populäre Open Source Software durch mangelhafte Dokumentation und Sicherheits-Konfiguration aufgefallen ist möchte ich heute den Fokus auf den sicheren Betrieb des Raspberry Pi legen.
Inhaltsverzeichnis
Vorwort
Es gibt keinen 100% sicheren Raspberry Pi, die Vorstellung ein System einmalig abzusichern und dann für alle Zeiten sorglos betreiben zu können genau so falsch wie die Aussag „never change a running system“. Sicherheit eines Systems ist meines Erachtens immer ein Prozess und somit eine wiederkehrende Aufgabe die unter anderem auch das anpassen eines Systems nach der ersten Einrichtung erfordert. Mein Credo im privaten Bereich, also dort wo wir den RasPi hauptsächlich zum Einsatz bringen, ist: „Sicherheit durch Wissensvorsprung„.
In diesem Tutorial möchte ich euch eine Einführung zur grundsätzlichen Absicherung eures Raspberry Pi geben, abhängig davon wie euer System später genau aussieht bzw. welche Software darauf läuft müsst ihr natürlich speziell darauf zugeschnittene Vorkehrungen treffen. Anmerkungen und Vorschläge dürft ihr gerne in den Kommentaren hinterlassen.
Bedrohungen
Um einen sicheren Raspberry Pi betreiben zu können ist es von Vorteil eine Vorstellung der möglichen Bedrohungen zu haben. Was konkret wollen denn die „bösen Buben“ von meinem Raspberry Pi?
Meines Erachtens sind die wahrscheinlichsten Szenarien:
- Den Raspberry Pi als Spam schleuder zu missbrauchen
- Den Raspberry Pi als Maleware (Viren & Trojaner) schleuder zu missbrauchen
- Den Raspberry Pi als Sprungbrett für weitere illegale Aktionen missbrauchen (Identitätsdiebstahl via Proxy)
- Illegale Inhalte über euer System bzw. eure Internetleitung zu verbreiten
Themen wie Kredit Karten Betrug, Online Banking Betrug oder Phising sowie das ausspähen von Zugangs oder Identitätsdaten sind, da der Raspberry Pi meist nicht als PC-Arbeitsplatz oder Surf-Rechner verwendet wird, ehr unwahrscheinlich.
Den Raspberry Pi absichern
Da für viele unter euch der Einsatz eines speziellen „minimal Systems“, welches sich grundsätzlich am Besten zur Absicherung eignet, vermutlich nicht in Frage kommt gehe ich hier auf die grundsätzliche Absicherung eine Raspberry Pi mit Raspbian ein.
Ich gehe davon aus das ihr euer System, wie im allgemeinen üblich, wie in den Einsteiger-Tutorials beschrieben eingerichtet habt. Natürlich solltet ihr immer das aktuellste Raspbian Image verwenden.
Das Passwort des Benutzers Pi ändern
In vielen Tutorials und Anleitungen wird immer wieder die wichtigste und nächstliegendste Aktion vergessen, das Passwort des Benutzers Pi zu ändern. Führt hierzu folgenden Befehl aus
1 |
passwd |
Ändert das Passwort des Benutzers Pi in ein sicheres Passwort das Mindestens aus 8 Zeichen bestehen sollte. Achtet darauf auch Groß- und Kleinbuchstaben sowie Zahlen und/oder Sonderzeichen zu verwenden. Alternativ lässt sich das Passwort auch in der grafischen RasPi Konfiguration über „sudo raspi-config“ ändern.
Dort wo keine kritischen Daten gespeichert werden verfremde ich immer mir bekannte Wörter zu einem Passwort, zum Beispiel mein Lieblingsgetränk „Kaffee“ zu „Schw4rzMit2Zuck3r!“. Mir ist hier wichtig das ich anhand einer einfachen Verknüpfung meines Lieblingsgetränks mit dem Passwort nicht die Gefahr eingehe das Kennwort zu vergessen und es auch nicht irgendwo aufschreiben muss. Beweißt hier doch einfach selbst etwas Kreativität!
Raspbian aktualisieren und automatisch aktuell halten
Direkt nach der Änderung des Standard-Passworts müssen wir dafür sorgen das unser System mit aktuellen Patches und Updates versorgt wird um nicht unnötig evtl. vorhandene bereits bekannte Sicherheitslücken mit uns herumzuschleppen. Wir aktualisieren erst unsere Paket Liste via update holen uns dann die aktuellen Versionen via upgrade und aktualisieren dann noch die Firmware und den Kernel via rpi-update. Der Parameter dist-upgrade kümmert sich im Gegensatz zum einfachen upgrade auch um Abhängigkeiten und neue Pakete.
1 2 3 |
sudo apt-get update sudo apt-get dist-upgrade sudo rpi-update |
Wer regelmäßig automatisch Aktualisierungen installieren möchte kann diese via Cron-Job automatisch installieren. Wer wichtige Dienste und Daten auf seinem RasPi hat sollte regelmäßig eine Datensicherung erstellen! Hierzu verwende ich im liebsten das Tool unattended-upgrades um automatisch Sicherheitsupdates zu installieren.
1 |
sudo apt-get install unattended-upgrades update-notifier-common |
Um die Standardkonfiguration unter /etc/apt/apt.conf.d/20auto-upgrades zu erstellen führen wir die Konfiguration aus, bestätigt die Frage mit YES
1 |
sudo dpkg-reconfigure -plow unattended-upgrades |
In der Datei /etc/apt/apt.conf.d/10periodic legen wir fest das täglich auf Updates geprüft wird, diese heruntergeladen und installiert werden. Alle 7 Tage werden nicht mehr benötigte Pakete entfernt. Wir editieren diese wieder mit Nano.
1 |
sudo nano /etc/apt/apt.conf.d/10periodic |
Der Inhalt muss wie folgt festgelegt werden.
1 2 3 4 |
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::AutocleanInterval "7"; APT::Periodic::Unattended-Upgrade "1"; |
Gespeichert wird wie immer mit STRG+X, Y und Enter.
In der Datei /etc/apt/apt.conf.d/50unattended-upgrades könnt ihr noch weitere Einstellungen zum automatischen Update konfigurieren, zum Beispiel die Steuerung von Neustarts oder Ausnahmen für Pakete die nicht automatisch aktualisiert werden sollen.
Neuen Benutzer anlegen und Pi entfernen
Da natürlich einem potenziellen Angreifer bekannt ist das es im Raspbian Betriebssystem immer einen Benutzer mit dem Namen Pi gibt hat dieser schon eine wichtige Information um ein System unter seine Kontrolle bringen zu können. Das wollen wir natürlich verhindern und erstellen uns daher einen neuen Benutzer und deaktivieren den vorhandenen Pi User.
Als erstellen wir uns als erstes einen neuen Benutzer, in diesem Beispiel heißt mein Benutzer raspberry.tips, dieser wird direkt zur „sudo“ Gruppe hinzugefügt um später Prozesse auch als root starten zu können.
1 |
sudo useradd -m raspberry.tips -G sudo |
Jetzt setzen wir noch ein sicheres Passwort für den neuen Benutzer, siehe Hinweiße zur Passwort-Stärke oben.
1 |
sudo passwd raspberry.tips |
Dieser Benutzer hat nun die selben Rechte wie der Benutzer Pi, wir können nun also den Standardbenutzer deaktivieren. Bevor ihr den Benutzer Pi löscht meldet euch mit eurem neuen Benutzer via SSH und führt dann folgenden Befehl zum löschen von Pi und dessen Home aus.
1 |
sudo deluser -remove-home pi |
Falls ihr zukünftig bei wichtigen Systemaktionen via sudo nicht immer eure Passwort eingeben möchtet könnt ihr die sudoer Konfiguration entsprechend anpassen.
SSH Zugang absichern
Der SSH-Server ist im Standard auf dem Raspberry Pi installiert, die Konfiguration ist allerdings nicht optimal weshalb wir diese anpassen sollten. Hierzu editieren wir die Konfiguration mit nano
1 |
sudo nano /etc/ssh/sshd_config |
Da wir uns nicht mit dem Benutzer root einloggen (wir kennen das Passwort ja nicht und können uns Root Rechte via sudo verschaffen) deaktivieren wir die Anmeldung. Ändert hierzu PermitRootLogin …. in
1 |
PermitRootLogin no |
Da wir einem möglichen Angreifer nicht gleich auf den ersten Blick zeigen wollen das auf unserem RasPi ein SSH-Server läuft ändern wir noch den TCP Port auf welchem der SSH Dienst lauscht auf einen Port größer 1023. Wer es hier wieder einfach mag und zum erinnern eine Eselsbrücke braucht verwendet einfach seine Postleitzahl oder einen Teil einer Telefon-Nummer, z.B. für Berlin-Mitte 10115.
Hierzu ändern wir die Zeile Port 22 in
1 |
Port 10115 |
Speichert die Konfiguration mit STRG+X, Y und Enter
Zusätzlich können wir mit dem Paket fail2ban automatisch IP-Adressen sperren wenn sie eine voreingestellte Anzahl von erfolglosen Anmeldeversuchen erreicht haben. Damit schützen wir unser System noch gegen Brute Force Angriffe.
1 |
sudo apt-get install fail2ban |
Im Standard werden nun IP-Adressen nach 6 fehlerhaften Anmeldungen für 10 Minuten gesperrt. Falls ihr diese Werte ändern möchtet könnt ihr das in der Konfigurationsdatei /etc/fail2ban/jail.conf tun.
Firewall Iptables unter Raspbian einrichten
Im Standard ist die Firewall iptables bereits auf dem Raspberry Pi installiert, es sind aber keine Regeln eingerichtet sodass jegliche Netzwerkverbindung vom Raspberry Pi angenommen wird. Natürlich wollen wir kontrollieren welche Netzwerkverbindungen für welchen Dienst angenommen werden und falls möglich von welchen Systemen dieser kommen darf.
Folgende Firewall Regeln verwende ich um nur SSH und Daten auf dem lokalen Loopback Interface zu erlauben. Alle anderen Datenpakete werden verworfen. Ihr könnt diese via Copy & Paste in eure SSH Sitzung einfach übernehmen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
echo "Alle lokalen Verbindungen auf dem Loopback akzeptieren" sudo iptables -A INPUT -i lo -j ACCEPT echo "Komische aussehende Pakete verwefen (oft fuer Angriffe benutzt)" sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP sudo iptables -A INPUT -f -j DROP sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP echo "Datenverkehr akzeptieren der zu einer bereits geoeffneten Verbindung gehoert" sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT echo "SSH erlauben" sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 10115 -j ACCEPT echo "Alle anderen Verbindungen ablehnen" sudo iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited |
Wir müssen nun die aktuellen Regeln noch speichern (ihr könnt euch die aktuell aktiven regeln immer via sudo iptables -L anzeigen) oder in der Datei
1 2 |
sudo sh -c "iptables-save > /etc/network/iptables" |
Um die Regeln automatisch nach jedem Neustart zu laden müssen wir nun leider noch in die Tick-Kiste greifen und ein Pre-Up Skript erstellen. Der erste Befehl legt die Datei an, der zweite macht das Skript ausführbar und der dritte öffnet uns den Editor Nano zum Editieren der Datei.
1 2 3 |
sudo touch /etc/network/if-pre-up.d/iptables sudo chmod +x /etc/network/if-pre-up.d/iptables sudo nano /etc/network/if-pre-up.d/iptables |
Wir fügen folgende Zeilen in die Datei ein, diese bewirken das iptables nach jedem Neustart die Regeln aus der Datei /etc/network/iptables einließt und aktiviert.
1 2 |
#!/bin/sh /sbin/iptables-restore /etc/network/iptables |
Speichert das Script mit STRG+X, Y und ENTER nach einem Reboot könnt ihr die aktiven Regeln über sudo iptables -L kontrollieren.
Weitere Regeln, um zum Beispiel den Betrieb eines Webservers zu ermöglichen, können nach Bedarf hinzugefügt werden. Hier die gängigsten, kopiert euch einfach die passende Regeln in eure SSH Sitzung, vergesst nicht das erneute Speichern nach /etc/network/iptables via sudo sh -c „iptables-save > /etc/network/iptables“
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# FTP Server Zugriff erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT # Samba Server erlauben sudo iptables -A INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT sudo iptables -A INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT # Webserver Zugriff erlauben HTTP & HTTPS sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT # TightVNC Server erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT # XRDP Server erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3389 -j ACCEPT |
Wichtig!
Die Regel „-A INPUT -j REJECT –reject-with icmp-host-prohibited“ muss immer am Ende der Datei /etc/network/iptables stehen! Beim nachträglichen hinzufügen müsst ihr daher die Datei mit Nano bearbeiten und den Eintrag ans Ende der Datei verschieben. Alternativ kann die Regel anstelle mit -A auch mit -D entfernt und dann wieder mit -A hinzugefügt werden.
1 |
sudo nano /etc/network/iptables |
Wer den Zugriff auf eine bestimmte Netzwerkkarte begrenzen will kann den Parameter -i eth0 für den Ethernet Port oder -i wlan0 für den WLAN Adapter direkt hinter INPUT verwenden.
Besonders hilfreich und sicher ist es wenn bestimmte Dienste wie, zum Beispiel SSH, nur aus dem lokalen Netz und nicht z.b. aus dem Internet erreichbar sind. Da ich eine FritzBox verwende, welche im Standard intern Netzwerkadressen aus dem Netz 192.168.178.0/24 verteilt, kann ich mit dem Parameter -s 192.168.178.0/24 den Zugriff via SSH auf mein internes Netz beschränken. Ein guter Startpunkt und weiterführende Informationen zur iptables Firewall findet ihr im Ubuntu Wiki.
Tipp: Wer lieber auf dem X-Desktop arbeitet kann Firewall Regeln auch mit dem Tool fwbuilder erstellen. Installiert wird das Tool via sudo apt-get install fwbuilder und ist dann im Startmenu zu finden.
iptables Reset auf Standard
Für einen Reset der Firewall auf Standard führt ihr folgendes durch
1 2 3 4 5 6 |
sudo iptables -A INPUT --j ACCEPT sudo iptables -A OUTPUT --j ACCEPT sudo iptables -A FORWARD --j ACCEPT sudo sh -c "iptables-save > /etc/network/iptables" sudo reboot |
Weitere Tutorials und Projekte für Einsteiger:
- Raspberry Pi Einsteiger Guide – Anschaffung – Teil 1
- Raspberry Pi Einsteiger Guide – Vorbereitung – Teil 2
- Raspberry Pi Einsteiger Guide – Konfigurieren – Teil 3
- Raspberry Pi Einsteiger Guide – VNC einrichten – Teil 4
- Raspberry Pi Einsteiger Guide – DynDNS – Teil 5
- Raspberry Pi Einsteiger Guide – Port Forwarding – Teil 6
- Raspberry Pi als Webserver einrichten
- VNC Alternative für den Raspberry Pi – XRDP Remote Desktop Verbindung
- Raspberry Pi im Internet – Absichern eures Mini-Rechners