Computer immer erreichbar dank Tor Hidden Service

Tor ist nicht nur was für investigative Journalisten, Paranoiker oder böse Jungs. Man kann es auch als leicht einzurichtendes, öffentliches VPN nutzen um durch ein NAT-Router hindurch auf eigene Dienste zuzugreifen:

Im folgenden wird gezeigt, was dafür alles auf einem Raspberry Pi mit Raspbian Stretch (Lite) zu tun ist.

Folien

sind online unter https://noone.org/talks/tor/.

Vorbereitung

# acat 2018-03-13-raspbian-stretch-lite.zip \
       2018-03-13-raspbian-stretch-lite.img \
       | dd bs=1M of=/dev/sde status=progress

Optional: Serielle Konsole

$ pmount /dev/sde1
$ echo enable_uart=1 >> /media/sde1/config.txt
$ sed -e "s/console=tty1 root=/console=tty1 console=serial0,115200 root=/" -i /media/sde1/cmdline.txt
$ pumount /dev/sde1

USB-zu-TTL-Seriell-Kabel wie hier abgebildet anschliessen:

USB-Stecker in den (Vortrags-) Computer einstecken und dort dann in einer Shell sich mit der seriellen Verbindung verbinden:

screen /dev/ttyUSB0 115200

(Ausführender Benutzer muss ggf. in der passenden Gruppe, z.B. dialout sein. Sonst als root oder mit sudo aufrufen. Geht nicht mit tmux, weil tmux keine Unterstützung für serielle Schnittstellen hat. Alternativen sind minicom, picocom oder cu.)

Karte in den Raspberry Pi einlegen und Strom anstecken und damit booten. Die Bootmeldungen sollten dann auch auf dem (Vortrags-) Computer in der Screen-Session erscheinen.

Vorbereitungen auf dem Raspberry Pi

Netzwerk-Verbindung herstellen

sudo raspi-config → Network Options → Wi-fi

System auf aktuellen Stand bringen und Tor installieren

Da das frisch installierte Image immer schon ein paar Tage alt ist, muß man erst einmal die Paketlisten auf aktuellen Stand bringen und vielleicht auch grade alle Sicherheitsupdates einspielen

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install --no-install-recommends tor

Schonmal einen Webserver installieren

Es ist egal, welcher Webserver installiert wird oder ist. Ich mag den Apache.

sudo apt install --no-install-recommends apache2

Default-Webseite individualisieren. :-)

sudo sed -e 's/2 Debian Default Page/ on the Tor-as-VPN-Demo-Raspberry-Pi/' -i /var/www/html/index.html

Webserver als "Hidden Service" einrichten

Auf den neuen Tor Hidden Service zugreifen

Webzugriff ohne speziell installierte lokale Software

Wenn Privatsphäre und Vertaulichkeit kein Problem sind, kann man fremde Gateway-Server (Tor2Web) nutzen, die Webseiten im Tor-Netzwerk auch übers normale WWW erreichbar macht, z.B. als .onion.to, .onion.cab und diverse andere:

Mit lokal installierter Software direkt ins Tor-Netzwerk

Am einfachsten geht das mit dem auf Firefox ESR basierenden Tor Browser.

Unter Debian und Derivaten (Raspbian, Ubuntu, Linux Mint, etc.) geht das z.B. mit dem Paket torbrowser-launcher which is in the contrib area of the archive. Partially, e.g. for Debian 9 Stretch, it's only available via backports:

# apt install torbrowser-launcher

Danach muss man als Benutzer torbrowser-launcher aufrufen. Beim ersten Aufruf wird der Tor-Browser heruntergeladen und im Home-Verzeichnis des aufrufenden Benutzers unter ~/.local/share/torbrowser/ installiert.

Hidden Services aus der Sicht des Servers

Den Zugriffen auf dem Raspberry Pi zuschauen

$ tail -F /var/log/apache2/access.log | ccze -A

(ccze ist ein Log-Coloriser, also ein Parser, der verschiedene Elemente von Log-Einträgen farblich hervorhebt.)

Potentielle Stolperfallen

Per Tor eingehende Verbindungen kommen von localhost (127.0.0.1). Damit ist ein Schutz für "interne" Webseiten durch Einschränken auf 127.0.0.1 kein Schutz mehr. Für den Moment reicht wahrscheinlich noch Einschränken auf ::1 (IPv6 Localhost) aus, aber sicher nicht für immer.

SSH als Tor Hidden Service einrichten

Als erstes SSH dauerhaft aktivieren auf dem Raspberry Pi (und ein neues Passwort setzen):

(Einloggen per SSH als Root mit Passwort ist in der Standard-Einstellung deaktiviert.)

Es wird davon ausgegangen, dass bereits ein Webserver als Hidden Service läuft, ansonsten muss man wie in o.g. Beispiel eine Zeile mit HiddenServiceDir ebenfalls einkommentieren und den neuen .onion-Hostnamen auslesen.

Per SSH via Tor Hidden Service auf den Pi zugreifen

Braucht entweder das Programm nc (netcat; aus dem Paket netcat-openbsd oder das Programm connect aus dem Paket connect-proxy:

ssh -o 'ProxyCommand=nc -X 5 -x localhost:9050 %h %p' pi@kumd43gasfh6ywxt.onion oder ssh -o 'ProxyCommand=env SOCKS5_PASSWORD="" connect -R remote -5 -S localhost:9050 %h %p' pi@kumd43gasfh6ywxt.onion

Damit man das nicht jedes Mal tippen muss, macht man sich passende Einträge in ~/.ssh/config:

Host meinpi_via_tor Hostname kumd43gasfh6ywxt.onion User pi ProxyCommand /bin/nc -X 5 -x localhost:9050 %h %p oder Host meinpi_via_tor Hostname kumd43gasfh6ywxt.onion User pi ProxyCommand env SOCKS5_PASSWORD="" connect -R remote -5 -S 127.0.0.1:9050 %h %p

Danach reicht ein $ ssh meinpi_via_tor und es wird sogar automatisch der richtige Username verwendet.

SSH Hostkey verifizieren

Bei ersten Verbinden mit SSH per Tor will SSH wissen, ob man dem Hostkey traut:

$ ssh meinpi_via_tor
The authenticity of host 'meinpi_via_tor' (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:UJcXI5/GBJUenScbY59O5TxHpwL59UrU5SS3Iffdur4.
Are you sure you want to continue connecting (yes/no)?

Um diese Frage sicher beanworten zu können, führt man auf dem Raspberry Pi folgenden Befehl aus, um den Fingerabdruck des passenden Hostkeys (hier: ECDSA) anzuzeigen:

$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub 256 SHA256:UJcXI5/GBJUenScbY59O5TxHpwL59UrU5SS3Iffdur4 root@raspberrypi (ECDSA) (Als normaler Benutzer muss man den lesbaren Public-Key (Endung .pub) verwenden, als Root kann man stattdessen auch den Private-Key (ohne spezielle Dateiendung) verwenden.

Sind die beiden Fingerabdrücke identisch, kann man sicher sein, dass man sich mit dem erwarteten Raspberry Pi verbunden ist.

Häufig gestellte Fragen

Geht das auch mit HTTPS?

Prinzipiell ja, aber demnächst hoffentlich auch mit einer der in den Browsern enthaltenen Certificate Authorities (CA), auch nicht mit Let's Encrypt.

Es gibt aber bereits entsprechende Diskussionen im dafür zuständigen CA/Browser-Forum, d.h. das könnte in Zukunft möglich sein.

Mit einer eigenen CA und deren Root-Zertifikat im Webbrowser ist das aber bereits jetzt möglich. (Aber alles andere als trivial.)

Geht auch UDP bzw. Mosh?

Vorerst leider nicht solange man nicht einen weiteren, TCP-basierten Tunnel (OpenVPN, sshuttle, etc.) über Tor laufen lässt, was meistens die Vorteile von UDP wieder zunichte macht.

Wie sorge ich dafür, dass niemand rauskriegen kann, wo der Server steht?

Sprengt definitiv den Rahmen des Vortrag. Dazu sind viele Details zu beachten, gerade auch bei der Konfiguration der entsprechenden Server-Software (Apache HTTPd, OpenSSH Daemon, etc.).

Alternativen