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.
sind online unter https://noone.org/talks/tor/.
Passendes Image herunterladen von https://www.raspberrypi.org/downloads/raspbian/
Optional: Von mir bevorzugte Tools für diese Aufgaben (als root) auf dem (Vortrags-) Computer installieren: apt install atool pmount screen ccze
Image auf Micro-SD-Karte brennen. Entpacken und auf SD-Karte kopieren ohne Zwischenspeicher mit acat
aus dem Paket atool:
# acat 2018-03-13-raspbian-stretch-lite.zip \
2018-03-13-raspbian-stretch-lite.img \
| dd bs=1M of=/dev/sde status=progress
$ 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.
sudo raspi-config
→ Network Options → Wi-fi
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
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
/etc/tor/torrc
editieren mit z.B. sudo $EDITOR /etc/tor/torrc
und dann bei diesem Abschnitt die Kommentarzeichen entfernen: #HiddenServiceDir /var/lib/tor/hidden_service/ #HiddenServicePort 80 127.0.0.1:80
sodass er so aussieht: HiddenServiceDir /var/lib/tor/hidden_service/ HiddenServicePort 80 127.0.0.1:80
Danach Tor die Konfiguration neu einlesen lassen: service tor reload
.
Dadurch wurde ein neues Verzeichnis /var/lib/tor/hidden_service/
angelegt. Darin befindet sich zwei Dateien: $ sudo ls -l /var/lib/tor/hidden_service/ total 8 -rw------- 1 debian-tor debian-tor 23 Mar 31 22:55 hostname -rw------- 1 debian-tor debian-tor 887 Mar 31 22:55 private_key
Der generierte Hostname im Tor-Netzwerk findet sich in der Datei /var/lib/tor/hidden_service/hostname
: $ sudo cat /var/lib/tor/hidden_service/hostname kumd43gasfh6ywxt.onion
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:
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.
$ 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.)
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.
Als erstes SSH dauerhaft aktivieren auf dem Raspberry Pi (und ein neues Passwort setzen):
sudo raspi-config
→ Change User Passwordsudo raspi-config
→ Interfacing Options → SSH(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.
/etc/tor/torrc
editieren mit z.B. sudo $EDITOR /etc/tor/torrc
und dann bei diesem Abschnitt die Kommentarzeichen entfernen: #HiddenServicePort 22 127.0.0.1:22
sodass er so aussieht: HiddenServicePort 22 127.0.0.1:22
service tor reload
.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.
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.
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.)
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.
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.).
IPv6, falls vorhanden. Meist muss man noch den Port auf dem Router in der Firewall aufmachen. Und auf einem Client ohne IPv6 dann apt install miredo
Yaler.net: Server und Client sind Open Source, wird ab CHF 10 pro Jahr auch als Hosted Service angeboten. Paketierung für Debian geplant.
Pagekite: Open Source, Programm scheint Client wie auch Server sein zu können. Hosted Service ab $4 für einen Monat, für längere Perioden preiswerter. Paket pagekite auf Debian, Raspbian, Ubuntu und anderen Debian-Derivaten.
Zerotier: Layer 2 "VPN", welches den zentralen Server auch als Hosted Service anbietet, sogar mit Einschränkungen kostenlos oder aber auch als fertige Appliance. Paketierung der Software für Debian geplant.