Raspberry Pi sicherer machen

Prof. Jürgen Plate

Raspberry Pi sicherer machen

Allgemeines

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:

Sicherheitsmassnahmen

Standard-Passwörter ändern

Ä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.

Benutzerkonten ändern und einrichten

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 johndoe
Verwenden 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 johndoe
Dann ändern Sie auch gleich noch das Root-Passwort:
sudo passwd root
Nun 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 pi
So führt gegebenenfalls noch ein Weg zurück, falls es irgendwo nicht klappen sollte.

SSH sicher machen

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.orig
Vergewissern 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 no
Die 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_keys
Auf 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 dsa
Nun 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 natalie
Auf die gleiche Weise können auch bestimmte User ausgeschlossen werden:
DenyUsers sepp trudi
Nach dem Ändern der Datei muss der SSH-Dienst neu gestartet werden:
sudo systemctl restart ssh

System (ab-)härten

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:

Besonders der letzte Punkt kann schnell den Unterschied zwischen "sicher" und "unsicher" entscheiden. Die Sicherheit beginnt bereits bei der Installation. Leider bietet Raspbian hier wenige Setup-Optionen an. Grundsätzlich solle man nur jene Pakete installieren, die für den Betrieb notwendig sind, denn je weniger Pakete und Abhängigkeiten ein System aufweist, desto geringer fällt die Angriffsfläche aus. Andernfalls bleibt nur übrig, nach der Installation nicht benötigte Dinge wieder zu deinstallieren.

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.

Updates und Backups

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.

Einrichten einer Firewall

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 -L
Hier 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.v4
Die 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.v4
Sie 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.
(*Für pivate Netze könen die IPv4-Adressbereiche 10.x.x.x, 72.16.x.x bis 72.31.x.x und 192.168.x.x verwendet 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.

Big Trouble in Little China

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.


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: