SSH: Alles was du über die Secure Shell wissen musst

Frau steuert Server per SSH (Secure Shell)

Computer kommunizieren über Netzwerke miteinander. Daher haben Netzwerkforscher eine Reihe von Regeln für die Kommunikation mit anderen Rechnern festgelegt und Protokolle wie Telnet entwickelt. Diese ermöglichen es dir z.B. die Kontrolle über einen anderen Computer zu übernehmen oder Dateien auf diesen zu übertragen.

Telnet oder auch FTP sind jedoch nicht sicher. Alle Teilnehmer könnten die übertragenen Daten abfangen und lesen. Mitte der 1990er Jahre wurde deshalb das sichere SSH-Protokoll eingeführt, welches Telnet ablöste und auf dem sichere Dienste wie SFTP oder SCP aufbauen.

Wenn du ein Softwareentwickler oder Systemadministrator bist und dich noch nicht mit SSH beschäftigt hast, dann wird es höchste Zeit. Die Secure Shell ist nämlich der Standard, wenn in unsicheren Netzwerken Netzwerkdienste sicher betrieben werden sollen.

Was ist SSH?

SSH ist ein Netzwerkprotokoll und bei vielen auch als Secure Shell bekannt. Dieses Netzwerkprotokoll ermöglicht es Benutzern, insbesondere Systemadministratoren, auf Computer in einem unsicheren Netzwerk zuzugreifen. Dabei verwendet die Secure Shell eine starke Authentifizierung mit Kennwörtern oder öffentlichen Schlüsseln, um Daten zwischen zwei Netzwerkgeräten zu verschlüsseln, die über ein Netzwerk miteinander verbunden sind.

Eine starke Verschlüsselung ist aber nicht das einzige Feature der Secure Shell. Häufig wird sie nämlich auch von Netzwerkadministratoren verwendet, um Systeme und Anwendungen aus der Ferne zu verwalten. Dabei können sie sich bequem an einem anderen Rechner über das Netzwerk anmelden, darauf Befehle ausführen und auch Dateien von A nach B verschieben.

Neben der Terminalemulation und der Dateiübertragung kann die Secure Shell auch zur Erstellung von sicheren Tunneln für andere Anwendungsprotokolle verwendet werden, z.B. für den sicheren Fernaufruf von grafischen Windows-Sitzungen. Die Bezeichnung SSH bezieht sich somit nicht nur auf das Netzwerkprotokoll, sondern auch auf einige Dienstprogramme, welche das Protokoll implementieren.

Ursprünglich wurde die Secure Shell entwickelt, um unsichere Dienste wie Telnet, rlogin (Remote Login) und rsh (Remote Shell) zu ersetzen. SSH ist aber auch eine Alternative zu Dateiübertragungsprogrammen wie FTP (File Transfer Protocol) und rcp (Remote Copy) geworden.

Die Secure Shell ist auf einer Client-Server-Architektur aufgebaut, bei der sich ein SSH-Client mit einem SSH-Daemon verbindet, der auf einem Server installiert ist. Standardmäßig lauscht der SSH-Server am TCP-Port 22.

Wie funktioniert die Secure Shell?

Wenn du eine Verbindung über die Secure Shell zu deinem Server herstellst, trittst du in eine Shell-Sitzung ein. Dabei handelt es sich um eine textbasierte Schnittstelle, über die du mit dem Server interagieren kannst: Während einer SSH-Sitzung werden die am lokalen Terminal eingegebenen Befehle durch einen verschlüsselten SSH-Tunnel gesendet und auf dem Server ausgeführt.

Die Kommunikation ist in einem Client-Server-Modell implementiert. Das bedeutet, dass zum Aufbau einer SSH-Verbindung eine Software namens SSH-Daemon auf dem entfernten Rechner laufen muss. Diese Software lauscht auf Verbindungen an einem bestimmten Netzwerkanschluss, authentifiziert die Verbindungsanforderung und stellt, wenn der Benutzer die richtigen Anmeldedaten angibt, die entsprechende Umgebung her.

Auf dem Computer des Benutzers muss ein SSH-Client installiert sein. Dabei handelt es sich um eine Software, die die Kommunikation über das SSH-Protokoll ermöglicht und Informationen über den entfernten Host, mit dem sie verbunden ist, den Namen des Benutzers und die für die Authentifizierung zu übergebenden Anmeldeinformationen abrufen kann. Außerdem kann der Kunde spezifische Details über die Art der Verbindung angeben, die er herstellen möchte.

Wofür wird SSH verwendet?

Hauptsächlich wird der Internetdienst zur sicheren Kommunikation zwischen deinem Rechner und einem entfernten Host verwendet. Dies beinhaltet z.B.:

  • Sicherer Fernzugriff auf Ressourcen
  • Ausführung von Fernbefehlen
  • Bereitstellung von Patches und Software-Updates
  • Interaktive und automatische Dateiübertragung

Aber die Secure Shell wird nicht nur verwendet, um einen sicheren Kanal zwischen dem lokalen und entfernten Host zu schaffen. Auch geschäftskritische Unternehmensinfrastrukturen wie Router, Server, Virtualisierungsplattformen und Betriebssysteme können mit dem Protokoll verwalten werden.

Neben der passwortgeschützten Anmeldung können auch SSH-Schlüssel für die Authentifizierung genutzt werden. Diese SSH-Schlüssel automatisieren den Zugang zum Server und werden häufig in Skripten eingesetzt. SSH-Schlüssel wurden für die Verbindung über Unternehmensgrenzen hinweg entwickelt und bieten zusätzlich ein Single Sign-On. Mithilfe des Single Sign-On (SSO) kannst du zwischen verschiedenen Benutzerkonten wechseln, ohne jedes Mal dein Passwort eingeben zu müssen.

Wie funktioniert die Benutzerauthentifizierung mit SSH?

Wie wir gelernt haben, authentifizieren sich Clients normalerweise mit einem Passwort oder einem SSH-Schlüssel. Die Anmeldung mittels Passwortes ist verschlüsselt und für Erstbenutzer leicht zu verstehen. Automatisierte Bots und böswillige Benutzer versuchen jedoch oft wiederholt, sich bei Konten anzumelden, die eine passwortgeschützte Authentifizierung zulassen. Dies kann zu Sicherheitslücken führen und aus diesem Grund wird empfohlen, dass du SSH-Schüssel für die Authentifizierung einsetzt.

Ein SSH-Schlüssel ist ein Satz kryptografischer Schlüssel, die zur Authentifizierung verwendet werden können. Jeder Satz enthält einen öffentlichen und einen privaten Schlüssel. Öffentliche Schlüssel können bedenkenlos ausgetauscht werden, aber private Schlüssel müssen sicher aufbewahrt und dürfen niemandem zugänglich gemacht werden.

Um sich mit einem SSH-Schlüssel authentifizieren zu können, muss der Benutzer ein SSH-Schlüsselpaar auf seinem lokalen Computer haben. Auf einem Server muss der öffentliche Schlüssel in eine Datei im Home-Verzeichnis des Benutzers unter ~/.ssh/authorized_keys kopiert werden. Diese Datei enthält eine Liste der öffentlichen Schlüssel, einen pro Zeile, die zur Anmeldung bei diesem Konto berechtigt sind.

Wenn der Client eine Verbindung zu einem Host herstellt, für den er die SSH-Schlüsselauthentifizierung verwenden möchte, teilt er dies dem Server mit und auch, welchen öffentlichen Schlüssel er verwenden möchte. Der Server prüft dann den öffentlichen Schlüssel aus der Datei authorized_keys, erzeugt eine zufällige Zeichenfolge und verschlüsselt sie mit dem öffentlichen Schlüssel. Diese verschlüsselte Nachricht kann nur mit dem entsprechenden privaten Schlüssel entschlüsselt werden. Der Server sendet diese verschlüsselte Nachricht an den Client, um zu prüfen, ob er tatsächlich über den entsprechenden privaten Schlüssel verfügt.

Nach Erhalt der Nachricht entschlüsselt der Client sie mit seinem privaten Schlüssel und verkettet die daraus resultierende Zufallszeichenfolge mit der zuvor vereinbarten Sitzungskennung. Anschließend generiert er einen MD5-Hash des Wertes und sendet ihn an den Server zurück. Da der Server bereits über die ursprüngliche Nachricht und die Sitzungskennung verfügt, vergleicht er den aus diesen Werten generierten MD5-Hash und entscheidet, dass der Client den privaten Schlüssel haben muss.

Welche Sicherheitslücken gab oder gibt es?

Im Jahre 1998 wurde eine Schwachstelle beschrieben, die das unbefugte Einfügen von Inhalten in einen verschlüsselten SSH-Stream ermöglichte. Dies war durch die verwendete zyklische Redundanzprüfung und ihrem unzureichenden Schutz der Datenintegrität möglich. Ein Fix, bekannt als „Compensation Attack Detector“, wurde deshalb in den meisten Implementierungen eingeführt. Doch diese aktualisierten Implementierungen enthielten eine neue Schwachstelle, welche es Angreifern erlaubte, beliebigen Quellcode mit den Rechten des SSH-Daemons auszuführen.

In einer mit dem IDEA-Algorithmus verschlüsselten Sitzung, wurde Anfang 2001 eine weitere Schwachstelle entdeckt. Über diese Schwachstelle konnte ein Angreifer den letzten Block der Sitzung verändern. Eine weitere Sicherheitslücke ermöglichte es einem kompromittierten Server, die Authentifizierung des Benutzers an einen anderen Host zu übertragen.

Da SSH-1 einige schwerwiegende Sicherheitsmängel aufwies, gilt es als veraltet und sollte nicht mehr genutzt werden. 2006 wurde deshalb die zweite Version der Secure Shell eingeführt, welche mittlerweile von den meisten Clients und Servern unterstützt und verwendet wird.

Der Spiegel veröffentlichte am 28. Dezember 2014 geheime Informationen von Edward Snowden. Diese deuten darauf hin, dass die NSA in der Lage sein könnte, bestimmte Arten von SSH-Verbindungen zu entschlüsseln. Es wurden keine technischen Details über einen solchen Prozess bekannt. Eine 2017 durchgeführte Analyse der CIA-Hacking-Tools BothanSpy und Gyrfalcon weist aber darauf hin, dass die Secure Shell selbst nicht davon betroffen war.

Fazit

Die Secure Shell ist ein sehr beliebtes Netzwerkprotokoll, welches eine verschlüsselte Kommunikation zwischen zwei Rechnern über ein nicht sicheres Netzwerk, wie dem Internet, ermöglicht. Hauptsächlich wird es für den sicheren Fernzugriff auf einen Server verwendet. Mittels der Secure Shell ist es aber auch möglich, eine interaktive und automatische Dateiübertagung aufzubauen.

Zur Kommunikation nutzt die Secure Shell eine Client-Server-Architektur. Dabei verbindet sich der SSH-Client mit einem SSH-Deamon auf dem entfernten Rechner. Die Authentifizierung geschieht meist über SSH-Keys, da die Anmeldung über die Kombination von Benutzername und Passwort als zu unsicher gilt.

Im Laufe der Jahre sind einige Sicherheitslücken der Secure Shell bekannt geworden. Diese Sicherheitslücken haben die erste Version des Netzwerkprotokolls angreifbar gemacht und mittlerweile wurde SSH-2 eingeführt, welche als sicher gilt.