SSH Tunnel erstellen

Security

Ein SSH Tunnel dient dazu, einen verschlüsselten Zugriff auf Netzwerkdienste auf einem Server zu ermöglichen. Hierfür wird ein Port auf dem Server auf dem Client zur Verfügung gestellt. Der Zugriff auf dem Client erfolgt dann, als würde der getunnelte Dienst lokal laufen.

Dieses Tutorial beschreibt euch alle notwendigen Schritte um einen solchen SSH Tunnel einzurichten.

Alle Schritte dieses Tutorials habe ich auf zwei Gentoo Systemen durchgeführt. Die Befehle sollten aber generell auf alle Distributionen anwendbar sein.

Client - Benutzer anlegen und Public Key erzeugen

Um einen SSH Tunnel zu erstellen braucht man einen Nutzer. Das ROOT für so etwas ungeeignet ist, sollte jedem klar sein. Man kann einen bestehenden Benutzer nehmen oder man erstellt einen Neuen:

useradd -m -G users -s /bin/bash tunnel

In meinem Fall habe ich mich für den Benutzer “tunnel” entschieden, den ich im Laufe des Tutorials benutzen werde.

Als Nächstes erzeugen wir einen Public Key für diesen Benutzer. Wenn Ihr bereits einen für euren Benutzer habt, könnt Ihr diesen Teil einfach überspringen.

Wir wechseln in einer Konsole zu unserem Benutzer:

su tunnel

Nun erzeugen wir uns einen Private Key. Bei der Schlüssel Länge sollte man sich mindestens für 2048 Bit entscheiden. In meinem Beispiel nutze ich 4096 Bit.

ssh-keygen -b 4096

Für unseren Bedarf sollten wir auf ein Passwort für den Public Key verzichten, da wir nicht jedes mal ein Passwort bei einer Verbindung eingeben wollen oder können. Alle Abfragen werden einfach mit ENTER bestätigt. Danach solltet Ihr Folgendes sehen:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/tunnel/.ssh/id_rsa): 
Created directory '/home/tunnel/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/tunnel/.ssh/id_rsa.
Your public key has been saved in /home/tunnel/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:20THOyO+FfisaLZb1vdqyTnODnmb4lKNDw3enTiyzxg tunnel@local.net
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|           .     |
|          . o    |
|         . o..   |
|        S +.=*...|
|         = *=B+..|
|        . =EX++o |
|        o+.===B+ |
|       o+oo+oBBo.|
+----[SHA256]-----+

Weiter geht es nun mit der Einrichtung der Server Seite.

Server - Benutzer anlegen

Auch auf der Server Seite sollte ein Benutzer für den Aufbau des SSH Tunnels gewählt werden. Wenn man keinen hat, legt man einfach einen an:

useradd -m -G users -s /bin/bash tunnel

Hier nenne ich meinen Benutzer auch “tunnel”. Man kann aber einen beliebigen Namen haben. Benutzernamen müssen auch Client und Server Seite nicht identisch sein.

Public Key von Client auf Server übertragen

Auf der Client Maschine loggen wir uns als Benutzer “tunnel” ein und übertragen den Public Key auf den Server.

ssh-copy-id -i ~/.ssh/id_rsa.pub tunnel@example.org

Ihr solltet hier natürlich euren Benutzernamen verwenden, sowie den Hostnamen eures Servers. Ihr werdet dann nach dem Passwort für den Benutzer auf dem Server gefragt. Gebt dieses ein und Ihr solltet dann sehen, dass der Key korrekt übertragen wurde.

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'tunnel@example.org'"
and check to make sure that only the key(s) you wanted were added.

Also probieren wir kurzerhand uns per SSH vom Client auf den Server zu verbinden:

ssh tunnel@example.org

Nun sollte das Anmelden ohne Passwort funktionieren. Wenn dies nicht funktionieren sollte, überprüft auf dem Server die “/etc/ssh/sshd_config”, ob folgender Eintrag enthalten ist:

PubkeyAuthentication yes

Nun ist alles bereit einen SSH Tunnel zu erstellen.

SSH Tunnel erstellen

Auf der Client Maschine können wir nun mit folgendem Befehl einen Tunnel erstellen. Ihr solltet natürlich als entsprechender Nutzer (“tunnel”) angemeldet sein.

ssh tunnel@example.org -L 2234:localhost:1234 -N -f -C

Der Benutzer “tunnel” meldet sich auf dem Server (example.org) an und erstellt dann einen SSH Tunnel der Port 1234 auf dem Server als Port 2234 auf dem Client (localhost) verfügbar macht. Angenommen auf dem Server läuft auf Port 1234 ein Webserver, dann sollte nun auf dem Client dieser im Webbrowser mit “http://localhost:2234” erreichbar sein.

Am Ende des Befehls habe ich noch ein paar Parameter gesetzt, die ich kurz erläutern will:

  • Mit der Option -N wird die SSH-Verbindung auf ihre Tunnelfunktion beschränkt und es erfolgt kein Login auf eine Shell.

  • Mit der Option -f wird der SSH-Tunnel als Hintergrunddienst ausgeführt.

  • Mit der Option -C können wir zusätzlich die Datenübertragung komprimieren, um diese zu beschleunigen.

Fazit

Damit ist es uns nun möglich, beliebige Anwendungen über einen SSH Tunnel weiterzuleiten. Es sei aber angemerkt, dass bei dem Neustart der Systeme (Client / Server) die Tunnel immer wieder neu erstellt werden müssen. Sinnvoll ist es sicher, wenn man dies beim Systemstart automatisiert. Das soll jedoch kein Bestandteil dieses Tutorials sein.