16.2Auf anderen Rechnern arbeiten (SSH)
Die Programme telnet, rlogin und ssh ermöglichen es, so auf einem anderen Rechner zu arbeiten, als stünde er vor Ihnen. Das funktioniert sowohl für kommandoorientierte Programme als auch für X-Programme. Dieser Abschnitt beschränkt sich auf die Beschreibung von ssh (Secure Shell). Die älteren Programme telnet und rlogin sollten aus Sicherheitsgründen nicht mehr eingesetzt werden. Sie übertragen die Login-Informationen inklusive des Passworts unverschlüsselt.
Die Grundvoraussetzung für die Anwendung von ssh besteht darin, dass auf dem zweiten Rechner ein SSH-Server läuft, also das Programm sshd. Bei manchen Linux-Distributionen ist dies standardmäßig der Fall, bei anderen muss das Programm (zumeist als Paket openssh-server) zuerst installiert werden. Wenn auf den Rechnern Firewalls laufen, dürfen diese den Port 22 nicht blockieren.
Einen eigenen SSH-Server einrichten
Informationen zur Installation, Konfiguration und Absicherung eines SSH-Servers folgen in Kapitel 32, »Secure Shell (SSH)«. Dort erfahren Sie auch, wie Sie den SSH-Server absichern.
Wenn Sie auf dem Rechner uranus arbeiten und nun eine Shell-Session auf dem Rechner mars starten möchten, führen Sie zum Verbindungsaufbau das folgende Kommando aus:
Beim ersten Verbindungsaufbau zu einem neuen Rechner erscheint eine Warnung nach dem folgenden Muster:
Das bedeutet, dass ssh sich nicht sicher ist, ob es dem Rechner mars mit der IP-Adresse 192.168.0.10 vertrauen darf. Es könnte sein, dass ein fremder Rechner vortäuscht, mars zu sein. Wenn Sie die Rückfrage mit yes beantworten, speichert ssh den Namen, die Adresse und den RSA-Fingerprint (einen Code zur eindeutigen Identifizierung des Partnerrechners) in ~/.ssh/known_hosts.
Falls Sie auf mars unter einem anderen Login-Namen als auf uranus arbeiten möchten (z.B. als root), geben Sie den Namen mit der Option -l an:
SSH-Authentifizierung mit Schlüsseln
Wesentlich sicherer als ein Login mit Passwort ist die Authentifizierung durch einen Schlüssel. Die Vorgehensweise wird im Detail in Abschnitt 32.4 beschrieben. Die Verwendung von Schlüsseln ermöglicht es auch, auf SSH basierende Kommandos und Scripts automatisch per Script auszuführen.
Statt ssh interaktiv zu nutzen, können Sie auf dem entfernten Rechner auch einfach nur ein Kommando ausführen. Das Kommando und seine Parameter werden einfach als weitere Parameter an ssh übergeben. ssh endet nach diesem Kommando.
Aus dieser scheinbar trivialen Funktion ergeben sich weitreichende Möglichkeiten: Sie können nun beispielsweise auf dem entfernten Rechner tar starten, das damit erstellte Archiv an die Standardausgabe weiterleiten (geben Sie dazu einen Bindestrich - nach der Option -f ein, also -f -) und die Standardausgabe mit | als Eingabe für ein zweites tar-Kommando verwenden, das lokal läuft. Damit können Sie einen ganzen Verzeichnisbaum sicher via SSH kopieren.
Das folgende Kommando zeigt, wie ich den gesamten /var/www-Verzeichnisbaum meines Webservers kofler.info in das lokale Verzeichnis ~/bak kopiere. Das Kommando setzt voraus, dass alle Dateien in /var/www vom Benutzer username gelesen werden können.
Grundsätzlich kann in einer SSH-Session auch ein Programm mit grafischer Benutzeroberfläche ausgeführt werden. Das Programm läuft dann auf dem entfernten Rechner, wird aber auf dem lokalen Rechner angezeigt und empfängt dort auch alle Tastatur- und Mauseingaben. Da das gesamte Protokoll des X-Window-Grafiksystems nun über das Netzwerk läuft, ist eine gute Netzwerkverbindung erforderlich, damit komfortabel gearbeitet werden kann.
Damit ssh X-Programme ausführen kann, muss es mit der Option -X gestartet werden. (Wenn /etc/ssh_config die Zeile ForwardX11 yes enthält, kann auf die Option -X verzichtet werden.) ssh kümmert sich selbstständig um die korrekte Einstellung der DISPLAY-Variablen.
Die folgenden Kommandos bewirken, dass auf dem Rechner mars der Editor XEmacs gestartet wird. Das Editorfenster wird aber auf dem Desktop des Rechners uranus sichtbar und kann dort bedient werden. Das funktioniert selbst dann, wenn auf dem Rechner mars gar kein X-Server läuft. Alle X-Bibliotheken müssen aber installiert sein!
Um eine Datei via SSH über das Netzwerk zu kopieren, gibt es das Kommando scp. Die Syntax sieht so aus:
Damit wird die Datei filename1 vom Rechner host1 zum Rechner host2 übertragen und dort in der Datei filename2 gespeichert. Einige Anmerkungen zu den vielen optionalen Bestandteilen der Kopieranweisung:
-
host1 und host2 müssen nicht angegeben werden, wenn der lokale Rechner (also localhost) gemeint ist.
-
user1 muss nicht angegeben werden, wenn der aktive Benutzer gemeint ist.
-
user2 muss nicht angegeben werden, wenn auf dem Rechner host2 der aktuelle Benutzername von host1 bzw. user1 verwendet werden soll.
-
filename1 darf auch ein Verzeichnis sein. Sie müssen dann die Option -r angeben, damit das gesamte Verzeichnis mit allen Unterverzeichnissen übertragen wird.
-
filename2 muss nicht angegeben werden, wenn der Dateiname unverändert bleiben soll. Die Datei wird dann in das Home-Verzeichnis von user2 kopiert.
Statt filename2 kann auch das Zielverzeichnis angegeben werden, wobei wie üblich ~ für das Home-Verzeichnis von user2 verwendet wird.
Zum Abschluss noch ein Beispiel: Nehmen Sie an, die Benutzerin gabi arbeitet auf dem Rechner uranus. Sie will die Datei abc.txt in das Verzeichnis ~/efg auf dem Rechner mars übertragen. Das scp-Kommando sieht so aus:
Falls Sie beim scp-Kommando eine IPv6-Adresse angeben wollen, müssen Sie diese in eckige Klammern stellen. Andernfalls kommt scp mit den vielen Doppelpunkten durcheinander.
SFTP (Secure FTP) ist eine auf SSH basierende sichere Variante zum Protokoll FTP. Details zu SFTP folgen im nächsten Abschnitt, der die Übertragung von Dateien via FTP und HTTP zum Thema hat.
Eine SSH-Anwendungsmöglichkeit für fortgeschrittene Linux-Anwender ist der Tunnelbau. Derartige Tunnel eignen sich zwar nicht als Transportmöglichkeit für Autos oder Züge, sie ermöglichen aber die Übertragung aller IP-Pakete, die an einen bestimmten Port gerichtet sind. SSH-Tunnel bieten damit einen sicheren Weg, um IP-Pakete zwischen zwei Rechnern zu übertragen – und das selbst dann, wenn sich zwischen den beiden Rechnern eine Firewall befindet, die den Port eigentlich blockiert. Eine Einführung in die Welt der IP-Pakete und eine Erklärung des Begriffs Port finden Sie in Kapitel 38, »Firewalls«.
Wenn der Tunnelbau vom Client-Rechner aus erfolgt, kommt die Option -L localport:localhost:remoteport zum Einsatz. Beispielsweise bewirkt das folgende Kommando, dass der Port 3306 des Rechners mars über den Port 3307 des lokalen Rechners zugänglich ist. Durch das Kommando wird gleichzeitig eine SSH-Session gestartet, was Sie durch -N aber verhindern können (wenn Sie nur den Tunnel, aber keine Shell benötigen). Falls der Login bei mars unter einem anderen Namen erfolgen soll, müssen Sie den Login-Namen wie üblich durch -l name oder durch name@remotehost angeben.
Der Tunnel bleibt so lange offen, bis die SSH-Session mit (Strg)+(D) beendet wird. Falls Sie ssh mit der Option -N gestartet haben, muss das Programm mit (Strg)+(C) gestoppt werden.
3306 ist der übliche Port von MySQL. Sie können nun auf dem Rechner uranus über dessen Port 3307 auf den MySQL-Server zugreifen, der auf mars läuft. Beim mysql-Kommando müssen der Port 3307 und der Hostname 127.0.0.1 angegeben werden, damit der SSH-Tunnel tatsächlich benutzt wird. Standardmäßig stellt mysql lokale Verbindungen über eine Socket-Datei her.
Damit der MySQL-Login funktioniert, müssen zwei Voraussetzungen erfüllt sein:
-
Erstens muss der MySQL-Server auf dem Rechner mars grundsätzlich IP-Verbindungen akzeptieren. Der MySQL-Server kann aus Sicherheitsgründen auch so konfiguriert sein, dass Verbindungen nur über eine Socket-Datei möglich sind. Dann hilft ein Tunnel nicht weiter, weil ein Tunnel nur Ports verbinden kann.
-
Zweitens muss der MySQL-Server die Kombination aus Login-Name und Hostname akzeptieren. Als Hostname wird der Name des Rechners verwendet, zu dem ssh den Tunnel errichtet hat – hier also mars bzw. mars.sol, wenn die Domain sol lautet.
Es gibt noch weit mehr und oft viel komplexere Anwendungsmöglichkeiten für SSH-Tunnel. Beispielsweise können Sie die Tunnel dazu verwenden, um ein Virtual Private Network zu bilden. Weiterführende Dokumentation finden Sie z.B. hier:
http://www.tldp.org/HOWTO/VPN-HOWTO
Mit dem Kommando sshfs, das sich bei vielen Distributionen im gleichnamigen Paket befindet, können Sie das Dateisystem eines externen Rechners in den lokalen Verzeichnisbaum integrieren. Das kann beispielsweise die Durchführung von Backups vereinfachen.
Beachten Sie aber, dass Sie im SSH-Dateisystem wegen der Verschlüsselung aller Daten zumeist einen geringeren Durchsatz als mit Samba oder NFS erzielen werden. Das SSH-Dateisystem ist deswegen für den Einsatz in lokalen Netzwerken nur bedingt geeignet. Ich habe zudem die Erfahrung gemacht, dass sshfs auf kurzzeitige Netzwerkausfälle allergisch reagiert und dann hängen bleibt. Ich bin deswegen vom Einsatz dieses an sich praktischen Dateisystems wieder abgekommen.
telnet
Ein Vorgänger von ssh war telnet. Da telnet keine Daten verschlüsselt, sollte das Kommando auf keinen Fall dazu verwendet werden, um auf externen Rechnern zu arbeiten. Aktuelle Linux-Distributionen lassen dies standardmäßig ohnedies nicht zu, aber man stößt immer wieder auf Router, ADSL-Modems etc., die diese Art der Kommunikation zulassen.
Der Grund, warum ich Ihnen hier telnet überhaupt präsentiere, ist ein anderer: telnet eignet sich gut dazu, um zu überprüfen, ob auf einem externen Rechner auf einem bestimmten Port ein Netzwerkdienst läuft und auf einen Verbindungsaufbau wartet. Beispielsweise können Sie mit telnet sicherstellen, dass der zuvor eingerichtete Mail-Server tatsächlich läuft. Dazu übergeben Sie an telnet den Namen oder die IP-Adresse des Servers sowie die Port-Nummer: