Der Einsatz und das Zusammenspiel mehrerer Rechner wie etwa Laptops, Kleinstrechner und Server für alle möglichen Zwecke wird auch im privaten Bereich immer alltäglicher. Eine Verwendung von SSH ist dabei elementar für den sicheren Umgang mit Dateien und Programmen über Rechnergrenzen hinweg. Dieses Dokument führt dazu wesentliche Handgriffe anschaulich zusammen.
Vorbemerkungen
Wer mehrere Rechner mit Linux oder macOS verwendet, findet in Secure Shell (SSH) einen sehr nützlichen Begleiter. Insbesondere die Nutzung von SSH auf der Kommandozeile [7, 8] lässt viele Alltagsschritte schnell und einfach von der Hand gehen und eignet sich auch bestens für die Automatisierung. Der vorliegende Beitrag erklärt die Grundbegriffe des Umgangs mit SSH und schildert einige Handgriffe zur Konfiguration, die jene Alltagsschritte und Automatisierungen beträchtlich erleichtern.
Dabei steht die Public-Key-Authentifizierung besonders im Fokus, da sie sicheren Umgang mit mehreren Rechnern ermöglicht, ohne, dass Nutzer für jeden einzelnen Verbindungsaufbau viele unterschiedliche und komplizierte Kennworte nachhalten und handhaben müssen.
- Abkürzung
-
Wer die Zusammenhänge kennt und nur einen »Spickzettel« gebräuchlichster Befehle sucht, kann direkt zur Zusammenfassung springen.
Konzept
Hinter SSH steht das Konzept, Befehle auf der Kommandozeile (»Shell«) eines lokalen Rechners zu formulieren, die an einen anderen, über das Netz erreichbaren Rechner gerichtet sind. Das »Secure« in Secure Shell steht für die hierbei eingesetzte Verschlüsselung der Kommunikation, die dafür sorgt, dass aller Austausch zwischen besagten Rechnern nicht von Dritten verfolgt und mitgelesen werden kann.
Auf diese Weise entsteht eine gegen Einblicke Dritter gesicherte Fernsteuerung, bei der von der Kommandozeile eines anderen Rechners aus eine Maschine bedient wird, als würde die betreffende Maschine direkt über ihre eigenen Bedienelemente gesteuert und nicht aus der Ferne über eine Netzwerkverbindung.
Der Mechanismus liefert zudem die Grundlage für die sichere Dateiübertragung und damit auch für Funktionen wie Synchronisiserung oder Datensicherung.
Voraussetzungen
Zur Verwendung von SSH zur Fernsteuerung eines entfernten Rechners muss auf dem Rechner, der ferngesteuert wird, ein SSH-Server wie zum Beispiel das Programm openssh-server
installiert sein und laufen [1, 2]. Auf dem Rechner, von dem aus der entfernte Rechner ferngesteuert wird, muss ein SSH-Client installiert sein, was beim Mac und den meisten Linux-Versionen bereits der Fall ist.
Eine solche Konfiguration lässt sich auch wechselseitig anlegen, womit dann beide Rechner sowohl ferngesteuert werden als auch als Fernsteuerung dienen können.
Begrifflichkeiten
Dokumentation zur Public-Key-Authentifizierung orientiert sich in der Regel am technischen Verfahren, das für den Zugang zu einem Rechner einen privaten und einen öffentlichen Schlüssel einsetzt. Dieses Bild ist aber zur Erklärung des Ablaufs rein sprachlich nicht so gut geeignet wie zum Beispiel das sprachliche Bild eines Schlosses zum Öffnen einer Tür, zu dem ein Schlüssel passt.
Für dieses Dokument werden deshalb die Begriffe Tür
, Schloss
und Schlüssel
anstelle von port
, public key
und private key
verwendet.
Nutzungsablauf
Die Nutzung von SSH läuft allgemein beschrieben wie folgt ab.
-
Mit dem Start des Programmes
openssh-server
auf dem Rechner, der ferngesteuert werden soll, dem Server, richtet der Server eine Tür mit der Nummer 22 ein und lauscht auf Verbindungsanfragen. -
Der Server fungiert ab da als Türsteher, der mittels Authentifizierung und Autorisierung dafür sorgt, dass nur Anfragen befugter Nutzer durch Tür Nummer 22 eingelassen werden, andere Anfragen werden abgewiesen.
-
Auf dem Rechner, der als Fernsteuerung dient, dem Client, wird auf der Kommandozeile das Programm
ssh
aufgerufen, wodurch eine Verbindungsanfrage an den Server gesendet wird. Der Client klopft quasi an die Tür Nummer 22 des Servers. Beispiel:ssh fred@mein-server
-
Der Server antwortet mit seinem Fingerprint und der Aufforderung zur Authentifizierung, z.B., indem für den bei der Verbindungsanfrage angegebenen Benutzernamen das Kennwort abgefragt wird.
-
Der Client vergleicht den Fingerprint des Servers mit dem lokal gespeicherten.
-
Wurde der Server erstmals kontaktiert, wird der Benutzer vom Client gefragt, ob er der Maschine mit diesem Fingerprint vertrauen möchte [vgl. 3]. Wenn ja, speichert der Client den Fingerprint des Servers für spätere Verbindungsaufnahmen.
-
Wird der Fingerprint des Servers vom Client akzeptiert und ist das daraufhin vom Nutzer auf dem Client abgefragte und an den Server geschickte Kennwort richtig, etabliert der Server die SSH-Verbindung mit dem Client und öffnet die Tür Nummer 22 für Anfragen des Clients.
-
Vom Nutzer auf dem Client eingegebene Kommandos werden nun vom Client durch Tür Nummer 22 an den Server gereicht und vom Server ausgeführt. Das Funktioniert für alle Kommandos wie z.B.
ls
,cp
,mv
oderchmod
, usw. Antworten vom Server werden durch Tür Nummer 22 zurück an den Client gereicht und erscheinen auf der Kommandozeile des Clients, ganz so, als ob die Kommandozeile des Clients die des Servers wäre. -
Trifft ein auf dem Client eingegebenes Kommando
exit
beim Server ein, beendet dieser die SSH-Verbindung und schließt die Tür Nummer 22 zum Client. Das Programmssh
auf dem Client wird beendet.
Der oben beschriebene Ablauf ermöglicht nicht nur eine gegen Einblicke Dritter gesicherte Fernsteuerung. Er stellt mit dem Fingerprint-Abgleich auch sicher, dass kein unbefugter Dritter sich beim Verbindungsaufbau als Server ausgegeben kann.
Vereinfachungen
Was die Nutzung von SSH erst so richtig effizient werden lässt, ist deren Kombination mit der Public-Key-Authentifizierung. Hierzu wird auf dem Client ein Paar aus Schlüssel und Schloss erzeugt und das Schloß in die Tür Nummer 22 des Servers eingebaut (vgl. Nutzungsablauf).
Mit dem auf dem Client abgelegten Schlüssel kann anschließend eine Verbindung ohne weiteres Zutun des Nutzers hergestellt werden. Es genügt der Befehl
ssh mein-server
und schon ist eine Kommandozeile auf dem lokalen Rechner mit dem Server verbunden und kann zu dessen Fernsteuerung dienen.
Die Schritte dahin sind nachfolgend beschrieben.
Schloss und Schlüssel erzeugen
Zum Erzeugen von Schloss und Schlüssel wird folgendes Kommando verwendet
ssh-keygen -t rsa
Die hierbei im Dialog u.a. abgefragte Passphrase muss einstweilen nicht angegeben werden. Es entsteht ein Paar aus Schloss und Schlüssel, das auf dem Client in der Datei ~/.ssh/id_rsa
gespeichert wird.
Schloss einbauen
Damit anstelle einer Abfrage des Kenwortes der Schlüssel des Clients auf dem Server zum Öffnen der Tür Nummer 22 verwendet werden kann, muss das Schloss, das sich mit dem Schlüssel des Clients öffnen lässt, auf dem Server eingebaut werden (vgl. Nutzungsablauf). Dies gelingt vom Client aus mit dem Befehl
ssh-copy-id fred@mein-server
So wird das Schloss, das zum Schlüssel in der Datei ~/.ssh/id_rsa
des lokalen Rechners passt, in die Tür Nummer 22 des Servers mein-server
eingebaut. Dafür wird im Zuge dessen einmalig das Kennwort des Benutzers fred
vom Server abgefragt.
Anschließend genügt für den Verbindungsaufbau zum Rechner mein-server
der Befehl ssh mein-server
. Der lokale Rechner verwendet dann stets den lokal hinterlegten Schlüssel zum Öffnen des Schlosses der Tür 22 von mein-server
. Der Nutzer muss nicht mehr bei jedem Verbindungsaufbau sein Kennwort eintippen.
Konfiguration
Sollen vom Client mehrere Server auf diese Weise ferngesteuert werden, bedarf es einer Konfigurationsdatei. Diese wird auf dem Client als Datei ~/.ssh/config
angelegt und ist wie folgt aufgebaut.
~/.ssh/config
Host mein-server HostName 12.345.678.90 User fred Port 22 IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes ForwardAgent no PreferredAuthentications publickey Host example.com HostName 90.876.543.21 User bob Port 22 IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes ForwardAgent no PreferredAuthentications publickey
Der Befehl zum Einbau des Schlosses muss dann vom Client aus an jeden in der Konfiguration befindlichen Server gerichtet werden.
ssh-copy-id fred@mein-server ssh-copy-id bob@example.com
Schlüssel absichern
Wird beim Erzeugen von Schloss und Schlüssel wie zuvor beschrieben keine Passphrase angegeben, kann die Kopie der Datei ~/.ssh/id_rsa
von jedem verwendet werden, um den Server fernzubedienen. In vielen Fällen dürfte die Ablage der Datei auf dem lokalen Rechner dennoch auch ohne Verwendung einer Passphrase ausreichenden Schutz vor Missbrauch bieten, da beispielsweise Daten auf der Festplatte eines Macs mit Apple Silicon verschlüsselt abgelegt und nur mittels Face ID oder Touch ID zugänglich sind.
In Fällen, wo trotzdem der Schlüssel noch zusätzlich abgesichert werden soll, muss bei der Erzeugung von Schloss und Schlüssel die Abfrage der Passphrase mit einer entsprechenden Eingabe ausgefüllt werden. Die Passphrase wird dann jedesmal abgefragt, wenn der Schlüssel genutzt wird.
Um mit dieser Abfrage der Passphrase nicht den Vorteil einzubüßen, dass zur Anmeldung am Server kein Passwort abgefragt wird, kann die Passphrase im Schlüsselbund (Linux) oder der App »Passwörter« (macOS) gespeichert werden. Beides sorgt bei jeder Abfrage der Passphrase dafür, dass diese vom Client automatisch angegeben wird, beim Mac beispielsweise unter Abruf der Face ID oder Touch ID.
Allerdings ist die Verwendung einer Passphrase nicht für die Nutzung in Skripten geeignet. Für den Einsatz in Skripten sollte auf eine Passphrase verzichtet werden. (Wer hier Rat weiß: Bitte gern Hinweise melden, wie sich eine Absicherung per Passphrase mit Skripten verwenden oder wie sich sonst eine Absicherung im Falle der Verwendung von SSH in Skripten erzielen lässt).
Dateiübertragung mit sftp
Auf die Fernsteuerung via SSH setzen auch Funktionen des Programms sftp
(»Secure File Transfer«) für das sichere Übertragen von Dateien von einem Rechner zum anderen auf. Ist SSH wie zuvor beschrieben eingerichtet, genügt das Kommando
sftp mein-server
zur Verbindung des lokalen Rechners mit dem Rechner mein-server
. Das Kommando
put /pfad/zur/quelldatei /pfad/zur/zieldatei
überträgt dann eine Datei von einem Pfad auf dem lokalen Rechner zu einem Pfad auf dem Zielrechner. Das funktioniert auch mit ganzen Ordnern und deren Inhalt.
Mit get
anstelle von put
können Dateien heruntergeladen werden. Während die Verbindung über sftp
anliegt, gelingt die Navigation auf dem entfernten Rechner mit den Kommandos ls
(list) und cd
(change directory) sowie mit lls
und lcd
auf dem lokalen Rechner. Wie bei SSH trennt ein exit
die Verbindung und beendet das Programm.
Synchronisierung mit rsync
Ein weiteres sehr verbreitet eingesetztes Programm ist rsync
zur Synchronisierung von Datenbeständen [5]. Weniger bekannt ist, dass rsync
auch über Rechnergrenzen hinweg eingesetzt werden kann. Hierfür wird im Kommando zum Aufruf von rsync
den Parametern von Quelle und Ziel der Name des Rechners hinzugefügt. Ein Aufruf von beispielsweise
rsync -avz fred@example.com:/~ ~/data/bak/example-com
veranlasst den lokalen Rechner, den gesamten Inhalt des Verzeichnisses des Benutzers fred
auf dem Rechner example.com
mit dem Ordner data/bak/example-com
im Benutzerverzeichnis des lokalen Rechners zu synchronisieren.
Die Verbindung zum entfernten Rechner und die Absicherung der Kommunikation per Verschlüsselung basiert dabei auf SSH und wird von rsync
ohne Abfrage eines Kennwortes eingesetzt, sofern eine passende Konfiguration sowie ein Schlüssel hinterlegt und dessen Schloss auf dem Zielrechner eingebaut sind.
Zusammenfassung
Hier noch einmal eine Übersicht der in diesem Dokument betrachteten Befehle.
Einrichtung
Schlüssel und Schloss zur vereinfachten Anmeldung erzeugen
ssh-keygen -t rsa
Ablageort des Schlüssels für die vereinfachte Anmeldung an einem anderen Rechner
~/.ssh/id_rsa
Die lokale SSH-Konfiguration ändern
nano ~/.ssh/config
Schloss für SSH in Tür 22 von mein-server
einbauen
ssh-copy-id fred@mein-server
Nutzung
Verbindung zur Fernbedienung von mein-server
aufbauen
ssh mein-server
Verbindung zu mein-server
herstellen um Dateien zu übertragen
sftp mein-server
Dateien oder Ordner hochladen
put /pfad/zur/quelldatei /pfad/zur/zieldatei
Dateien oder Ordner herunterladen
get /pfad/zur/quelldatei /pfad/zur/zieldatei
Die SSH- oder SFTP-Verbindung zu mein-server
schließen
exit
Dateien mit example.com
synchronisieren
rsync -avz fred@example.com:/~ ~/data/bak/example-com
Weitere Befehlsvarianten und ihre vollständige Dokumentation sind beispielsweise über das Wiki von Ubuntuusers zu finden [4].
Automatisierung
Die Synchronisierung von Dateien ist nur ein Bereich, von dem ausgehend sich auch eine Automatisierung herstellen lässt. Beispielsweise kann das dort beschriebene Kommando in einem Skript eingesetzt werden und vereinfacht die Synchronisierung, weil so nicht immer das längliche Kommando getippt werden muss.
#!/bin/sh rsync -avz fred@example.com:/~ ~/data/bak/example-com
Wird das obige Skript als Datei ~/bin/sync-example
gespeichert, genügt zum Auslösen einer Synchronisierung das Kommando
~/bin/sync-example
Ebenso lässt sich dieser Aufruf der Synchronisierung beispielsweise zeitgesteuert ausführen. Dann muss lediglich der obige Skript-Aufruf als Kommando in die Crontab [6] des lokalen Rechners aufgenommen werden.
Es lassen sich zahllose Einsatzmöglichkeiten für eine Automatisierung denken, denen jeweils gemeinsam ist, dass sie mit Hilfe der hier beschriebenen Konfigurationen ohne die Abfrage eines Kennwortes über Rechnergrenzen hinweg ablaufen können.
Schlussbemerkungen
SSH ist ein mächtiges und elemantares Werkzeug für den Umgang mit mehreren Rechnern über Rechnergrenzen hinweg. Das Zusammenspiel von ssh
mit sftp
und rsync
erhöhen die Leistungsfähigkeit beträchtlich.
Mit dem Einsatz der Public-Key-Authentifizierung können viele Rechner von einem einzelnen Gerät aus gleichzeitig bedient werden ohne dass Passwortabfragen die Bequemlichkeit oder die vielfältigen Möglichkeiten der Automatisierung stören.
SSH und die Kommandozeile machen für viele alltägliche Verrichtungen den Einsatz zusätzlicher Programme überflüssig. Eine Dokumentation wie diese lässt auch bei nur gelegentlicher Nutzung die wesentlichen Elemente der Verwendung von SSH überschaubar bleiben.