MIN-Fakultät
Fachbereich Informatik
Rechenzentrum

Ansprechen eines CVS-Servers durch einen SSH-Tunnel

Das “Concurrent Versions System” (CVS) wird in vielen Bereichen eingesetzt, in denen eine Versions-Kontrolle von Nutzen ist. Dabei gibt es Fälle, in denen die Clients den auf einem entfernten Rechner betriebenen CVS-Server über ein nicht gesichertes Netzwerk ansprechen. In solchen Fällen kann es sinnvoll sein, die Verbindung mit Hilfe eines geschützten Tunnels zu sichern, um sensible Daten wie z.B. zur Authentisierung verwendete Passworte (etwa bei der Verwendung von pserver) zu schützen. In diesem Text wird beschrieben, wie man eine derartige Verbindung durch das Tunneln durch eine SSH-Verbindung schützen kann.

Generelles Vorgehen

Zunächst wird eine geschützte SSH-Verbindung vom Client-Rechner zum Server-Rechner aufgebaut. Der SSH-Client wird entsprechend so konfiguriert, dass dabei ein “Port Forwarding” zwischen dem CVS-Port des Client-Rechners und dem CVS-Port des Server-Rechners erfolgt. Dies hat zur Folge, dass die am lokalen CVS-Port des Client-Rechners empfangenen Datenpakete durch einen geschützten SSH-Tunnel an den CVS-Port des Server-Rechners weitergeleitet werden. Der CVS-Client wird entsprechend so konfiguriert, dass alle Anfragen an den lokalen CVS-Port des Client-Rechners gesendet werden (als ob ein lokaler CVS-Server angesprochen werden soll). Sendet der CVS-Client eine Anfrage, so wird diese am lokalen CVS-Port vom SSH-Client gelesen und verschlüsselt durch die geschützte SSH-Verbindung an den SSH-Server auf dem Server-Rechner übertragen. Dieser entschlüsselt die Anfrage und leitet sie an den CVS-Port des Server-Rechners weiter. Antworten des CVS-Servers werden entsprechend zum CVS-Client übertragen. Dieses Vorgehen soll in Abbildung 1 verdeutlicht werden.

Abbildung 1: Darstellung des generellen Vorgehens: Ein CVS-Client auf dem Rechner “CLIENT42” stellt eine Anfrage an den lokalen CVS-Port, auf dem der lokale SSH-Client liest. Die Anfrage wird über eine gesicherte SSH-Verbindung durch ein nicht geschütztes Netzwerk vom Rechner “CLIENT42” zum Rechner “SERVER1” übertragen. Der SSH-Server auf diesem Rechner entschlüsselt die Anfrage und leitet sie an den CVS-Port weiter, auf dem der CVS-Server die Anfrage liest.

Konfiguration und Aufbau der SSH-Verbindung

Zur Vereinfachung wird in diesem Beispiel davon ausgegangen, dass der SSH- und CVS-Server auf demselben Server-Rechner laufen. Ferner wird hier davon ausgegangen, dass auch auf dem Client-Rechner der CVS-Port 2401 verwendet wird.

Vorgehen unter Windows-Clients

Es wird hier vom SSHSecureShellClient in der Version 3.2.9 von ssh.com (non-commercial version license) ausgegangen, wie er z.B. vom FTP-Server des DFN-CERT bezogen werden kann (Lizenzbestimmungen beachten!!!). Bevor die SSH-Verbindung zum Server aufgebaut wird, müssen zunächst Einstellungen zur Konfiguration des Tunnels vorgenommen werden (zur Zeit der Entstehung dieses Textes war es nicht möglich, einen Tunnel zu einer bestehenden SSH-Verbindung hinzuzufügen). Dazu unter “Settings”, “Profile Settings”, “Tunneling” den Punkt “Outgoing” wählen. Durch Anklicken von “Add...” den Dialog zum Einrichten eines neuen Tunnels öffnen. Einen beliebigen (aussagekräftigen) Namen wählen und sowohl den “Listen Port” auch den “Destination Port” mit 2401 angeben.

Abbildung 2: Einrichtung eines ausgehenden Tunnels

Der Eintrag “localhost” im Feld “Destination Host” ist in den meisten Fällen eine gute Wahl, da dies nicht aus der Sicht des Clients sondern aus der Sicht des Servers, zu dem die SSH-Verbindung aufgebaut wird, ausgewertet wird. In Einzelfällen kann es sinnvoll sein, in diesem Feld den Namen des Rechners auf dem der CVS-Server läuft einzutragen (z.B. wenn CVS-Server und SSH-Server nicht auf dem gleichen Rechner betrieben werden). In der folgenden Abbildung ist der Eintrag des fertig konfigurierten Tunnels zu sehen:

Abbildung 3: Konfiguration eines ausgehenden Tunnels

Nachdem der Tunnel konfiguriert wurde, kann die SSH-Verbindung zum Server aufgebaut werden:

Abbildung 4: Aufbau einer ssh-Verbindung zum Server

Vorgehen unter Clients mit UNIX-artigen Betriebssystemen

Um eine SSH-Verbindung mit Port-Forwarding aufzubauen, auf der Kommandozeile

ssh -L2401:localhost:2401 CVSSERVER

eingeben. Soll ausschließlich eine Verbindung für ein Port-Forwarding, ohne Möglichkeit auf dem entfernten Rechner Kommandos auszuführen, aufgebaut werden, kann die Option -N ergänzt werden.

Einloggen am CVS-Server

Beim Einloggen am CVS-Server ist zu beachten, dass nicht versucht wird, sich am CVS-Port des CVS-Servers einzuloggen. Dies hätte zur Folge, dass alle Anfragen und Antworten ungeschützt am gesicherten Tunnel vorbei übertragen werden würden. Stattdessen muss versucht werden, sich am lokalen CVS-Port anzumelden, z.B. auf der Kommandozeile mit:

cvs -d :pserver:krooss:localhost:/home/cvs login

Weitere Anwendungsmöglichkeiten eines SSH-Tunnels

Das hier aufgezeigte Prinzip, ungeschützte Verbindungen durch eine SSH-Verbindung zu tunneln, kann vielfältig eingesetzt werden. Als zusätzliches Beispiel wird im Folgenden ein möglicher Einsatz im Zusammenhang mit dem “Simple Mail Transfer Protocol” (SMTP) aufgezeigt. Ferner kann ein Einsatz bei Verbindungen zu Rechnern über einen Gateway erfolgen.

Versand von E-Mail durch einen SSH-Tunnel

In diesem Beispiel wird davon ausgegangen, dass eine E-Mail über den Mailserver einer Organisation (Unternehmen, Universität, etc.) verschickt werden soll. Das Problem besteht darin, dass sich der Client, von dem die E-Mail verschickt werden soll, nicht innerhalb des internen Netzwerks der Organisation befindet, sondern über ein nicht geschütztes Netzwerk mit dem Netzwerk der Organisation verbunden ist.

Abbildung 5: Von einem Client, der über ein nicht geschütztes Netzwerk mit dem internen Netzwerk einer Organisation verbunden ist, soll eine E-Mail über den Mail-Server der Organisation verschickt werden.

Viele Mail-Server sind so konfiguriert, dass sie ausschließlich Verbindungen von Clients annehmen, die sich innerhalb eines internen Netzwerks befinden, da bei der Annahme von Verbindungen von externen Clients nicht unterschieden werden kann, ob es sich um rechtmäßige E-Mail oder um unerwünschte kommerzielle Werbemails (UCE, Spam) handelt.

