Starke Schlüssel

Sys-Admin-Corner: OpenSSH, Grundlagen und Insiderwissen

Oliver Hamel

Verlassen Daten über ungesicherte Verbindungen einen Computer, so besteht immer die Gefahr, dass diese von Unbefugten gelesen oder protokolliert werden. Den meisten Administratoren ist die freie Implementierung OpenSSH [1] als eine authentifizierte, verschlüsselte Alternative zu gängigen, unverschlüsselten Programmen wie zum Beispiel telnet, rsh, rlogin und ftp ein Begriff. Im Folgenden möchte ich Ihnen neben den Grundlagen die oftmals ungenutzten, erweiterten Möglichkeiten von OpenSSH vorstellen.

Die Geschichte von SSH
SSH steht für Secure Shell und ist sowohl ein Programm als auch ein Netzwerkprotokoll, das im Juli 1995 von Tatu Ylönen programmiert und später als kommerzielles Produkt vermarktet wurde. 1999 entwickelte sich aus der letzten freien Implementierung von SSH das OpenSSH-Projekt. Seit dem existiert SSH als Open Source (OpenSSH) und als kommerzielle Software (SSHTectia [2]). Im weiteren Verlauf wird ausschließlich die freie Variante OpenSSH beschrieben. Aktuell steht OpenSSH in der Version 4.5 zum Download auf der Projektseite zur Verfügung. Das Programmpaket besteht aus den Komponenten sshd, ssh, scp, sftp, ssh-add, ssh-agent, ssh-keysign, ssh-keyscan, ssh-keygen und sftp-server.

Grundlagen

Das Programm ssh wird hauptsächlich dazu verwendet, eine sichere, verschlüsselte Verbindung zwischen zwei Computern über ein unsicheres Netzwerk – wie zum Beispiel dem Internet – herzustellen. Die Vorgänger telnet, rsh, rlogin und rcp haben den Nachteil, dass sie den gesamten Netzwerkverkehr, zu dem auch der Benutzername und das Kennwort während der Authentifizierung gehören, unverschlüsselt übertragen. Nach der erfolgreichen Authentifizierung wird für die Dauer der SSH-Sitzung ein geheimer Schlüssel erzeugt, über den die gesamte nachfolgende Kommunikation verschlüsselt wird. Je nach Version des SSH-Protokolls wird dabei ein anderer Verschlüsselungsalgorithmus verwendet. SSH2 nutzt standardmäßig AES mit einer Schlüssellänge von 128Bit. Zu den weiteren Algorithmen gehören 3DES, Blowfish, Twofish, SEED, IDEA, CAST und Arcfour. Bei Bedarf können Sie eine Schlüssellänge, die höher als 128Bit ist, festlegen. Von der Nutzung einer geringeren Schlüssellänge ist abzuraten.
Seit der Version 2 (SSH-2) bietet das SSH-Protokoll viele zusätzliche Möglichkeiten. Zu den wichtigsten Neuerungen gehören:

. SCP und SFTP, verschlüsseltes Übertragen von Daten

. SSHFS, einbinden eines kompletten Dateisystems über eine verschlüsselte Verbindung

. Portweiterleitungen, unverschlüsselte Protokolle über eine verschlüsselte Verbindung leiten

Der SSH-Server (sshd)

Der SSH-Server ist das Herz des OpenSSH-Pakets. In der Standardkonfiguration wird der SSH-Server über die globale Datei /etc/ssh/sshd_config konfiguriert. Sofern nicht anders angegeben, öffnet der SSH-Server nach einem erfolgreichen Start den Port 22 für eingehende Verbindungen. In der Regel wird der sshd als Dämon/Dienst gestartet (ein Programm das im Hintergrund läuft und nicht an ein Terminal gebunden ist). Der SSH-Server lässt sich auch über die Kommandozeile starten, was sich besonders zur Fehlersuche anbietet. Das Verhalten lässt sich über Kommandozeilenoptionen festlegen. Der Aufruf sshd -d startet den SSH-Server im Vordergrund und gibt Debuginformationen aus. Er erzeugt keine Kindprozesse und nimmt somit nur eine Verbindung entgegen. Um das Debuglevel und damit die Ausgabe von Informationen zu erhöhen, können Sie den sshd mit den Optionen -dd oder -ddd starten. Per Default loggt der sshd seine Informationen über den installierten Syslog-Server. Die zusätzliche Option -e veranlasst die Ausgabe der Informationen auf die Standardfehlerausgabe (die Informationen werden direkt in der Shell ausgegeben, aus der der sshd gestartet wurde). Der SSH-Server ist in der Manualpage sshd (8) dokumentiert.
Folgend sind einige Direktiven der Konfigurationsdatei zur sicheren Konfiguration des SSH-Servers aufgeführt.

. PermitRootLogin: Mit dieser Direktive können Sie das ob und wie für den Login des Benutzers root festlegen.

. AllowGroups: Der Login ist nur Benutzern möglich, die Mitglied einer der hier aufgeführten Gruppen sind.

. PermitEmptyPasswords: Hier können Sie leere Passwörter deaktivieren.

. Protocol: Gibt an welche Protokolle der SSH-Server unterstützt. Es wird empfohlen nur die Protokollversion 2 zu unterstützen.

. Port: Legt die Portnummer fest, an welcher der SSH-Server auf Verbindungen wartet. Standard ist 22.

. ListenAddress: Gibt die IP-Adressen an, an die sich der SSH-Server bindet. Ist hier 0.0.0.0 angegeben, so bindet sich der SSH-Server an alle Netzwerkinterfaces.

Der SSH-Client (ssh)

Der SSH-Client ist das wohl am meisten genutzte Programm aus dem OpenSSH-Paket. Er dient als sicherer Ersatz für Programme wie telnet, rsh und rlogin. Eine ausführliche Beschreibung finden Sie in der Manualpage ssh (1). Ssh kann sowohl interaktiv wie auch nicht-interaktiv genutzt werden.
Bei der interaktiven Nutzung wird der SSH-Client aufgerufen und auf einem entfernten Computer angemeldet um dort zum Beispiel administrative Arbeiten vorzunehmen. Der Aufruf des SSH-Client erfolgt nach folgendem Schema: ssh Optionen Benutzer@Computer. Im Beispiel verbindet sich der Benutzer oh ohne weitere Optionen mit dem Server 10.0.0.20: ssh oh@10.0.0.20. An Stelle der IP-Adresse können Sie bei funktionierender Namensauflösung auch den Hostnamen des entfernten Computers angeben. Die Kommandozeile (Login-Shell) des entfernten Servers verhält sich nach der erfolgten Authentifizierung so, als ob der Benutzer sich lokal an diesen angemeldet hat.
Eine nicht-interaktive Verbindung zu einem entfernten Computer bietet sich zum Beispiel dazu an, einzelne Befehle abzusetzen und die Ausgabe auf dem lokalen Computer auszugeben. Der Aufruf erfolgt wieder nach dem bekannten Schema, zusätzlich wird der Befehl am Ende der Kommandozeile übergeben. Wollen Sie sich den Festplattenplatz auf einem entfernten Computer in verständlicher Form ausgeben, so können Sie sich über den Aufruf ssh oh@10.0.0.20 „df -h“ auf dem Server 10.0.0.20 als Benutzer oh anmelden. Nach erfolgter Authentifizierung wird das Kommando df -h abgesetzt und die Ausgabe auf dem lokalen Server angezeigt. Im Anschluss befinden Sie sich wieder in der lokalen Kommandozeile.

Ein weiteres praktisches Beispiel für eine nicht-interaktive Verbindung ist das Pipen von Daten. Da SSH die Ein- und Ausgabekanäle transparent umleitet, können Sie auch Pipes benutzen. Im Beispiel wird ein Verzeichnis inklusiv der darunter liegenden Dateien mit tar über eine verschlüsselte Verbindung in das Verzeichnis /tmp des entfernten Servers kopiert.

tar cf – /foobar | ssh oh@10.0.0.20 „cd /tmp && tar xf -“

Das Public Key verfahren und die Schlüsselverwaltung (ssh-agent)

