Weiter zum Inhalt

Komfortabel und sicher Arbeiten mit SSH Port Forwarding

Kennen Sie das nicht auch: Sie wollen ein paar Datenbankabfrage ausprobieren oder gar modellieren und die neuen User ins frisch eingerichtete LDAP eintragen, aber als sicherheitsbewußter Nutzer werden die Dienste vom Server nur lokal angeboten und die Firewall lässt auch nur SSH und HTTP durch. Jetzt gäbe es verschiedene Ansätze. Der schnellste Weg wäre eine SSH Session zu eröffnen und auf der Shell direkt zu arbeiten. Das ist aber nicht immer die bequemste und effektivste Lösung. Dann könnten Sie eine grafische Oberfläche installieren oder „Services“ wie webmin installieren. Nun, sicherheitstechnisch ist die zweite Option – in meinen Augen – ein Disaster (Mein Webserver kann mein System herunterfahren und neue User anlegen – gruselig!). Die erste Option wäre gangbar, aber auch mit mehr Ressourcen verbunden und vor allem auch nicht unbedingt sicher (Getreu dem Motto: Lasse nur die Services laufen, die die Nutzer auch wirklich brauchen).
Ein Ausweg wäre, die lokalen Anwendungen, wie zum Beispiel die MySQL GUI Tools und das Apache Directory Studio, um bei den eingangs erwähnten Anwendungsbeispielen zu bleiben, zu nutzen. Jetzt aber die MySQL Datenbank und den LDAP öffentlich lauschen zu lassen ist eigentlich nur für Administratoren mit chronischer Langeweile interessant. Mal davon abgesehen, das die Daten danach unverschlüsselt über die Leitung gehen würden.

Idealerweise können wir die sichere SSH Sitzung und den Komfort von lokal laufenden Anwendungen mischen. Das Zauberwort lautet SSH Port Forwarding.
Das Prinzip ist simpel – wir bauen eine SSH Sitzung auf. Außer unter Windows gibt es dafür das Kommandozeilentool ssh. Unter Windows kann entweder eine cygwin Umgebung dieses Programm ebenfalls anbieten oder man greift zum guten, alten PuTTY. Mittels SSH können wir nun sowohl lokale als auch entfernte Ports ansprechen und die Daten, die an die Anwendungen gehen, welche auf diese Ports lauschen, werden verschlüsselt über die SSH Sitzung geleitet.

Zuerst möchte ich zeigen, wie dies auf *nix-Betriebssystemen funktioniert (da unter Mac OS X auch ein Unix seinen Dienst verrichtet, gilt es dort adäquat). Ich gehe dabei davon aus, das OpenSSH zum Einsatz kommt. Andere, meist kommerzielle, SSH Implementierungen sollten aber ähnliche Verfahren anbieten.

Mit dem Programm ssh kann über folgenden Befehl eine Verbindung zu einem entfernten Rechner aufgebaut werden:

ssh user@example.com

Dabei ist natürlich „user“ der Benutzername und „example.com“ durch die eigentliche Domain oder IP zu ersetzen.
Wenn wir jetzt wollen, das alle Daten für einen bestimmten Dienst über so eine Verbindung gehen, müssen wir das natürlich auch definieren. Dabei unterscheidet SSH zwischen lokaler und entfernter (remote) Portweiterleitung. Der Unterschied besteht darin, von wo nach wo man gern eine Weiterleitung haben möchte. Grundsätzlich werden bei diesen Verbindungen alle Daten von einem Port über den SSH Kanal zum anderen Rechner und Port weitergeleitet. Wenn wir wollen, das alle Anfragen auf einen bestimmten Port des entfernten Rechners weitergeleitet werden, brauchen wir eine lokale Weiterleitung. Wollen wir, das alle Daten, die auf dem entfernten Rechner auf einen Port gesendet werden, auf dem lokalen Rechner ankommen, benötigen wir eine Remote Weiterleitung.

Für das Arbeiten mit lokalen Tools auf entfernten Diensten benötigen wir also eine lokale Weiterleitung. Wir wollen, das alle Anfragen, die wir lokal auf einen Port – sagen wir 38389 – senden, auf unserem Server an den LDAP Dienst, welcher standardmäßig auf Port 389 lauscht, weitergeleitet werden. Um das zu erreichen, benötigen wir die Option -L des ssh Kommandozeilenprogramms. Mit dieser Option können wir definieren von wo lokal nach wo entfernt die Daten getunnelt werden. Wenn wir also wollen, das auf dem lokalen Rechner alle Anfragen auf Port 38389 auf dem entfernten Rechner lokal auf den Port 389 weitergeleitet werden, sieht unser SSH Kommando wie folgt aus:

ssh -L38389:localhost:389 user@example.com

Die Syntax ist etwas gewöhnungsbedürftig, lässt sich aber schnell verinnerlichen. Zuerst sagen wir, wo lokal gelauscht werden soll. Da wir auf dem lokalen Rechner (localhost) auf Port 38389 lauschen wollen, geben wir einfach 38389 als erstes an. Dann wollen wir, das die Anfragen auf dem entfernten Rechner auf Port 389 weitergeleitet werden. Dort lauscht der LDAP Server auf dem lokalen Rechner, also auch localhost. Daher geben wir localhost:389 an. Das sieht vielleicht etwas komisch aus, aber man muss einfach dabei bedenken, das diese Angabe auf dem entfernten Rechner ausgeführt wird.