Da es sich bei einem Mail-Server um einen besonders zu schützenden Rechner handelt, soll davon ausgegangen werden, dass auf diesem keine Benutzerzugänge (Accounts) eingerichtet wurden. Der Aufbau einer direkten Verbindung zum Mail-Server ist daher nicht möglich. Es soll in diesem Beispiel aber davon ausgegangen werden, dass ein Benutzerzugang für einen anderen Rechner innerhalb des geschützten Netzwerks zur Verfügung steht. Dieser Rechner wird im Folgenden mit “SSHLOGIN” bezeichnet. Da sich dieser Rechner innerhalb des geschützten Netzwerks befindet, ist der Aufbau von SMTP-Verbindungen zum Mail-Server möglich.

Nach Eingabe des Kommandos

ssh -L 25:MAILSERVER:25 krooss@SSHLOGIN

findet ein Login per SSH auf dem Server “SSHLOGIN” statt, wobei zusätzlich ein SSH-Tunnel vom lokalen Port 25 zum Server “SSHLOGIN” aufgebaut wird. Die durch diesen Tunnel übertragenen Daten werden vom Server “SSHLOGIN” an den Port 25 des Servers “MAILSERVER” weitergeleitet. Weil Ports unter 1024 auf einigen Betriebssystemen (z.B. Linux/Unix) nicht von normalen Benutzern geöffnet werden dürfen, ist es gegebenenfalls notwendig dieses Kommando als privilegierter Benutzer (z.B. root) auszuführen oder lokal auf dem Client einen Port ab 1024 zu benutzen, z.B. mit dem Kommando

ssh -L 2525:MAILSERVER:25 krooss@SSHLOGIN

Wird anschließend eine E-Mail über den lokalen Port 25 (bzw. Port 2525) versandt, so wird diese zunächst durch den SSH-Tunnel an den Server “SSHLOGIN”, dann von diesem an den Mail-Service auf dem Server “MAILSERVER” und von diesem an den gewünschten Empfänger weitergeleitet.

Aufbau einer Verbindung zu einem Rechner über einen Gateway

In diesem Beispiel wird davon ausgegangen, dass eine SSH-Verbindung zu einem Rechner “DESTINATION” aufgebaut werden soll, der Aufbau einer direkten Verbindung aber z.B.  auf Grund einer Firewall nicht möglich ist. Stattdessen müssen Verbindungen zum Rechner “DESTINATION” über den Server “GATEWAY” aufgebaut werden.

Abbildung 6: Von einem Client, der über ein nicht geschütztes Netzwerk mit dem internen Netzwerk einer Organisation verbunden ist, soll über den Gateway-Rechner der Organisation eine Verbindung zu dem im internen Netz angebundenen Rechner “DESTINATION” aufgebaut werden.

Durch Eingabe der Kommandos

ssh -N -f -L 22:DESTINATION:22 krooss@GATEWAY
ssh krooss@localhost

wird zunächst durch das erste Kommando eine Verbindung vom Client zum Gateway aufgebaut, wobei zusätzlich ein Port-Forwarding zwischen dem lokalen Port 22 und dem Port 22 des Rechners DESTINATION eingerichtet wird. Dann wird mit dem zweiten Kommando eine Secure Shell geöffnet. Die dabei versendeten Datenpakete werden aufgrund des eingerichteten Port-Forwardings zum Rechner “DESTINATION” weitergeleitet.

In dem oben aufgeführten Beispiel wird lokal der Port 22 geöffnet. Dies kann zu Problemen führen, wenn dies nur durch privilegiert Nutzer durchgeführt werden kann oder wenn auf dem Client-Rechner ebenfalls ein SSH-Server läuft, der diesen Port bereits verwendet. Soll ein nicht privilegierter Port (>1023) verwendet werden, kann wie folgt vorgegangen werden:

ssh -N -f -L 2222:DESTINATION:22 krooss@GATEWAY
ssh -p2222 krooss@localhost

In diesem Fall wird lokal der Port 2222 geöffnet.