23.2. SSH – sicher vernetzt arbeiten

Vernetztes Arbeiten erfordert oft auch den Zugriff auf entfernte Systeme. Hierbei muss sich der Benutzer über sein Login und ein Passwort authentifizieren. Unverschlüsselt im Klartext versandt, könnten diese sensiblen Daten jederzeit von Dritten mitgeschnitten und missbraucht werden, um zum Beispiel den Zugang des Benutzers ohne sein Wissen nutzen. Abgesehen davon, dass die Angreifer so sämtliche privaten Daten des Benutzers einsehen können, können sie den erworbenen Zugang nutzen, um von dort aus andere Systeme anzugreifen, oder Administrator- bzw. Rootrechte auf dem betreffenden System zu erlangen. Früher wurde zur Verbindungsaufnahme zwischen zwei entfernten Rechnern Telnet verwendet, das keinerlei Verschlüsselungs- oder Sicherheitsmechanismen gegen ein Abhören der Verbindungen vorsieht. Ebensowenig geschützt sind einfache FTP- oder Kopierverbindungen zwischen entfernten Rechnern.

Die SSH-Software liefert den gewünschten Schutz. Die komplette Authentifizierung, in der Regel Benutzername und Passwort, und Kommunikation erfolgen hier verschlüsselt. Zwar ist auch hier weiterhin das Mitschneiden der übertragenen Daten möglich, doch kann der Inhalt mangels Schlüssel durch einen Dritten nicht wieder entschlüsselt werden. So wird sichere Kommunikation über unsichere Netze wie das Internet möglich. SUSE Linux bietet das Paket OpenSSH an.

23.2.1. Das OpenSSH-Paket

Standardmäßig wird unter SUSE Linux das Paket OpenSSH installiert. Es stehen Ihnen daher die Programme ssh, scp und sftp als Alternative für telnet, rlogin, rsh, rcp und ftp zur Verfügung. In der Standardkonfiguration ist der Zugriff auf ein SUSE Linux-System nur mit den OpenSSH-Programmen möglich, und nur wenn dies die Firewall erlaubt.

23.2.2. Das ssh-Programm

Mit ssh können Sie Verbindung zu einem entfernten System aufnehmen und dort interaktiv arbeiten. Es ist somit gleichermaßen ein Ersatz für telnet und rlogin. Aufgrund der Verwandtschaft zu rlogin zeigt der zusätzliche symbolische Name slogin ebenfalls auf ssh. Zum Beispiel kann man sich mit dem Befehl ssh sun auf dem Rechner sun anmelden. Anschließend wird man nach seinem Passwort auf dem System sun gefragt.

Nach erfolgreicher Authentifizierung kann dort auf der Kommandozeile oder interaktiv, zum Beispiel mit YaST, gearbeitet werden. Sollten sich der lokale Benutzername und der auf dem entfernten System unterscheiden, kann ein abweichender Name angegeben werden, zum Beispiel ssh -l augustine sun oder ssh augustine@sun.

Darüber hinaus bietet ssh die von rsh bekannte Möglichkeit, Kommandos auf einem anderen System auszuführen. Im nachfolgenden Beispiel wird das Kommando uptime auf dem Rechner sun ausgeführt und ein Verzeichnis mit dem Namen tmp angelegt. Die Programmausgabe erfolgt auf dem lokalen Terminal des Rechners earth.

ssh sonne "uptime; mkdir tmp"
tux@sonne's password:
1:21pm  up  2:17,  9 users,  load average: 0.15, 0.04, 0.02

Anführungszeichen sind hier zum Zusammenfassen der beiden Anweisungen in einem Kommando erforderlich. Nur so wird auch der zweite Befehl auf dem Rechner "sun" ausgeführt.

23.2.3. scp – sicheres Kopieren

Mittels scp kopieren Sie Dateien auf einen entfernten Rechner. scp ist der sichere, verschlüsselte Ersatz für rcp. Zum Beispiel kopiert scp  MeinBrief.tex sun: die Datei MeinBrief.tex vom Rechner "earth" auf den Rechner "sun". Insoweit sich die beteiligten Nutzernamen auf "earth" und "sun" unterscheiden, geben Sie bei scp die Schreibweise Nutzername@Rechnername an. Eine Option -l existiert nicht.

Nachdem das Passwort eingegeben wurde, beginnt scp mit der Datenübertragung und zeigt dabei den Fortschritt anhand eines von links nach rechts anwachsenden Balkens aus Sternen an. Zudem wird am rechten Rand die geschätzte Restübertragungszeit (engl. estimated time of arrival) angezeigt. Jegliche Ausgabe kann durch die Option -q unterdrückt werden.

scp bietet neben dem Kopieren einzelner Dateien ein rekursives Verfahren zum Übertragen ganzer Verzeichnisse: scp  -r src/ sun:backup/ kopiert den kompletten Inhalt des Verzeichnisses src/ inklusive aller Unterverzeichnisse auf den Rechner "sun" und dort in das Unterverzeichnis backup/. Dieses wird automatisch angelegt wenn es fehlt.

Mittels der Option -p kann scp die Zeitstempel der Dateien erhalten. -C sorgt für eine komprimierte Übertragung. Dadurch wird einerseits das zu übertragende Datenvolumen minimiert, andererseits aber ein höherer Rechenaufwand erforderlich.

23.2.4. sftp – sicherere Dateiübertragung

Alternativ kann man zur sicheren Datenübertragung sftp verwenden. sftp bietet innerhalb der Sitzung viele der von ftp bekannten Kommandos. Gegenüber scp mag es vor allem beim Übertragen von Daten, deren Dateinamen unbekannt sind, von Vorteil sein.

23.2.5. Der SSH Daemon (sshd) – die Serverseite

Damit ssh und scp, die Clientprogramme des SSH-Paketes, eingesetzt werden können, muss im Hintergrund der SSH-Daemon, ein Server, laufen. Dieser erwartet seine Verbindungen auf TCP/IP Port 22. Während des ersten Starts generiert der Daemon drei Schlüsselpaare. Die Schlüsselpaare bestehen aus einem privaten und einem öffentlichen (engl. public) Teil. Deshalb bezeichnet man dies als ein public-key basiertes Verfahren. Um die Sicherheit der Kommunikation mittels SSH zu gewährleisten, darf ausschließlich der Systemadministrator die Dateien der privaten Schlüssel einsehen können. Die Dateirechte werden per Voreinstellung entsprechend restriktiv gesetzt. Die privaten Schlüssel werden lediglich lokal vom SSH-Daemon benötigt und dürfen an niemanden weitergegeben werden. Demgegenüber werden die öffentlichen Schlüsselbestandteile (an der Namensendung .pub erkennbar) an Kommunikationspartner weitergegeben und sind entsprechend für alle Benutzer lesbar.

Eine Verbindung wird vom SSH-Client eingeleitet. Der wartende SSH-Daemon und der anfragende SSH-Client tauschen Identifikationsdaten aus, um die Protokoll- und Softwareversion abzugleichen und die Verbindung zu einem falschen Port auszuschließen. Da ein Kindprozess des ursprünglichen SSH-Daemons antwortet, sind gleichzeitig viele SSH-Verbindungen möglich.

OpenSSH unterstützt zur Kommunikation zwischen SSH-Server und SSH-Client das SSH-Protokoll in den Versionen 1 und 2. Nach einer Neuinstallation von SUSE Linux wird automatisch die aktuelle Protokoll-Version 2 eingesetzt. Möchten Sie nach einem Update weiterhin SSH 1 beibehalten, folgen Sie den Anweisungen in /usr/share/doc/packages/openssh/README.SuSE. Dort ist ebenfalls beschrieben, wie Sie in wenigen Schritten eine SSH 1-Umgebung in eine funktionierende SSH 2-Umgebung umwandeln.

Bei Verwendung der SSH Protokoll-Version 1 sendet der Server sodann seinen öffentlichen host key und einen stündlich vom SSH-Daemon neu generierten server key. Mittels beider verschlüsselt (engl. encrypt) der SSH-Client einen von ihm frei gewählten Sitzungsschlüssel (engl. session key) und sendet ihn an den SSH-Server. Er teilt dem Server zudem die gewählte Verschlüsselungsmethode (engl. cipher) mit.

Die SSH Protokoll-Version 2 kommt ohne den server key aus. Stattdessen wird ein Algorithmus nach Diffie-Hellman verwendet, um die Schlüssel auszutauschen.

Die zur Entschlüsselung des Sitzungsschlüssels zwingend erforderlichen privaten host und server keys, können nicht aus den öffentlichen Teilen abgeleitet werden. Somit kann allein der kontaktierte SSH-Daemon mit seinen privaten Schlüsseln den Sitzungsschlüssel entziffern (vgl. man /usr/share/doc/packages/openssh/RFC.nroff). Diese einleitende Phase der Verbindung kann man mittels der Fehlersuchoption -v des SSH-Clientprogramms gut nachvollziehen. Per Default wird SSH Protokoll-Version 2 verwendet, man kann jedoch mit dem Parameter -1 auch die SSH Protokoll-Version 1 erzwingen. Indem der Client alle öffentlichen host keys nach der ersten Kontaktaufnahme in ~/.ssh/known_hosts ablegt, können so genannte man-in-the-middle Angriffe unterbunden werden. SSH-Server, die versuchen, Name und IP-Adresse eines anderen vorzutäuschen, werden durch einen deutlichen Hinweis enttarnt. Sie fallen entweder durch einen gegenüber ~/.ssh/known_hosts abweichenden host-Schlüssel auf, oder können mangels passendem privaten Gegenstück den vereinbarten Sitzungsschlüssel nicht entschlüsseln.

Es empfiehlt sich, die in /etc/ssh/ abgelegten privaten und öffentlichen Schlüssel extern und gut geschützt zu archivieren. So können Änderungen der Schlüssel festgestellt und nach einer Neuinstallation die alten wieder eingespielt werden. Dies erspart den Benutzern die beunruhigende Warnung. Ist es sichergestellt, dass es sich trotz der Warnung um den korrekten SSH-Server handelt, muss der vorhandene Eintrag zu diesem System aus ~/.ssh/known_hosts entfernt werden.

23.2.6. SSH-Authentifizierungsmechanismen

Jetzt erfolgt die eigentliche Authentifizierung, die in ihrer einfachsten Weise aus der Eingabe eines Passwortes besteht, wie es in den oben aufgezeigten Beispielen erfolgte. Ziel von SSH war die Einführung einer sicheren, aber zugleich einfach zu nutzenden Software. Wie bei den abzulösenden Programmen rsh und rlogin muss deshalb auch SSH eine im Alltag einfach zu nutzende Authentifizierungsmethode bieten. SSH realisiert dies mittels eines weiteren hier vom Nutzer erzeugten Schlüsselpaares. Dazu liefert das SSH-Paket das Hilfsprogramm ssh-keygen mit. Nach der Eingabe von ssh-keygen -t rsa oder ssh-keygen -t dsa wird das Schlüsselpaar generiert und der Basisdateiname zur Ablage der Schlüssel erfragt.

Bestätigen Sie die Voreinstellung und beantworten Sie die Frage nach einer Passphrase. Auch wenn die Software eine leere Passphrase nahelegt, sollte bei der hier vorgeschlagenen Vorgehensweise ein Text von zehn bis 30 Zeichen Länge gewählt werden. Verwenden Sie möglichst keine kurzen und einfachen Worte oder Sätze. Nach erfolgter Eingabe wird zur Bestätigung eine Wiederholung der Eingabe verlangt. Anschließend wird der Ablageort des privaten und öffentlichen Schlüssels, in unserem Beispiel der Dateien id_rsa und id_rsa.pub, ausgegeben.

Verwenden Sie ssh-keygen -p -t rsa bzw. ssh-keygen -p -t dsa, um Ihre alte Passphrase zu ändern. Kopieren Sie den öffentlichen Teil des Schlüssels (in unserem Beispiel id_rsa.pub) auf den entfernten Rechner und legen Sie ihn dort als ~/.ssh/authorized_keys ab. Zur Authentifizierung werden Sie beim nächsten Verbindungsaufbau nach Ihrer Passphrase gefragt. Sollte dies nicht der Fall sein, überprüfen Sie bitte Ort und Inhalt der zuvor erwähnten Dateien.

