![]() |
Raspberry Pi sicherer machenProf. Jürgen Plate |
Raspberry-Pi-Boards sind inzwischen sehr beliebt, weil sie billig und einfach zu bedienen sind. Der RasPi bietet zudem programmierbare GPIO-Pins sowie mehrere USB-Ports. Wenn Sie nicht aufpassen, könnte Ihr kleines Raspberry-Hobbyprojekt zu einem Sicherheitsrisiko weden und als Einstieg in Ihr Heimnetz dienen. Deshalb folgen hier einige Sicherheitstipps, die Ihren RasPi und andere Geräte in Ihrem Netzwerk sicherer machen.
Wenn Sie sich die Fragen stellen, warum jemand gerade Ihren Bastel-Computer hacken sollte, so gibt es viele Gründe. Nur einige davon sind:
Ändern Sie auf jeden Fall die Standard-Passwörter. Achten Sie beim Raspian-System darauf, das Standard-Passwort des Benutzers "pi" so zu ändern, dass es lang und schwer zu erraten ist. Auch wenn Sie planen, den Account später zu deaktivieren, ist dieser erste Schritt Grundschutz für den Fall, dass Sie später nicht mehr daran denken.
Es kann sinnvoll sein, nach der Grundinstallation den Standard-Account "pi" zu deaktivieren oder zumindest umzubenennen. Das macht es den Hackern schon etwas schwerer. Bevor Sie Änderungen bei "pi" vornehmen, erstellen Sie einen neuen Account auf dem System. Dazu nehmen Sie das Kommando useradd mit einigen zusätzlichen Optionen, um gleich ein neues Home-Verzeichnis für den Benutzer zu erstellen. Der neue Account muss auch wieder Sudo-Rechte besitzen. Das Kommando lautet:
sudo /usr/sbin/useradd --groups sudo -m johndoeVerwenden Sie Ihren eigenen Benutzernamen anstelle von "johndoe". Das System erstellt nun einen neuen Account und ein Heimatverzeichnis /home/johndoe. Weiterhin wird der Account der Sudo-Gruppe hinzugefügt, damit der Benutzer den Befehl sudo verwenden kann. Ist der neue Benutzer erstellt wurde, müssen Sie für ihn ein Passwort festlegen. Dazu dient das Kommando:
sudo passwd johndoeDann ändern Sie auch gleich noch das Root-Passwort:
sudo passwd rootNun probieren Sie aus, ob der neue Account auch wunschgemäß funktioniert. Loggen Sie sich ein und probieren Sie, ob Sie ein Sudo-Kommando absetzen können. Sie können auch testen, ob die wichtigsten Tools Ihrer Anwendung funktionieren. Wenn alles klappt, kann das Pi-Konto deaktiviert (nicht gelöscht!) werden:
sudo passwd --lock piSo führt gegebenenfalls noch ein Weg zurück, falls es irgendwo nicht klappen sollte.
Standardmäßig ist bei Raspbian die Secure Shell (SSH), mit der man über das Netz auf den Raspberry Pi zugreifen kann, deaktiviert. Um sie zu aktivieren genügt es, im Verzeichnis /boot (also auf der Boot-Partition) eine leere Datei namens "ssh" anzulegen. Beim nächsten Reboot wird dann SSH aktiviert. Sie können den Zugriff auf Systeme mit einem autorisierten SSH-Key einschränken. Dazu bearbeiten Sie die SSH-Konfigurationsdatei /etc/ssh/sshd_config mit vi, nano oder einem anderen Texteditor. Fertigen Sie vorher ein Backup der Datei an, damit Sie den Originalzustand wieder herstellen können, fAllse etwas schief geht:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.origVergewissern Sie sich, dass die folgenden Zeilen gesetzt und auskommentiert sind. Das heißt, die Zeilen müssen sich in der Datei befinden und es darf kein Kommantarzeichen (Doppelkreuz, #) vorangestellt sein:
# Authentication: LoginGraceTime 120 PermitRootLogin no StrictModes yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to yes to enable challenge-response passwords (beware issues with # some PAM modules and threads) ChallengeResponseAuthentication no # Change to no to disable tunnelled clear text passwords PasswordAuthentication no UsePAM noDie letzte Zeile ist sehr wichtig, da sie PAM (Pluggable Authentication Modules) oder die einfache Linux-Authentifizierung mit Passwort deaktivieren und nur einen Login von Benutzern mit einem Schlüssel zuläßt.
Als nächstes muss ein SSH-Schlüssel erzeugt werden. Sie können dies mit dem Befehl ssh-keygen unter Linux machen. Dazu erstellen Sie, falls nicht schon vorhanden, ein Verzeichnis namens ".ssh" in Ihrem Home-Verzeichnis und eine Datei namens "authorized_keys" mit den folgenden Befehlen. Achten Sie darauf, die Zugriffsrechte richtig zu setzen:
cd mkdir .ssh chmod 0700 .ssh touch .ssh/authorized_keys chmod 0600 .ssh/authorized_keysAuf dem Computer von dem aus Sie sich auf dem Pi einloggen wollen, geben Sie folgende Kommandos ein:
# zuerst werden die Keys generiert ssh-keygen -t dsaNun befinden sich im Verzeichnis ~/.ssh die beiden Dateien id_dsa und id_dsa.pub (der private und öffentliche Schlüssel). Dann wird der öffentliche Schlüssel zu Raspbrry kopiert und dort an die Datei ~/.ssh/authorized_keys angehaengt:
ssh-copy-id -i ~/.ssh/id_dsa.pub johndoe@<Domainname des RasPi>Windows-Benutzer können den Key auch mit Putty generieren und müssen ihn dann von Hand eintragen indem Sie den Key mit einem Texteditor in die Datei authorized_keys am Ende einfügen. Da wiederholen Sie mit allen Computern, von denen aus der RasPi per SSH erreicht werden soll.
Sorgen Sie nun dafür, dass SSH neu gestartet wird, damit die Änderungen wirksam werden. Beiben Sie dabei auf jeden Fall eingeloggt, damit Sie im Fehlerfall reagieren können:
sudo systemctl neu starten ssh
Bewahren Sie Ihre privaten Schlüssel an mindestens zwei vertrauenswürdigen Orten auf.
Sie können auch bestimmte User von SSH ausschließen oder zulassen. Dazu bearbeiten Sie die Datei /etc/ssh/sshd_config mit einem Editor. Für das Zulassen bestimmter User dient die Zeile, die mit "AllowUsers" beginnt (fehlt die Zeile ganz, schreiben Sie diese einfach am Dateiende dazu):
AllowUsers franz fritz hans natalieAuf die gleiche Weise können auch bestimmte User ausgeschlossen werden:
DenyUsers sepp trudiNach dem Ändern der Datei muss der SSH-Dienst neu gestartet werden:
sudo systemctl restart ssh
Das Bundesamt für Sicherheit in der Informationstechnik (BSI) bezeichnet als Härten in der IT-Sicherheit "... die Entfernung aller Softwarebestandteile und Funktionen, die zur Erfüllung der vorgesehenen Aufgabe durch das Programm nicht zwingend notwendig sind ...". "Härten bedeutet also, ein System für eine bestimmte Aufgabe maßzuschneidern und abzusichern.
Bei Desktop-Systemen ist dieser Vorgang zeitaufwändiger, denn hier müssen eine Vielzahl von Programmen und Diensten berücksichtigt werden, die dem alltäglichen Gebrauch dienen. Server-Systeme oder auch Systeme für Embedded-Anwendungen erfüllen dagegen ein fest umrissenes Aufgabengebiet, was die Härtung insgesamt erleichtert. Allerdings sollte man nicht vergessen, dass viele dieser Systeme rund um die Uhr laufen, weswegen eine sorgfältige Härtung der wenigen Dienste und Programme umso wichtiger ist.
Generell gilt: Was nicht auf dem Raspberry Pi läuft, kann auch keine Probleme für die Sicherheit machen. Unter anderem sollten folgende Massnahmen getroffen werden:
Soll beispielsweise der RasPi die Daten diverser Sensoren erfassen und in regelmäßigen Intervallen an einen anderen Server weiterleiten, benötigt er weder ein grafisches Desktop-Environment noch ein Office-Paket, Browser oder derartige Applikationen. Auch sollte man möglichst Pakete vermeiden, die nicht auf dem "üblichen" Weg installiert werden können und damit auch bei einem System-Update aktualisiert werden. Solche "Fremdlinge" erhöhen den Wartungs- und Pflegeaufwand. Noch schlimmer: Man kann vergessen, die Pakete zu aktualisieren.
Überflüssige Dienste muss man deaktivieren. Auch bei Software-Paketen der Standard-Installation werden gelegentlich Abhängigkeiten installiert, welche Netzwerk-Dienste bzw. -Ports auf dem Rechner öffnen. Mit den Programmen ps, netstat kann man nachsehen, welche Dienste der Rechner anbietet. Das Kommando sudo netstat -tulpen liefert z. B. kompakte Info über die laufenden Kommunikationsprozesse. Mit dem Tool nmap kann man überprüfen, welche Ports "nach aussen" hin offen oder sichtbar sind.
Ein weiterer Punkt ist die sichere Konfiguration von Diensten, die laufen (müssen). Diese Dienste (z. B. cups, ntp etc.) sollte man so konfigurieren, dass sie nur auf localhost bzw. die IP-Adresse 127.0.0.1 lauschen und für andere Rechner im gleichen Netzwerk nicht erreichbar sind.
Aktualisieren Sie Ihre Pakete regelmäßig. Schauen Sie regelmäßig bei der Raspberry-Pi Website vorbei und informieren Sie sich über notwendige Updates. Sie können automatische Updates einrichten, indem Sie das Paket "unattended-upgrades" installieren, wie es im offiziellen Debian-Wiki beschrieben ist. Bei Servern oder Embedded-Systemen ist aber ein manueller Update angeraten.
Sichern Sie nach Änderungen Ihre komplette Konfigurationen. Die Lebensdauer von SD-Karten ist beschränkt. Irgendwann versagt die Karte und dann sollte ein Backup zur Verfügung stehen. Sichern Sie am einfachsten die SD-Karte als Ganzes auf einem externen USB-Stick oder kopieren Sie die Karte über einen USB-SD-Kartenleser. Alternativ kann man auch das SD-Kartenimage auf einem PC oder Server sichern.
Linux bringt dankenswerter Weise die komplette Firewall-Software schon mit. Der Name ist iptables und dieses Kommando wird zum Aufbau des Regelsystems mehrfach aufgerufen. iptables ist standardmäßig unter Raspbian installiert, aber nicht aktiviert. Überprüfen Sie die aktuellen Regeln mit dem Kommando:
sudo /sbin/iptables -LHier werden alle vorhandenen Regeln aufgelistet. Vermutlich ist anfangs die Liste leer. Sie können die Regeln jederzeit in einer Textdatei speichern und mit dem Editor bearbeiten:
sudo /sbin/iptables-save > /etc/iptables/rules.v4Die Datei /etc/iptables/rules.v4 wird von iptables-persistent verwendet, wenn Ihr System bootet, um sicherzustellen, dass die Firewall noch läuft. Anfangs ist es aber sinnvoll die Regeln per Shellscript aufzurufen. Dann wird getestet und wenn etwas nicht klappt, kann man die Regeln auf der Kommandozeile wieder löschen oder ändern. Wird ein fehlerhaftes Regelsystem persistent gemacht, kann es sein, dass Sie sich aussperren. Ein möglicher Ausgangspunkt wäre das folgende Script.
#!/bin/sh # iptables Firewall Skript IPTABLES="/sbin/iptables" echo "Loading Firewall ..." # Purge/Flush # ~~~~~~~~~~~ # Alle Regeln löschen $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F # Alle Regelketten löschen $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # Regeln # ~~~~~~ # IPv4 Default $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT ACCEPT # Loopback-Schnittstelle Verkehr erlauben $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT # Abgehenden Verkehr erlauben $IPTABLES -A OUTPUT -j ACCEPT # ICMP-Antwortpakete erlauben $IPTABLES -A INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT $IPTABLES -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT $IPTABLES -A INPUT -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT # Alle Pakete zu einer bestehenden TCP-Verbindung akzeptieren $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH-Verbindungen zulassen $IPTABLES -A INPUT -p tcp -m state --state NEW --dport 22 -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 # Alle Pakete ordentlich zurückweisen $IPTABLES -A INPUT -p tcp -j REJECT --reject-with tcp-reset $IPTABLES -A INPUT -j REJECT --reject-with icmp-port-unreachable $IPTABLES -A FORWARD -j REJECT echo "... done!"Als nächstes testen Sie, ob Ihre Firewall funktionieren. Klappt alles, können Sie das Regelsystem dauerhaft verankern:
sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4Sie können den Raspberry Pi (und seine Kollegen) zusätzlich in ein eigenes privates Netzsegment* stellen, und die Firewall so konfigurieren, dass er keine anderen Teile des Netzwerks erreichen kann, während seine ausgehenden Verbindungen zum Internet funktionieren und für den täglichen Gebrauch gefiltert werden.
Keine gute Idee ist es, irgendwelche Firewall-Log einzuschalten. Wenn der RasPi im Internet hängt, dann füllen die Logfiles recht flott den Speicher auf der SD-Karte. Während des Test kann man Logs mitlaufen lassen, aber danach gehören sie abgeschaltet.
Bei all den oben geschilderten Aktion kann natürlich auch mal was schief gehen. Meist hilft es schon, über eine zweite SSH-Verbindung als Root eingeloggt zu sein (Tipp: sudo su für dauerhafte Root-Rechte). Dann kann man fast alle Fehler reparieren und ohne Angst alles testen. Geschieht Schlimmeres kann man notfalls die SD-Karte auf einem anderen Linux-Rechner mounten und dort dann Dateien anlegen, lösche oder bearbeiten. Sinnvoll ist es auch, nach jedem Teilschritt einen Snapshot der SD-Karte als .img-Datei auf dem Linux-PC zu sichern. Dann muss man nich ganz von vorne anfangen, wenn man sich das System zerschossen hat.