Kurzanleitungen/Howtos

Der Spectre- und Meltdown-sichere SurfPi

04.08.2018

Spectre
CC0 1.0 Natascha Eibl

Dieses Howto zeigt Ihnen, wie Sie einen RaspberryPi (mit Raspbian Stretch) für das Spectre- und Meltdown-sichere Surfen einrichten.
Die in fast allen CPUs (bei einigen Prozessorfamilien bereits seit 1995!) enthaltenen Sicherheitslücken Spectre und Meltdown zeigen, wie lange gravierende Sicherheitslücken in Produkten schlummern (oder verdeckt ausgenutzt werden) können.
Die besondere Gefährlichkeit besteht darin, daß diese Sicherheitslücken direkt in der Hardware stecken und unter jedem Betriebssystem ausgenutzt werden können. Eigentlich durch Sicherheitsfunktionen geschützte sensible Daten (wie Paßwörter) können hierdurch unbemerkt (z.B. durch simples Besucher einer Webseite) ausgelesen werden. Die Hersteller von Soft- und Hardware arbeiten derzeit an Patches, um die Auswirkungen von Spectre und Meltdown abzumildern. Ob und wann es gelingen wird, alle Schwachstellen zu schließen, bleibt abzuwarten. Unwahrscheinlich ist hingegen, daß für alle betroffenen Systeme Patches erscheinen werden.
Eine Ausnahme von diesen Sicherheitslücken bildet die CPUs der RaspberryPis (alle Varianten), denen die spekulative Codeausführung fehlt, die für die Angriffe nötig ist. Beim Ausführen des Browsers auf einem Raspberry Pi können Ihnen so keine Daten durch diese Sicherheitslücken entwendet werden. Sie sollten unabhängig davon aber auf die Sicherheit Ihres Arbeitsplatzrechners achten.
Prinzipiell ist dieses Howto (mit kleinen Anpassungen) auch für anderen Systeme, auf denen Debian läuft, geeignet. Auch kann es als Einrichtungsgrundlage für den Fernzugriff auf auf dem RaspberryPi laufenden Anwendungen dienen.

1. Zugriff absichern

Für den Zugriff (Konsole und x2goserver) auf den Raspberry Pi wird der SSH-Server verwendet. Um das System nicht zu gefährden, sollten grundlegende Sicherheitsvorkehrungen vorgenommen werden. Wie Sie den SSH-Server automatisch beim Booten starten, lesen Sie bitte in einem der öffentlich zugänglichen Tutorials nach. Alle folgenden Schritte werden mit root-Rechten durchgeführt.

1.1 Paßwort des pi-Benutzers ändern

passwd pi

1.2 SSH-Schlüssel für den paßwortlosen Zugriff importieren

Die Verwendung eines SSH-Schlüssels macht nicht nur die Nutzung einfacher, sondern erhöht auch die Sicherheit. Kopieren Sie hierzu den öffentlichen SSH-Schlüssel Ihres Arbeitsrechners in die Zwischenablage und fügen Sie diesen beim Aufruf von
nano
wieder ein:
mkdir ~/.ssh
nano ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown pi -R ~/.ssh

1.3 SSH-Anmeldung nur noch über SSH-Schlüssel erlauben

Setzen Sie in der "/etc/ssh/sshd_config" den Parameter "PasswordAuthentication" auf den Wert "no" und starten anschließend den SSH-Server neu:
/etc/init.d/ssh restart
Meltdown
CC0 1.0 Natascha Eibl

2. x2goserver und Browser installieren

Der grafische Zugriff auf den SurfPi findet nach der Installation über den x2goclient statt.

2.1 GPG-Signaturschlüssel für die Überprüfung der Paketintegrität importieren

Damit apt-key funktioniert, muß zuvor das Paket "dirmngr" installiert werden:
apt-get install dirmngr
apt-key adv --recv-keys --keyserver keys.gnupg.net E1F958385BFE2B6E

2.2 Paketquelle für den x2goserver einbinden

echo '# X2Go Repository (release builds)
deb http://packages.x2go.org/raspbian stretch main
# X2Go Repository (sources of release builds)
deb-src http://packages.x2go.org/raspbian stretch main' > /etc/apt/sources.list.d/x2go.list

2.3 Browser und x2goserver installieren

apt-get update
apt-get install chromium-browser firefox-esr x2goserver cryptsetup

3. Dateisystemverschlüsselung

Um die Sicherheit der Daten gegen Diebstahl des RaspberryPis zu erhöhen, sollen die Daten des Surfbenutzers und /tmp verschlüsselt werden. Damit kommt ein Dieb zwar in den (physikalischen) Besitz des Gerätes, kommt aber an die (möglicherweise) sensiblen Daten nicht heran.

3.1 /tmp in verschlüsseltem Container ablegen

Für die Daten, die unter "/tmp" abgelegt werden, wird ein 1GB großer Container angelegt, der bei jedem Booten mit einem neuen zufälligen Paßwort verschlüsselt wird.
Der folgende Befehl legt eine 1GB große Sparse-Datei an:
dd if=/dev/zero of=/tmp.img seek=1024 count=1 bs=1M
Das System wird nun so konfiguriert, daß beim Booten der (mit einem zufälligen Paßwort verschlüsselte) Container nach /dev/mapper/tmp geloopt wird:
echo 'tmp /tmp.img /dev/urandom tmp,cipher=aes-cbc-essiv:sha256' > /etc/crypttab
Beim Booten wird "/dev/mapper/tmp" automatisch nach "/tmp" gemountet:
echo '/dev/mapper/tmp /tmp ext2 defaults 0 2' > /etc/fstab

3.2 Verschlüsseltes /chome anlegen

Neben dem direkt auf der SD-Karte liegenden "/home" soll das Verzeichnis "/chome" angelegt werden, dessen Daten im verschlüsselten 8GB großen Container "/chome.img" abgelegt werden.
mkdir /chome
dd if=/dev/zero of=/chome.img seek=8192 count=1 bs=1M
LUKS-Container formatieren und einhängen:
cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y /chome.img
cryptsetup luksOpen /chome.img chome
mkfs.ext4 /dev/mapper/chome
mount /dev/mapper/chome /chome
chmod 777 /chome

4. Neuen Benutzer zum Surfen anlegen

Der Benutzer "surfer" wird im verschlüsselten /chome angelegt und bekommt ein zufällig generiertes Zugangspaßwort, das nicht zum Einloggen verwendet werden soll. Die Anmeldung per SSH erfolgt hier ausschließlich über den SSH-Schlüssel.
pw=`dd if=/dev/urandom bs=1M count=1 2> /dev/null | sha512sum - | cut -d' ' -f1`
useradd -m -g users -d /chome/surfer -s /bin/bash -p "$pw" surfer

4.1 Öffentlichen SSH-Schlüssel hinzufügen

Um das paßwortlose Einloggen per SSH zu ermöglichen, wird der bereits für den pi-Benutzer importierte SSH-Schlüssel verwendet.
mkdir /chome/surfer/.ssh
cp /home/pi/.ssh/authorized_keys /chome/surfer/.ssh
chown surfer /chome/surfer/.ssh -R
chmod 700 /chome/surfer/.ssh

5. Freischaltskript erstellen

Damit Sie nach jedem Neustart das Mounten nicht per Hand erledigen müssen, legen Sie folgendes Skript, das zudem das System aktualisiert, an:
echo '#!/bin/bash
#System aktualisieren
apt-get update; apt-get dist-upgrade -y; apt-get clean

#/chome mounten
cryptsetup luksOpen /chome.img chome
mount /dev/mapper/chome /chome' > /bin/chomeOpen
chmod +x /bin/chomeOpen
Führen Sie dieses Skript nach jedem Booten per Einloggen als "pi" und Wechseln auf den root-Benutzer aus.

Optional: Alle Verbindungen des Benutzers über TOR umleiten

Wenn Sie zusätzliche alle Verbindungen des surfer-Benutzers mittels "iptables"-Firewallregeln über das TOR-Netzwerk leiten möchten, um Ihre IP-Adresse gegenüber Webservern zu verschleiern, führen Sie folgende Befehle aus, die die nötige Software installieren und die Konfiguration für Sie vornehmen. Mit dem automatisch erstellten Skript "/bin/torNeueIP" können Sie sich später (als Benutzer "pi" oder "surfer") durch den TOR-Client eine neue IP geben lassen.
apt-get install tor privoxy
echo 'DNSPort 53
AutomapHostsOnResolve 1
VirtualAddrNetwork 10.192.0.0/10
TransPort 9040' > /etc/tor/torrc