Auf Dauer ist diese Vorgehensweise mühsamer, als die Eingabe eines Passwortes. Entsprechend liefert das SSH-Paket ein weiteres Hilfsprogramm, den ssh-agent, der für die Dauer einer X-session private Schlüssel bereit hält. Dazu wird das gesamte X als Kindprozess des ssh-agents gestartet. Sie erreichen dies am einfachsten, indem Sie am Anfang der Datei .xsession die Variable usessh auf yes setzen und sich über einen Displaymanager, zum Beispiel KDM oder XDM, anmelden. Alternativ können Sie ssh-agent startx verwenden.

Nun können Sie wie gewohnt ssh oder scp nutzen. Insoweit Sie Ihren öffentlichen Schlüssel wie zuvor verteilt haben, sollten Sie jetzt nicht mehr nach dem Passwort gefragt werden. Achten Sie beim Verlassen Ihres Rechners darauf, dass Sie Ihre X-session beenden oder mittels einer passwortgeschützten Bildschirmsperre, zum Beispiel xlock, verriegeln.

Alle wichtigen Änderungen die sich mit der Einführung von SSH Protokoll-Version 2 ergeben haben, sind auch in der Datei /usr/share/doc/packages/openssh/README.SuSE noch einmal dokumentiert.

23.2.7. X-, Authentifizierungs- und sonstige Weiterleitung

Über die bisher beschriebenen sicherheitsrelevanten Verbesserungen hinaus erleichtert ssh auch die Verwendung von entfernten X-Anwendungen. Insoweit Sie ssh mit der Option -X aufrufen, wird auf dem entfernten System automatisch die DISPLAY-Variable gesetzt und alle X-Ausgaben werden durch die bestehende ssh-Verbindung auf den Ausgangsrechner weitergeleitet. Diese bequeme Funktion unterbindet gleichzeitig die bisher bestehenden Abhörmöglichkeiten bei entfernt aufgerufenen und lokal betrachteten X-Anwendungen.

Durch setzen der Option -A wird der Mechanismus zur Authentifizierung des ssh-agent auf den nächsten Rechner mit übernommen. Man kann so von einem Rechner zum anderen gehen, ohne ein Passwort eingeben zu müssen. Allerdings nur, wenn man zuvor seinen öffentlichen Schlüssel auf die beteiligten Zielrechner verteilt und korrekt abgelegt hat.

Beide Mechanismen sind vorsichtshalber in der Voreinstellung deaktiviert, können jedoch in der systemweiten Konfigurationsdatei /etc/ssh/ssh_config oder der nutzereigenen ~/.ssh/config permanent eingeschaltet werden.

Man kann ssh auch zur beliebigen Umleitung von TCP/IP-Verbindungen benutzen. Als Beispiel sei hier die Weiterleitung des SMTP- und POP3-Ports aufgeführt:

ssh -L 25:sun:25 earth

Hier wird jede Verbindung zu "earth" Port 25, SMTP auf den SMTP-Port von "sun" über den verschlüsselten Kanal weitergeleitet. Dies ist insbesondere für Nutzer von SMTP-Servern ohne SMTP-AUTH oder POP-before-SMTP-Fähigkeiten von Nutzen. Mail kann so von jedem beliebigen Ort mit Netzanschluss zur Auslieferung durch den heimischen Mailserver übertragen werden. Analog können mit folgendem Befehl alle POP3-Anfragen (Port 110) an "earth" auf den POP3-Port von "sun" weitergeleitet werden:

ssh -L 110:sun:110 earth

Beide Beispiele müssen Sie als Benutzer root ausführen, da auf privilegierte, lokale Ports verbunden wird. Bei bestehender SSH-Verbindung wird Mail wie gewohnt als normaler Benutzer versandt und abgeholt. Der SMTP- und POP3-Host muss dabei auf localhost konfiguriert werden. Zusätzliche Informationen entnehmen Sie den Manualpages der einzelnen Programme und den Dateien unter /usr/share/doc/packages/openssh.