Einführung
SSH, oder Secure Shell, ist ein sicheres Protokoll und die gängigste Methode zur sicheren Verwaltung entfernter Server. Mit einer Reihe von Verschlüsselungstechnologien bietet SSH einen Mechanismus zur Herstellung einer kryptografisch gesicherten Verbindung zwischen zwei Parteien, zur Authentifizierung jeder Seite gegenüber der anderen und zum Austausch von Befehlen und Ausgaben.
In diesem Leitfaden werden wir die zugrunde liegenden Verschlüsselungstechniken untersuchen, die SSH verwendet, und die Methoden, die es verwendet, um sichere Verbindungen herzustellen. Diese Informationen können nützlich sein, um die verschiedenen Verschlüsselungsebenen und die verschiedenen Schritte zu verstehen, die erforderlich sind, um eine Verbindung herzustellen und beide Parteien zu authentifizieren.
Verständnis für symmetrische Verschlüsselung, asymmetrische Verschlüsselung und Hashes
Um die Übertragung von Informationen zu sichern, verwendet SSH verschiedene Arten von Datenmanipulationstechniken an verschiedenen Stellen der Transaktion. Dazu gehören Formen der symmetrischen Verschlüsselung, asymmetrischen Verschlüsselung und Hashing.
Symmetrische Verschlüsselung
Das Verhältnis der Komponenten, die Daten verschlüsseln und entschlüsseln, bestimmt, ob ein Verschlüsselungsschema symmetrisch oder asymmetrisch ist.
Die symmetrische Verschlüsselung ist eine Art von Verschlüsselung, bei der ein Schlüssel verwendet werden kann, um Nachrichten an die gegnerische Partei zu verschlüsseln und auch um die von der anderen Partei empfangenen Nachrichten zu entschlüsseln. Dies bedeutet, dass jeder, der den Schlüssel besitzt, Nachrichten an jede andere Person verschlüsseln und entschlüsseln kann, die den Schlüssel besitzt.
Diese Art von Verschlüsselungsschema wird oft als „gemeinsames Geheimnis“ -Verschlüsselung oder „Geheimschlüssel“ -Verschlüsselung bezeichnet. In der Regel wird nur ein einziger Schlüssel für alle Operationen verwendet oder ein Schlüsselpaar, bei dem die Beziehung entdeckbar ist und es trivial ist, den gegenteiligen Schlüssel abzuleiten.
Symmetrische Schlüssel werden von SSH verwendet, um die gesamte Verbindung zu verschlüsseln. Im Gegensatz zu dem, was einige Benutzer annehmen, werden öffentliche/ private asymmetrische Schlüsselpaare, die erstellt werden können, nur zur Authentifizierung verwendet und nicht zur Verschlüsselung der Verbindung. Die symmetrische Verschlüsselung ermöglicht es sogar, die Passwortauthentifizierung vor Schnüffelei zu schützen.
Der Client und der Server tragen beide zur Etablierung dieses Schlüssels bei, und das resultierende Geheimnis ist niemals außenstehenden Parteien bekannt. Der Geheimschlüssel wird durch einen Prozess erstellt, der als Schlüsselaustauschalgorithmus bekannt ist. Dieser Austausch führt dazu, dass der Server und der Client unabhängig voneinander denselben Schlüssel erreichen, indem sie bestimmte Teile öffentlicher Daten teilen und sie mit bestimmten geheimen Daten manipulieren. Dieser Prozess wird später genauer erläutert.
Der durch dieses Verfahren erstellte symmetrische Verschlüsselungsschlüssel ist sitzungsabhängig und bildet die eigentliche Verschlüsselung für die zwischen Server und Client gesendeten Daten. Sobald dies festgelegt ist, muss der Rest der Daten mit diesem gemeinsamen Geheimnis verschlüsselt werden. Dies geschieht vor der Authentifizierung eines Clients.
SSH kann so konfiguriert werden, dass es eine Vielzahl verschiedener symmetrischer Verschlüsselungssysteme verwendet, darunter Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 und Arcfour. Der Server und der Client können sich auf eine Liste ihrer unterstützten Verschlüsselungen einigen, die nach Präferenz sortiert ist. Die erste Option aus der Liste des Clients, die auf dem Server verfügbar ist, wird als Verschlüsselungsalgorithmus in beiden Richtungen verwendet.
Auf Ubuntu 20.04 sind sowohl der Client als auch der Server standardmäßig wie folgt konfiguriert:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
Dies bedeutet, dass wenn zwei Ubuntu 20.04 Maschinen miteinander verbunden sind (ohne die Standard-Chiffren durch Konfigurationsoptionen zu überschreiben), sie standardmäßig den [email protected]
-Chiffre verwenden, um ihre Verbindung zu verschlüsseln.
Asymmetrische Verschlüsselung
Asymmetrische Verschlüsselung unterscheidet sich von symmetrischer Verschlüsselung, weil zum Senden von Daten in eine Richtung zwei zugehörige Schlüssel benötigt werden. Einer dieser Schlüssel wird als privater Schlüssel bezeichnet, während der andere als öffentlicher Schlüssel bezeichnet wird.
Der öffentliche Schlüssel kann frei mit jeder Partei geteilt werden. Er ist mit seinem gepaarten Schlüssel verbunden, aber der private Schlüssel kann nicht aus dem öffentlichen Schlüssel abgeleitet werden. Die mathematische Beziehung zwischen dem öffentlichen Schlüssel und dem privaten Schlüssel ermöglicht es dem öffentlichen Schlüssel, Nachrichten zu verschlüsseln, die nur vom privaten Schlüssel entschlüsselt werden können. Dies ist eine Einwegfähigkeit, was bedeutet, dass der öffentliche Schlüssel keine Fähigkeit hat, die Nachrichten zu entschlüsseln, die er schreibt, noch kann er etwas entschlüsseln, das ihm der private Schlüssel möglicherweise sendet.
Der private Schlüssel sollte vollständig geheim gehalten und niemals mit einer anderen Partei geteilt werden. Dies ist eine wesentliche Anforderung für das Funktionieren des öffentlichen Schlüssel-Paradigmas. Der private Schlüssel ist das einzige Element, das in der Lage ist, Nachrichten zu entschlüsseln, die mit dem zugehörigen öffentlichen Schlüssel verschlüsselt wurden. Durch diese Tatsache hat jede Einheit, die in der Lage ist, diese Nachrichten zu entschlüsseln, nachgewiesen, dass sie die Kontrolle über den privaten Schlüssel hat.
SSH verwendet an einigen verschiedenen Stellen asymmetrische Verschlüsselung. Während des initialen Schlüsselaustauschprozesses, der zur Einrichtung der symmetrischen Verschlüsselung (die für die Sitzungsverschlüsselung verwendet wird) verwendet wird, wird asymmetrische Verschlüsselung verwendet. In diesem Stadium erstellen beide Parteien temporäre Schlüsselpaare und tauschen den öffentlichen Schlüssel aus, um das gemeinsame Geheimnis zu erzeugen, das für die symmetrische Verschlüsselung verwendet wird.
Die häufiger diskutierte Verwendung asymmetrischer Verschlüsselung mit SSH stammt aus der SSH-Schlüssel-basierten Authentifizierung. SSH-Schlüsselpaare können verwendet werden, um einen Client gegenüber einem Server zu authentifizieren. Der Client erstellt ein Schlüsselpaar und lädt dann den öffentlichen Schlüssel auf jeden entfernten Server hoch, auf den er zugreifen möchte. Dies wird in einer Datei namens authorized_keys
im Verzeichnis ~/.ssh
im Benutzerkonto im Heimverzeichnis auf dem entfernten Server platziert.
Nachdem die symmetrische Verschlüsselung zur Sicherung der Kommunikation zwischen Server und Client hergestellt wurde, muss sich der Client authentifizieren, um Zugang zu erhalten. Der Server kann den öffentlichen Schlüssel in dieser Datei verwenden, um eine Herausforderungsnachricht an den Client zu verschlüsseln. Wenn der Client nachweisen kann, dass er in der Lage war, diese Nachricht zu entschlüsseln, hat er nachgewiesen, dass er im Besitz des zugehörigen privaten Schlüssels ist. Dann kann der Server die Umgebung für den Client einrichten.
Hashing
Eine andere Form der Datenmanipulation, die SSH ausnutzt, ist kryptographisches Hashing. Kryptographische Hashfunktionen sind Methoden zur Erstellung einer prägnanten „Signatur“ oder Zusammenfassung eines Satzes von Informationen. Ihre Hauptunterscheidungsmerkmale sind, dass sie niemals umgekehrt werden sollen, sie praktisch unmöglich vorhersehbar zu beeinflussen sind und sie praktisch einzigartig sind.
Die Verwendung derselben Hashfunktion und derselben Nachricht sollte denselben Hash erzeugen; das Ändern eines Teils der Daten sollte einen völlig anderen Hash erzeugen. Ein Benutzer sollte nicht in der Lage sein, die Originalnachricht aus einem gegebenen Hash zu erzeugen, aber sie sollten feststellen können, ob eine gegebene Nachricht einen gegebenen Hash erzeugt hat.
Angesichts dieser Eigenschaften werden Hashes hauptsächlich für Zwecke der Datenintegrität und zur Überprüfung der Authentizität der Kommunikation verwendet. Die Hauptverwendung in SSH erfolgt mit HMAC oder hashbasierten Nachrichtenauthentifizierungscodes. Diese werden verwendet, um sicherzustellen, dass der empfangene Nachrichtentext unverändert und unverändert ist.
Als Teil der zuvor skizzierten symmetrischen Verschlüsselungsverhandlung wird ein Nachrichtenauthentifizierungscode (MAC-Algorithmus) ausgewählt. Der Algorithmus wird aus der Liste der akzeptablen MAC-Optionen des Clients ausgewählt. Der erste in dieser Liste, den der Server unterstützt, wird verwendet.
Jede Nachricht, die nach der Verhandlung über die Verschlüsselung gesendet wird, muss einen MAC enthalten, damit die andere Partei die Paketintegrität überprüfen kann. Der MAC wird aus dem symmetrischen gemeinsamen Geheimnis, der Paketsequenznummer der Nachricht und dem tatsächlichen Nachrichteninhalt berechnet.
Der MAC selbst wird außerhalb des symmetrisch verschlüsselten Bereichs als letzter Teil des Pakets gesendet. Forscher empfehlen im Allgemeinen diese Methode, die Daten zuerst zu verschlüsseln und dann den MAC zu berechnen.
Verstehen, wie SSH funktioniert
Sie haben wahrscheinlich bereits ein grundlegendes Verständnis dafür, wie SSH funktioniert. Das SSH-Protokoll verwendet ein Client-Server-Modell, um zwei Parteien zu authentifizieren und die Daten zwischen ihnen zu verschlüsseln.
Die Serverkomponente hört an einem festgelegten Port auf Verbindungen. Sie ist dafür verantwortlich, die sichere Verbindung auszuhandeln, die verbindende Partei zu authentifizieren und die richtige Umgebung zu starten, wenn die Anmeldeinformationen akzeptiert werden.
Der Client ist dafür verantwortlich, den initialen Transmission Control Protocol (TCP)-Handshake mit dem Server zu beginnen, die sichere Verbindung auszuhandeln, zu überprüfen, ob die Identität des Servers mit zuvor aufgezeichneten Informationen übereinstimmt, und Anmeldeinformationen zur Authentifizierung bereitzustellen.
Eine SSH-Sitzung wird in zwei separaten Phasen hergestellt. Die erste besteht darin, sich auf Verschlüsselung zu einigen und diese einzurichten, um zukünftige Kommunikation zu schützen. Die zweite Phase besteht darin, den Benutzer zu authentifizieren und festzustellen, ob Zugriff auf den Server gewährt werden soll.
Verschlüsselung für die Sitzung verhandeln
Wenn ein TCP-Verbindungsaufbau von einem Client erfolgt, antwortet der Server mit den von ihm unterstützten Protokollversionen. Wenn der Client eine der akzeptablen Protokollversionen abgleichen kann, wird die Verbindung fortgesetzt. Der Server stellt auch seinen öffentlichen Hostschlüssel bereit, den der Client verwenden kann, um zu überprüfen, ob dies der beabsichtigte Host war.
Zu diesem Zeitpunkt verhandeln beide Parteien einen Sitzungsschlüssel unter Verwendung einer Version des sogenannten Diffie-Hellman-Algorithmus. Dieser Algorithmus (und seine Varianten) ermöglichen es jeder Partei, ihre eigenen privaten Daten mit öffentlichen Daten des anderen Systems zu kombinieren, um zu einem identischen geheimen Sitzungsschlüssel zu gelangen.
Der Sitzungsschlüssel wird verwendet, um die gesamte Sitzung zu verschlüsseln. Die öffentlichen und privaten Schlüsselpaare, die für diesen Teil des Verfahrens verwendet werden, sind vollständig separat von den SSH-Schlüsseln, die zur Authentifizierung eines Clients am Server verwendet werden.
Die Grundlage dieses Verfahrens für den klassischen Diffie-Hellman ist:
- Beide Parteien einigen sich auf eine große Primzahl, die als Ausgangswert dient.
- Beide Parteien einigen sich auf einen Verschlüsselungsgenerator (typischerweise AES), der verwendet wird, um die Werte auf eine vordefinierte Weise zu manipulieren.
- Jede Partei erzeugt unabhängig voneinander eine weitere Primzahl, die vor der anderen Partei geheim gehalten wird. Diese Zahl wird als privater Schlüssel für diese Interaktion verwendet (unterschiedlich vom privaten SSH-Schlüssel, der für die Authentifizierung verwendet wird).
- Der generierte private Schlüssel, der Verschlüsselungsgenerator und die gemeinsame Primzahl werden verwendet, um einen öffentlichen Schlüssel zu generieren, der vom privaten Schlüssel abgeleitet ist, aber mit der anderen Partei geteilt werden kann.
- Beide Teilnehmer tauschen dann ihre generierten öffentlichen Schlüssel aus.
- Die empfangende Entität verwendet ihren eigenen privaten Schlüssel, den öffentlichen Schlüssel der anderen Partei und die ursprüngliche gemeinsame Primzahl, um einen gemeinsamen Geheimschlüssel zu berechnen. Obwohl dieser von jeder Partei unabhängig berechnet wird, unter Verwendung entgegengesetzter privater und öffentlicher Schlüssel, wird er zu dem gleichen gemeinsamen Geheimschlüssel führen.
- Das gemeinsame Geheimnis wird dann verwendet, um alle folgenden Kommunikationen zu verschlüsseln.
Dieser Prozess ermöglicht es jeder Partei, gleichermaßen an der Generierung des gemeinsamen Geheimschlüssels teilzunehmen, was es einem Ende nicht erlaubt, das Geheimnis zu kontrollieren. Es erfüllt auch die Aufgabe, ein identisches gemeinsames Geheimnis zu generieren, ohne diese Informationen über unsichere Kanäle senden zu müssen. Die gemeinsame Geheimnisverschlüsselung, die für den Rest der Verbindung verwendet wird, wird binäres Paketprotokoll genannt.
Das generierte Geheimnis ist ein symmetrischer Schlüssel, was bedeutet, dass derselbe Schlüssel, der zum Verschlüsseln einer Nachricht verwendet wird, auf der anderen Seite zum Entschlüsseln verwendet werden kann. Der Zweck davon ist es, alle weiteren Kommunikationen in einem verschlüsselten Tunnel zu verpacken, der von Außenstehenden nicht entschlüsselt werden kann.
Nachdem die Sitzungsverschlüsselung hergestellt ist, beginnt die Benutzerauthentifizierungsphase.
Authentifizierung des Benutzerzugriffs auf den Server
Der nächste Schritt besteht darin, den Benutzer zu authentifizieren und über den Zugriff zu entscheiden. Es gibt einige Methoden, die für die Authentifizierung verwendet werden können, abhängig davon, was der Server akzeptiert.
Die allgemeine Methode ist die Passwortauthentifizierung, bei der der Server den Client nach dem Passwort des Kontos fragt, mit dem er sich anmelden möchte. Das Passwort wird durch die ausgehandelte Verschlüsselung gesendet, sodass es vor externen Parteien sicher ist.
Auch wenn das Passwort verschlüsselt wird, wird diese Methode im Allgemeinen nicht empfohlen, aufgrund der Beschränkungen hinsichtlich der Komplexität des Passworts. Automatisierte Skripte können Passwörter mit normaler Länge im Vergleich zu anderen Authentifizierungsmethoden sehr leicht knacken.
Die beliebteste und empfohlene Alternative ist die Verwendung von SSH-Schlüsselpaaren. SSH-Schlüsselpaare sind asymmetrische Schlüssel, was bedeutet, dass die beiden zugehörigen Schlüssel unterschiedliche Funktionen erfüllen.
Der öffentliche Schlüssel wird verwendet, um Daten zu verschlüsseln, die nur mit dem privaten Schlüssel entschlüsselt werden können. Der öffentliche Schlüssel kann frei geteilt werden, denn obwohl er für den privaten Schlüssel verschlüsseln kann, gibt es keine Methode, um den privaten Schlüssel aus dem öffentlichen Schlüssel abzuleiten.
Die Authentifizierung mit SSH-Schlüsselpaaren beginnt, nachdem die symmetrische Verschlüsselung wie in der vorherigen Sektion beschrieben hergestellt wurde. Der Vorgang erfolgt wie folgt:
- Der Client beginnt damit, eine ID für das Schlüsselpaar, mit dem er sich authentifizieren möchte, an den Server zu senden.
- Der Server überprüft die Datei
authorized_keys
des Kontos, in das der Client versucht, sich einzuloggen, auf die Schlüssel-ID. - Wenn ein öffentlicher Schlüssel mit übereinstimmender ID in der Datei gefunden wird, generiert der Server eine Zufallszahl und verwendet den öffentlichen Schlüssel, um die Zahl zu verschlüsseln.
- Der Server sendet dem Client diese verschlüsselte Nachricht.
- Wenn der Client tatsächlich im Besitz des zugehörigen privaten Schlüssels ist, kann er die Nachricht mit diesem Schlüssel entschlüsseln und die ursprüngliche Zahl offenlegen.
- Der Client kombiniert die entschlüsselte Zahl mit dem gemeinsamen Sitzungsschlüssel, der zur Verschlüsselung der Kommunikation verwendet wird, und berechnet den MD5-Hash dieses Werts. MD5 ist ein Message-Digest-Algorithmus, der die Hash-Funktion verwendet, um einen 128-Bit-Hash-Wert zu generieren.
- Der Client sendet dann diesen MD5-Hash als Antwort auf die verschlüsselte Zahlennachricht zurück an den Server.
- Der Server verwendet denselben gemeinsamen Sitzungsschlüssel und die ursprüngliche Zahl, die er an den Client gesendet hat, um den MD5-Wert selbst zu berechnen. Er vergleicht seine eigene Berechnung mit der, die der Client zurückgesendet hat. Wenn diese beiden Werte übereinstimmen, beweist es, dass der Client im Besitz des privaten Schlüssels war und der Client authentifiziert ist.
Insgesamt ermöglicht die Asymmetrie der Schlüssel dem Server, Nachrichten an den Client mithilfe des öffentlichen Schlüssels zu verschlüsseln. Der Client kann dann nachweisen, dass er den privaten Schlüssel besitzt, indem er die Nachricht korrekt entschlüsselt. Die beiden verwendeten Verschlüsselungstypen (symmetrisches gemeinsames Geheimnis und asymmetrische öffentliche/ private Schlüssel) können jeweils ihre spezifischen Stärken in diesem Modell nutzen.
Zusammenfassung
Das Erlernen der Verbindungsaushandlungsschritte und der Verschlüsselungsebenen, die bei SSH verwendet werden, kann Ihnen helfen, besser zu verstehen, was passiert, wenn Sie sich bei einem entfernten Server anmelden. Jetzt können Sie die Beziehung zwischen verschiedenen Komponenten und Algorithmen erkennen und verstehen, wie all diese Teile zusammenpassen. Um mehr über SSH zu erfahren, lesen Sie die folgenden Anleitungen:
- Wie man die SSH-Schlüsselbasierte Authentifizierung auf einem Linux-Server konfiguriert
- Wie man SSH verwendet, um sich mit einem entfernten Server zu verbinden
- So richten Sie SSH-Schlüssel ein für verschiedene Betriebssysteme
SSH Essentials: Arbeiten mit SSH-Servern, -Clients und -Schlüsseln - SSH Essentials: Arbeiten mit SSH-Servern, Clients und Schlüsseln