echo 'user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
actionsfile default.action   # Main actions file
actionsfile user.action      # User customizations
filterfile default.filter
filterfile user.filter      # User customizations
logfile logfile
listen-address  127.0.0.1:8118
listen-address  [::1]:8118
toggle  1
enable-remote-toggle  0
enable-remote-http-toggle  0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forward-socks5 / 127.0.0.1:9050 .
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
tolerate-pipelining 1
socket-timeout 300' > /etc/privoxy/config

echo '
for anonUser in surfer
do
  # Skip setting of the rules for the given user, if the rules are already set.
  if [ $(iptables -L | egrep "(match $anonUsers |match $anonUsers$)" -c) -eq 3 ]
  then
    continue
  fi

  iptables -t nat -A OUTPUT ! -o lo -p tcp -m owner --uid-owner $anonUser -m tcp -j REDIRECT --to-ports 9040
  iptables -t nat -A OUTPUT ! -o lo -p udp -m owner --uid-owner $anonUser -m udp --dport 53 -j REDIRECT --to-ports 53
  iptables -t filter -A OUTPUT -p tcp -m owner --uid-owner $anonUser -m tcp --dport 9040 -j ACCEPT
  iptables -t filter -A OUTPUT -p udp -m owner --uid-owner $anonUser -m udp --dport 53 -j ACCEPT
  iptables -t filter -A OUTPUT ! -o lo -m owner --uid-owner $anonUser -j DROP
done
' >> /bin/chomeOpen

echo 'pi ALL=(root) NOPASSWD:/usr/bin/killall' >> /etc/sudoers
echo 'surfer ALL=(root) NOPASSWD:/usr/bin/killall' >> /etc/sudoers

echo 'sudo killall -HUP tor' > /bin/torNeueIP
chmod +x /bin/torNeueIP

6. Neustart

Starten Sie nun nach abgeschlossener Einrichtung Ihren RaspberryPi neu per:
reboot

7. Mit dem SurfPi verbinden

Sie können sich per SSH auf dem SurfPi über die Benutzer "pi" (für die Administration) und "surfer" für das gesicherte Surfen und den Dateiaustausch verbinden. Loggen Sie sich nun als "pi" und welchseln Sie mit
sudo bash
zum Benutzer "root". Schalten Sie nun per
/bin/chomeOpen
das System frei.

7.1 Grafische Sitzungen mit x2go

Über den x2goclient, den Sie auf Ihrem Arbeitsplatzrechner installieren, können Sie grafisch auf den SurfPi zugreifen. Erstellen Sie dazu ein neues Profil analog zu den Einstellungen im Screenshot. Sie müssen hierbei (mindestens) die IP Ihres SurfPis und den Dateinamen Ihres geheimen SSH-Schlüssels ändern.
Anlegen eines neuen Profils im x2go-Clienten
Anlegen eines neuen Profils im x2go-Clienten
Wenn Sie das neue Profil anklicken, sollte sich Ihr Rechner mit dem SurfPi verbinden und ein neues xterm-Fenster öffen. Innerhalb dieses Fensters können Sie den Browser Chromium über
chromium-browser&
bzw. mittels
chromium-browser --incognito&
im privaten Modus starten. Für Firefox verwenden Sie analog
firefox&
bzw.
firefox --private-window&
für den pirvaten Modus.

8. Browser-Erweiterungen zur Erhöhung der Sicherheit

Um die Sicherheit beim Surfen weiter zu erhöhen, können Sie zusätzliche Erweiterungen (z.B. uBlock Origin, ScriptSafe bzw. NoScript) installieren. Diese Erweiterungen stehen nur exemplarisch für eine Vielzahl weiterer Erweiterungen. Recherchieren Sie bitte, welche (zusätzlichen) Erweiterungen am bestem zu Ihrem Sicherheitsbedürfnis passen.
Achtung! Achtung! Die folgenden Anweisungen richten sich ausschließlich an fachkundige Personen. Bei jedem Schritt kann es zum kompletten Datenverlust kommen. Alle Angaben ohne Gewähr! Die Anweisungen, Skripte, etc. sind ausschließlich für Lernzwecke auf Lernsystemen und nicht für Produktivumgebungen bestimmt!