Die Abkürzung SSH steht für "Secure Shell" und bezeichnet sowohl das Protokoll als auch das Programm selbst. Auf vielen Plattformen, darunter auch Linux, bietet die vom OpenBSD-Projekt entwickelte Programmsammlung OpenSSH [1] alles, was Sie für die verschlüsselten Verbindungen benötigen: Kommandozeilentools zum Arbeiten auf entfernten Rechnern, die Möglichkeit, Programme remote auszuführen (auch grafisch, mittels X11-Weiterleitung), andere Internetdienste über SSH zu "tunneln" (und damit gegen Lauschangriffe abzusichern), Tools zum sicheren Kopieren von Daten und vieles mehr. Die Tabelle "OpenSSH-Suite" zeigt eine Übersicht der wichtigen Anwendungen.
Die Installation gestaltet sich unproblematisch, denn OpenSSH zählt zu den festen Bestandteilen jeder aktueller Linux-Distribution. Die meisten Systeme bieten für den Client und den Server zwei verschiedene Pakete an. Während der Client meistens vorinstalliert ist, müssen Sie den Server oft nachträglich einrichten, falls Sie von anderen Rechnern aus auf Ihren Linux-Computer per SSH zugreifen möchten. Eine Suche im Paketmanager nach openssh hilft in der Regel weiter.
Das grundlegende Arbeiten mit ssh und scp sowie das Erstellen von SSH-Schlüsseln und erste Schritte mit dem SSH-Agenten zeigt ein älterer Artikel [2]. Diese Folge geht einen Schritt weiter und verrät, was es mit Hostkeys auf sich hat und wie Sie den Fingerabdruck dieser Schlüssel prüfen, wie Sie private Schlüssel mit dem SSH-Agent (auch zeitlich begrenzt) verwalten, wie Sie mit dem eingebauten SOCKS-Proxy SSH-Verbindungen tunneln und wie Sie mit Secure FTP interaktiv Daten übertragen.
OpenSSH-Suite
| Programm | Funktion |
|---|---|
ssh
|
Der Kommandozeilenclient ssh baut verschlüsselte Verbindungen zu entfernten Rechnern auf und führt auf Wunsch auch direkt Befehle aus.
|
scp
|
Mit scp ("secure copy") kopieren Sie Dateien (nicht-interaktiv) lokal, zu oder von entfernten Rechnern.
|
sftp
|
Der FTP-Client ("secure FTP") ermöglicht interaktive Kopieraktionen: Wie bei anderen Kommandozeilen-FTP-Clients stehen neben Kopierfunktionen zahlreiche weitere Möglichkeiten zur Verfügung, wie Verzeichniswechsel und -listings, Änderung von Zugriffsrechten, Löschen von Verzeichnissen oder Dateien und vieles mehr. |
sshd
|
Der SSH-Server sshd ist als Daemon implementiert und lauscht standardmäßig auf Port 22. Die SSH-Clients bauen Verbindungen mit dem sshd auf.
|
ssh-keygen
|
Das Tool erstellt und konvertiert SSH-Schlüssel. |
ssh-keysign
|
Hilfsprogramm, das bei der Host-basierten Authentifizierung zum Einsatz kommt. |
ssh-keyscan
|
Mit dieser Anwendung zeigen Sie öffentliche Hostkeys an und hängen sie an die Datei ~/.ssh/known_hosts an.
|
ssh-agent
|
Der SSH-Agent verwaltet private SSH-Schlüssel und vereinfacht den Umgang mit Passwörtern. |
ssh-add
|
Das Tool macht den ssh-agent mit neuen Schlüsseln bekannt.
|
Beim Erstkontakt verrät die Gegenseite den Fingerabdruck ihres öffentlichen Hostkeys (Abbildung 1). Die Warnung, dass die Authentizität des Rechners nicht gesichert sei, müssen Sie explizit durch Eingabe von yes bestätigen. Erst danach geht's weiter, und die Gegenstelle fordert das Passwort an.
Die Hostkeys des fremden Systems landen in der Datei ~/.ssh/known_hosts. Sobald Sie sich erneut auf dem Rechner einloggen, prüft SSH, ob der Schlüssel noch stimmt, und verweigert die Zusammenarbeit, wenn das nicht der Fall ist: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!. In einem solchen Fall kann es sich um böswillige Absicht und einen so genannten Man-in-the-middle-Angriff handeln; ein nicht mehr passender Hostkey hat aber oft ganz harmlose Gründe: Der Administrator hat den Schlüssel geändert oder das System neu installiert. Sind Sie sich sicher, dass das der Fall ist, greifen Sie zum Texteditor, öffnen die Datei ~/.ssh/known_hosts und löschen den entsprechenden Eintrag.
Im Verzeichnis /etc/ssh finden Sie sowohl den privaten als auch den öffentlichen Hostkey. Hat ein Administrator den Fingerabdruck des öffentlichen Schlüssels (/etc/ssh/ssh_host_rsa_key.pub) vorher bekannt gemacht, können Sie ihn beim Erstkontakt vor dem Akzeptieren überprüfen. Bei der Bestimmung des Fingerabdrucks hilft das Tool ssh-keygen. Mit der Option -l zeigen Sie den Fingerabdruck eines öffentlichen Schlüssels an, den Sie auf Anforderung angeben. Möchte der Administrator des Rechners macnugget, auf dem sich petronella von samesame aus einloggen möchte (Abbildung 1), den Fingerabdruck des Hostkeys herausfinden, geht er so vor, wie in Listing 1.
# ssh-keygen -l Enter file in which the key is (/root/.ssh/id_rsa): /etc/ssh/ssh_host_rsa_key 2048 a0:0a:aa:3b:d3:08:f1:90:45:4f:48:c9:f6:cb:92:37 /etc/ssh/ssh_host_rsa_key.pub
Der Artikel unter [2] beschreibt ausführlich, wie Sie einen SSH-Schlüssel anlegen und damit unter anderem eine Authentifizierung ohne Passworteingabe ermöglichen. Die gesparte Tipparbeit erkaufen Sie aber unter Umständen teuer: Der lokale, private Schlüssel bleibt ungesichert und öffnet einem Angreifer Tür und Tor, falls er in die falschen Hände gerät. Einen gesunden Mittelweg beschreitet das Programm ssh-agent: Es übernimmt die Verwaltung privater Schlüssel. So müssen Sie das Kennwort nur noch einmal pro Schlüssel zu Beginn einer ssh-agent-Sitzung eingeben.
Der Agent ist vielseitig: Er verrichtet entweder als Daemon im Hintergrund seine Arbeit oder lässt sich gezielt zum Aufruf einzelner Programme verwenden. Als zusätzliches Sicherheitsfeature lässt sich für den ssh-agent in beiden Anwendungsfällen mit der Option -t ein Timer einschalten. Nach dem Ablauf einer so festgelegten Zeitspanne "vergisst" der Agent die gespeicherten Schlüsselkennwörter. Hinter dem Parameter -t geben Sie die Lebensdauer der Passwörter an. ssh-agent versteht die verschiedensten Einheiten: Keine Angabe oder s bedeutet Sekunden, m Minuten, h Stunden, d Tage und w Wochen.
Um den Agenten als unabhängigen Daemon zu starten und ihn so zu konfigurieren, dass er neu hinzugefügte Schlüssel jeweils nach zwei Tagen vergisst, lautet der Aufruf beispielsweise:
$ ssh-agent -t 2d
Die Ausgabe verrät, auf welche Werte Sie die Umgebungsvariablen $SSH_AUTH_SOCK und $SSH_AGENT_PID setzen müssen, damit ssh-agent korrekt arbeitet. Kopieren Sie die Programmausgabe entweder mit der Maus und fügen sie ein, oder lassen Sie die Ausgabe direkt beim Start durch eval auswerten:
$ eval $(ssh-agent -t 2d)
Beim Start verrät das Programm weiterhin direkt seine Prozess-ID, was der nachfolgende ps-Aufruf bestätigt (Abbildung 2). Der Agent quittiert nicht von selbst seinen Dienst – auch nicht, wenn Sie die Shell schließen. Um das Programm zu beenden, rufen Sie in der Shell, in der ssh-agent gestartet wurde, ssh-agent -k auf. Ist das nicht möglich, etwa, weil die aufrufende Shell schon nicht mehr läuft, bleibt als einziger Ausweg das kill-Kommando [3], zum Beispiel:
$ kill 29692
Um den ssh-agent nicht als Daemon, sondern gezielt mit einer Anwendung (beispielsweise einem Terminalprogramm) zu starten, geben Sie den Namen der ausführbaren Datei im Aufruf mit an:
$ ssh-agent gnome-terminal &
Damit steht der Agent nur für diese Anwendung und die aus ihr heraus gestarteten Programme zur Verfügung. Beenden Sie das Terminal, stellt das auch das Aus für ssh-agent und alle darin enthaltenen Schlüsselinformationen dar.
Achtung: Einige Distributionen, darunter aktuelle Debian-Versionen, starten das Programm ssh-agent zusammen mit der X-Umgebung. Am besten überprüfen Sie dies mit dem in Abbildung 2 gezeigten ps/grep-Aufruf. Lädt der Benutzer in dieser Konfiguration Schlüssel ohne zeitliche Begrenzung in den Agenten (siehe nächster Abschnitt) und vergisst, den Bildschirm zu sperren, wenn er den Rechner kurz verlässt, kann das zu einem potenziellen Sicherheitsrisiko werden. Um dem System dieses Verhalten abzugewöhnen, passen Sie die Datei /etc/X11/Xsession.options an und kommentieren die Zeile
use-ssh-agent
durch ein vorangestelltes Rautezeichen (#) aus.
Nachdem Sie den Agent auf die eine oder andere Weise gestartet haben, machen Sie ihn mit den privaten Schlüsseln bekannt. Dabei hilft das Programm ssh-add. Rufen Sie das Tool entweder ohne weitere Parameter auf (dann sucht es selbstständig im Verzeichnis ~/.ssh nach privaten Schlüsseln und fordert für jede Identität das Kennwort an), oder geben Sie ihm gezielt eine Schlüsseldatei mit auf den Weg:
$ ssh-add ~/.ssh/id_dsa
Anschließend geben Sie das dazugehörige Passwort ein, und der Agent meldet den Erfolg (Listing 2).
Enter passphrase for /home/petronella/.ssh/id_dsa: Identity added: /home/petronella/.ssh/id_dsa (/home/petronella/.ssh/id_dsa)
Eine zusätzliche Sicherheitsmaßnahme kommt auch hier in Form der Option -t. Wie beim Start von ssh-agent selbst legen Sie mit diesem Parameter fest, wie lange der Agent den Schlüssel aufbewahren soll. Der Befehl in Zeile 1 von Listing 3 stellt den Timer auf zehn Minuten. Mit der Option -l listen Sie die privaten Schlüssel auf, die der Agent verwaltet (Zeile 5).
Als Ausgabe sehen Sie die Größe (1024 Bit) und den Fingerabdruck des soeben geladenen Schlüssels. Ab sofort können Sie aus dieser Shell (und aus weiteren Sitzungen, in denen Sie die beiden Umgebungsvariablen $SSH_AUTH_SOCK und $SSH_AGENT_PID gesetzt haben) SSH-Sitzungen starten und sich ohne Eingabe des Passworts an den Zielrechnern anmelden. Über die -d und Angabe der Schlüsseldatei entfernen Sie einen Schlüssel (Listing 3, Zeile 7). Um in einem Rutsch alle Identitäten loszuwerden, geben Sie hingegen die Option -D an.
$ ssh-add -t 10m ~/.ssh/id_dsa Enter passphrase for /home/petronella/.ssh/id_dsa: Identity added: /home/petronella/.ssh/id_dsa (/home/petronella/.ssh/id_dsa) Lifetime set to 600 seconds $ ssh-add -l 1024 f3:c9:b6:5d:23:3a:9d:61:50:19:63:3c:e8:22:7c:86 /home/petronella/.ssh/id_dsa (DSA) $ ssh-add -d /home/petronella/.ssh/id_dsa Identity removed: /home/petronella/.ssh/id_dsa (/home/petronella/.ssh/id_dsa.pub)
Der Vorgängerartikel [2] erklärt, welche Schritte nötig sind, um mit SSH X11-Verbindungen zu tunneln. Aber SSH kann noch mehr: Die Secure Shell bietet eine Möglichkeit, auch andere Internetdienste über so genannte Tunnel gegen Lauschangriffe abzusichern. Das Weiterleiten von TCP/IP-Verbindungen zu einer entfernten Maschine über ein verschlüsseltes Protokoll ist sinnvoll, wenn Sie ein ansonsten unverschlüsseltes Protokoll (etwa POP3) sichern wollen. Der Artikel unter [4] zeigt beispielhaft, wie Sie mit fetchmail über einen SSH-Tunnel verschlüsselt Mail von einem POP-Server abholen. Voraussetzung für diesen Einsatz ist ein Shell-Account auf dem Server. Zum Einsatz kommt der SSH-Parameter -L, der eine verschlüsselte "Pipeline" legt. (Genau genommen handelt es sich hier um Port-Forwarding, eine Spezialform des Tunnelings, die einen einzigen Port weiterleitet.)
Eine andere elegante Möglichkeit stellt der Einsatz von SSH als SOCKS-Proxy dar, um beispielsweise mit einem Webbrowser verschlüsselt Daten zu übertragen. Der Aufbau eines Tunnels zu einem Proxy bietet noch einen weiteren Vorteil: Die Methode umgeht die Zensur von Webinhalten, was nützlich sein kann, wenn Sie sich in einem Land aufhalten, das bestimmte Webseiten blockiert. Besitzen Sie einen Shell-Account auf einem Rechner, der in einem weniger restriktiven Land steht, führt diese Methode zu uneingeschränktem Surfgenuss.
Zunächst aktivieren Sie den Proxy über die SSH-Option -D und übergeben dieser zusätzlich eine frei wählbare Port-Nummer. Außerdem erweisen sich die beiden Parameter -f und -N in diesem Szenario als nützlich: Die erste schiebt ssh nach der Anmeldung und vor dem Ausführen von Kommandos in den Hintergrund, die zweite teilt ssh mit, dass kein Kommando folgt, zum Beispiel:
$ ssh -fN -D 1080 Proxy
Nach der Eingabe des Passwortes erscheint wieder der Prompt und die Shell ist bereit, weitere Befehle entgegen zu nehmen. Das wars schon – der SOCKS-Proxy wartet auf seinen Einsatz.
Als Nächstes richten Sie den SSH-Client als SOCKS-Proxy in die Netzwerkkonfiguration des gewünschten Programms ein. Für den Webbrowser Firefox nehmen Sie die Einstellung beispielsweise über Bearbeiten | Einstellungen im Bereich Allgemein | Netzwerk vor. Klicken Sie im Bereich Verbindung auf Einstellungen, aktivieren Sie die manuelle Proxy-Konfiguration, geben Sie ins Feld SOCKS-Host die IP-Adresse 127.0.0.1 und den vorher gewählten Port ein. Als SOCKS-Versionen stehen sowohl 4 als auch 5 zur Verfügung; schauen Sie im Zweifelsfall in der Manpage zu ssh nach, welche Version Ihre SSH-Installation unterstützt.
Nach der Bestätigung in Firefox geben Sie zum Testen in die Adresszeile des Browsers http://www.myipaddress.com/ ein – Sie sollten nun die IP des entfernten Rechners sehen.
Hier kommt eine sichere Alternative zu FTP-Clients. Im Gegensatz zu scp, das der Artikel unter [2] vorstellt, verläuft die Arbeit mit sftp interaktiv – ganz wie von "normalen" FTP-Sitzungen her bekannt. Auf der Gegenseite erwartet Secure FTP allerdings keinen FTP-Server, sondern einen SSH-Daemon und damit auch einen Shell-Account. Auf der Kommandozeile nehmen Sie wie mit SSH Verbindung zum Zielrechner auf:
$ sftp huhn@macnugget
Nach der Passworteingabe sehen Sie den Prompt sftp>, das Programm ist bereit und wartet auf weitere Anweisungen. Von der Bedienung her unterscheidet sich sftp kaum von anderen FTP-Clients auf der Shell [5], allerdings lässt sich vor dem Datentransfer kein Übertragungsmodus (ASCII oder Binary) einstellen, da alle Dateien gleich übers Netz wandern. Außerdem bietet Secure FTP erweiterte Funktionen zum Ändern von Dateirechten und -eigentümern. Der Befehl help blendet eine ausführliche Übersicht aller verfügbaren Kommandos ein.
Einige praktische Aufrufoptionen optimieren die Arbeit mit sftp. So steht der Parameter -C zum Einschalten der Datenkompression nicht nur für ssh und scp, sondern auch für sftp zur Verfügung. Über -b Datei
übergeben Sie sftp eine Batchdatei, die alle auszuführenden Befehle untereinander auflistet. Das funktioniert allerdings nur in Zusammenhang mit der beschriebenen Anmeldung ohne Passwort.
Wer nach einem grafischen Client für sftp sucht, muss nicht in die Ferne schweifen – das Gute liegt in diesem Fall wirklich nah: Sowohl KDEs Konqueror als auch Gnomes Nautilus verstehen sich prima mit sftp. Geben Sie in beiden Anwendungen
sftp://user@rechner
in die Adresszeile ein, authentifizieren Sie sich anschließend mit dem dazugehörigen Kennwort und arbeiten Sie anschließend wie in einem lokalen Dateimanager (Abbildung 3).
Glossar
Man-in-the-middle-Angriff
Hier versucht ein Dritter, sich zwischen zwei Kommunikationspartner zu stellen, dadurch die Kontrolle über den gesamten Datenverkehr zu erlangen und somit Informationen nach Belieben einzusehen oder sogar zu manipulieren.
Tunnel
Tunneln nennt man das Durchleiten einer Verbindung durch eine andere, hier konkret: Die unverschlüsselte POP3-Verbindung wird durch die verschlüsselte SSH-Verbindung geleitet.
[1] Freie SSH-Implementierung OpenSSH: http://openssh.org/de/
[2] SSH/SCP-Artikel: Heike Jurzik, "Sicher senden", LinuxUser 07/2003, S. 81, http://www.linux-user.de/ausgabe/2003/07/081-zubefehl/
[3] Prozesse beobachten und beenden: Heike Jurzik, "Volle Kontrolle", LinuxUser 03/2006, S. 92, http://www.linux-user.de/ausgabe/2006/03/092-zubefehl/
[4] Zu-Befehl-Folge über Fetchmail: Heike Jurzik, "Post auf Kommando", LinuxUser 10/2002, S. 81, http://www.linux-user.de/ausgabe/2002/10/081-fetchmail/
[5] FTP-Clients für die Shell: Heike Jurzik, "Datenschaufel auf der Shell", LinuxUser 01/2007, S. 91, http://www.linux-user.de/ausgabe/2007/01/091-zubefehl-ftp/
[6] Buchempfehlung: Lars Packschies, "Praktische Kryptographie unter Linux", Open Source Press, München 2005, ISBN 3-937514-06-6