Bei der Publik-Key-Methode als Form der Authentifizierung erstellt der Benutzer ein Schlüsselpaar, das aus öffentlichem und privatem Schlüssel besteht. Der öffentliche Schlüssel , der wie der private Schlüssel mit dem Programm ssh-keygen zu erstellen ist, wird auf dem Server hinterlegt auf dem sich zukünftig über diese Authentifizierungsmethode eingeloggt werden soll. Der private Schlüssel, der üblicherweise durch eine Passphrase zusätzlich gesichert ist, bleibt auf dem Client, von dem sich auf den entfernten Server eingeloggt wird. Ist kein Passwort für den privaten Schlüssel angegeben, so geschieht der Login ohne eine Aufforderung zur Authentifizierung (aus der Sicht eines sicherheitsbewussten Administrators nicht empfohlen). Hier bietet sich das Programm ssh-agent an. Beim starten lädt es die privaten Authentifizierungsschlüssel des Benutzers. Ist ein privater Schlüssel mit einem Passwort versehen, so wird dieses einmalig vom ssh-agent abgefragt. Folgende Logins auf einen Server, zu dem ein Schlüssel vorliegt, erfordern nicht die Eingabe des Passwortes, da der ssh-agent dieses an Stelle des Benutzers vornimmt. Die Schlüssel werden nach dem Laden vom ssh-agent in einem geschützten Speichersegment abgelegt. Die Programme ssh-keygen und ssh-agent sind wieder in den entsprechenden Manualpages ssh-keygen (1) und ssh-agent (1) dokumentiert.

Secure Copy (scp) und Secure File Transfer (sftp)

Das Programm scp dient dem sicheren Kopieren von Dateien zwischen zwei Computern, indem es diese über eine verschlüsselte ssh Verbindung überträgt. Sie können scp nutzen indem Sie es nach folgendem Schema aufrufen: scp Optionen Benutzer@Computer:/Zielpfad. Im Beispiel kopiert der Benutzer oh die Datei test.txt vom lokalen Computer auf den entfernten Server 10.0.0.20 in das Verzeichnis /tmp: scp test.txt oh@10.0.0.20:/tmp. Um komplette Verzeichnisbäume zu kopieren (rekursives kopieren) können Sie die Option -r verwenden. Symbolische Links werden beim rekursiven Kopieren nicht aufgelöst.

Ähnlich scp dient auch sftp dem Transferieren von Dateien über ungesicherte Netzwerke. Im Gegensatz zu scp ist sftp interaktiv und nutzt die gleichen Befehle wie FTP. Der SFTP Server wird mit dem Paket OpenSSH installiert und kann direkt genutzt werden. Über den Aufruf sftp Benutzer@Computer können Sie sich auf einem entfernten Computer anmelden um dort interaktive Befehle auszuführen. Zu den wichtigsten Befehlen zählen: cd (Verzeichniswechsel auf dem Server), lcd (lokaler Verzeichniswechsel), get (eine Datei vom Server auf den Client kopieren), put (eine Datei vom Client auf den Server kopieren), ls (den Inhalt des Verzeichnisses auf dem Server ausgeben), lls (den Inhalt des Verzeichnisses auf dem Client ausgeben), pwd (das aktuelle Arbeitsverzeichnis auf dem Server anzeigen), lpwd (das aktuelle Verzeichnis auf dem Client anzeigen), mkdir (ein Verzeichnis auf dem Server erstellen), lmkdir (ein Verzeichnis auf dem Client erstellen), rm (eine Datei oder ein Verzeichnis auf dem Server löschen) und letztendlich quit um die Verbindung zu beenden. Manualpages: scp (1) und sftp (2).

Das Secure Shell Filesystem (SSHFS)

Das Secure Shell Filesystem [3] ist ein Dateisystem für FUSE [4]. FUSE ist ein Modul für den Linux-Kernel ab Version 2.4. Über SSHFS kann ein Dateisystem von einem entfernten Computer über eine SSH Verbindung in das Dateisystem des lokalen Computers eingebunden werden. Serverseitig ist für die Benutzung von SSHFS lediglich ein laufender SSH-Server mit sftp-Subsystem nötig. Nachdem das entfernte Dateisystem in das lokale eingebunden wurde, können Sie sich wie gewohnt in diesem bewegen und Dateisystemoperationen ausführen. Durch die Authentifizierung und Verschlüsselung bietet SSHFS einen sicheren und bequemen Weg um Daten über ein ungesichertes Netzwerk zu übertragen. Das Einbinden eines entfernten Mountpoint erfolgt nach dem Schema sshfs Benutzer@Computer:Verzeichnis Mountpoint. Im Beispiel verbindet sich der Benutzer oh mit dem Server 10.0.0.20, darauf wird das Verzeichnis /home/oh vom entfernten Server über das lokale Verzeichnis /home/sshfs eingebunden: sshfs oh@10.0.0.20:/home/oh /home/sshfs.