Wenn Sie nun erfolgreich eine SSH Sitzung eröffnet haben, können Sie mit dem Apache Directory Studio eine neue Verbindung konfigurieren. Dabei geben Sie aber nicht den Servernamen des LDAP Servers an, sondern localhost und nutzen als Port nicht 389 sondern 38389. Dann kann SSH nämlich den Rest übernehmen.

Bei MySQL sollten Sie aber eine Besonderheit auf *nix-System beachten. Auf solchen Systemen gibt es nämlich sogenannte Unix Sockets. Per Default nutzen die MySQL Tools für lokale Verbindungen auch solche Sockets. Wir wollen aber eine TCP Verbindung. Dafür können Sie bei den Kommandozeilentools die Option –protocol=TCP nutzen. Um das nicht immer angeben zu müssen, kann im Homeverzeichnis eine .my.cnf Datei angelegt werden. Folgender Inhalt greift dann für alle MySQL Kommandozeilentools:

[client]
protocol=TCP

Leider nutzen die MySQL GUI Tools diese Einstellung nicht. Wir können uns aber eine kleine Eigenheit zu Nutze machen. Anstatt auf localhost den Port für die MySQL Portweiterleitung lauschen zu lassen nutzen wir einfach 127.0.1.1. Die meisten Linux-Distributionen lösen den vergebenen Hostnamen auch auf diese Adresse auf. Um dies zu erreichen, erweitern wir einfach die Angabe hinter -L. Im folgenden Beispiel möchte ich, das SSH Anfragen auf 127.0.1.1, also dem lokalen System, auf Port 53306 an den entfernten Host example.com auf Port 3306 (Standard MySQL Port) weitergeleitet werden. Der Verbindungsstring sieht in diesem Fall so aus:

ssh -L127.0.1.1:53306:localhost:3306 user@example.com

Im Gegensatz zum ersten Beispiel werden hier vier Werte, getrennt durch „:“, angegeben. Hinzugekommen ist die IP 127.0.1.1, diese möchten wir gern auf dem lokalen Rechner, auf welchem auch die Anwendungen laufen, nutzen um mit unseren Programmen auf die entfernten Dienste zugreifen zu können. Danach kann zum Beispiel im MySQL Query Browser als Serveradresse eben diese IP eingegeben werden.

Sie wollen mehrere Dienste nutzen und nicht mehrere SSH Sitzungen dafür eröffnen? Kein Problem! Das SSH Kommandozeilentool kommt auch mit mehreren -L Optionen zurecht. Wollen Sie zum Beispiel MySQL und den OpenLDAP Server während einer SSH Sitzung nutzen, geben Sie doch folgendes ein:

ssh -L53306:localhost:3306 -L38389:localhost:389 user@example.com

Und wie sieht es unter Windows aus?
Nun, dort kann auf PuTTY zurückgegriffen werden. Für Kommandozeilenmuffel gibt es hier sogar noch einen kleinen Bonus: Das gesamte Port-Forwarding kann nämlich über einen Dialog konfiguriert werden.

Als erstes wird der Host eingegeben, mit dem Sie sich verbinden wollen:

Geben Sie in diesem Bildschirm die Serveradresse an

Geben Sie in diesem Bildschirm die Serveradresse an

Jetzt muss aber noch festgelegt werden, welcher Port lokal mit welchem Port remote verbunden werden soll. Dazu gibt es im linken Menübaum den Punkt „Connections“ und darunter den Punkte „SSH“ mit dem Untermenüpunkt „Tunnels“. Hier kann nun das, was wir weiter oben über die Option -L mitgegeben haben, über einen Dialog eingegeben werden.

Eingabe von lokalem und externem Port in PuTTY Eingabemaske SSH / Tunnel

Eingabe von lokalem und externem Port in PuTTY Eingabemaske SSH / Tunnel

Das Bild zeigt die Eingabewerte für das Verbinden vom lokalen Port 53306 mit dem Host localhost und dem Port 3306 auf dem entfernten Rechner. Das wir eine lokale Weiterleitung konfigurieren möchten, können wir über den Radiobutton „Local“ definieren. Die Angabe zur verwendeten IP Version kann beruhigt auf „auto“ belassen werden.
Damit diese Einstellungen auch übernommen werden, muss nach der Konfiguration noch der Button „Add“ betätigt werden. Ist dies geschehen, können weitere Port-Weiterleitungen konfiguriert werden. Nach Konfiguration für unsere Beispiele MySQL und LDAP könnte der Dialog so aussehen:

Portweiterleitungen für MySQL und LDAP in PuTTY Dialog übernommen

Portweiterleitungen für MySQL und LDAP in PuTTY Dialog übernommen

Wenn Sie diese Schritte alle befolgt haben und jetzt die Verbindung mittels „Open“ starten, können Sie auch unter Windows mit den Tools Ihrer Wahl arbeiten und sich sicher sein, das die Daten weder unverschlüsselt durch das World Wide Web versendet werden, noch das Ihr Server alle Dienste nach außen anbieten muss.

Und jetzt viel Spass und Erfolg mit dem neuen Arbeitsmittel.

{ 1 } Comments

  1. Max | 26. Juli 2012 um 10:44 | Permalink

    Danke, jetzt habe ich das weiterleiten über SSH verstanden!

{ 1 } Trackback

  1. […] […]

Kommentar verfassen

Dein E-Mail wird nicht veröffentlicht oder weitergegeben. Pflichtfelder sind mit * markiert.

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close