Portweiterleitung

Über SSH lässt sich unverschlüsselter Datenverkehr verschlüsselt an entfernte Computer weiterleiten, ohne dass an den ursprünglichen Diensten Veränderungen vorgenommen werden müssen. Ein Dienst wie zum Beispiel POP3, der dem Abrufen von Mails vom Mailserver auf den Client dient, kommuniziert komplett unverschlüsselt über den Port 110. Ports können Sie sich als Nummern, die jeweils für einen bestimmten Dienst festgelegt sind und an diesem Kanal auf eingehende Verbindungen warten, vorstellen. Wichtig: Für das Einrichten von Forwarding-Kanälen für Ports unter 1024 müssen Sie als der Benutzer root angemeldet sein. Bekannte Ports und Ihre zugehörigen Protokolle sind in der Datei /etc/services aufgeführt. Zu den bekanntesten gehören unter anderen: 21 (FTP), 22 (SSH), 25 (SMTP), 80 (HTTP), 443 (HTTPS), 110 (POP3), und viele mehr. Von diesen sechs genannten Protokollen sind vier unverschlüsselt und senden sämtliche Informationen im Klartext. Einem dritten Computer zwischen Ihnen und dem Server ist es oftmals ein leichtes, diesen unverschlüsselten Netzwerkverkehr zu protokollieren und Ihre Daten zur Authentifizierung herauszufiltern. Zu den verschiedenen Methoden der Portweiterleitung gehören lokale und entfernte Weiterleitungen, X11-Weiterleitungen, dynamische Weiterleitungen und VPN-Tunnel. Im Kontext des Artikels möchte ich Ihnen eine lokale Weiterleitung an einem praktischen Beispiel vorstellen.

Lokale Umleitung

Bei der lokalen Umleitung wird sämtlicher Datenverkehr an einen bestimmten Port am lokalen Computer verschlüsselt an einen entfernten gesendet.

Im Beispiel, wie in Abbildung 1 dargestellt, wird auf Server_1 der Befehl ssh -L 10000:Server_3:110 root@Server_2 eingegeben. Darauf baut SSH eine verschlüsselte Verbindung zu Server_2 auf. Sobald sich ein Prozess an Port 10000 auf Server_1 verbindet, werden sämtliche Daten durch den SSH-Tunnel verschlüsselt zu Server_2 und von dort aus unverschlüsselt an Server_3 an den Port 110 geleitet. Liegt nun zwischen Server_1 und Server_2 ein ungeschütztes Netzwerk, so wird der Verkehr durch den SSH-Tunnel gesichert, da verschlüsselt, übertragen. Letztendlich muss noch im POP3-Client festgelegt werden, dass er sich mit dem Server_1 an Port 10000 verbinden soll.

Abb. 1: Lokale Umleitung über einen SSH-Tunnel

Fazit

Sobald Daten unverschlüsselt Ihren Computer verlassen sind sie permanent der Gefahr ausgesetzt von Dritten gelesen und genutzt zu werden. OpenSSH bietet die Möglichkeit, viele dieser Probleme durch eine starke Verschlüsselung im Vorfeld zu umgehen. Kompliziert klingende Vorgänge, wie zum Beispiel verschlüsselte Tunnel für unverschlüsselte Protokolle einzurichten, sind oftmals durch die Eingabe einer einzigen Kommandozeile umzusetzen. Ein Blick in die Manualpages erläutert die Vorgänge im Detail.

Oliver Hamel, 1977 in Berlin geboren, arbeitet als selbstständiger IT-Consultant und Systemadministrator mit Schwerpunkt Linux. Er verfügt über langjährige Erfahrungen im Umgang mit Linux Systemen und ist nach LPIC-2 zertifiziert.
Geschrieben von
Oliver Hamel
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.