11.6    Secure Shell

Als ersten wichtigen Dienst wollen wir uns die sogenannte Secure Shell vornehmen, auf die wir schon mehrmals kurz erwähnt haben. Im Prinzip geht es bei diesem Dienst darum, zwischen zwei Rechnern eine verschlüsselte Verbindung aufzubauen, über die dann Daten wie beispielsweise eine ganze Login-Session übertragen werden und damit entfernte Rechner via Shell gesteuert können.

Wir können entfernte Rechner aber nicht nur über SSH steuern – SSH kann viel mehr.

Im Prinzip können wir jedes Protokoll über SSH tunneln und damit die Übertragung verschlüsseln. Dafür muss zwar auf der Gegenseite der SSH-Daemon laufen, aber dann steht unserer verschlüsselten Kommunikation nichts mehr im Wege.

11.6.1    Das SSH-Protokoll

Wir wollen jetzt nicht alle Einzelheiten des Protokolls besprechen und können auch nicht alle kryptografischen Verfahren darlegen. Und doch müssen wir einige Punkte erwähnen, die für den Umgang mit SSH wichtig sind.

Exkurs Kryptologie

Wenn wir über Verschlüsselung sprechen, kommen wir natürlich nicht um die entsprechende Wissenschaft herum – die Kryptologie. Die Kryptologie hat zwei große Teilbereiche, die ständig miteinander im Wettstreit liegen. Da wäre zum einen die Kryptografie, die sich um sichere Verschlüsselung bemüht, und zum anderen die Kryptoanalyse, die sich mit dem Brechen von Verschlüsselungen beschäftigt.

Beide Wissenschaften haben ihre Berechtigung, denn wo sensible Daten geschützt werden sollen, gibt es auch diverse Begehrlichkeiten. Beide Seiten sind wichtig, damit wir verstehen, welche Verfahren wir heute als sicher verstehen können und welche nicht (mehr).

Bei der Verschlüsselung unterscheidet man prinzipiell zwei Typen: die symmetrische und die asymmetrische. Der Unterschied ist einfach: Während man bei der symmetrischen Verschlüsselung zwei identische Schlüssel zum Ver- und Entschlüsseln braucht, sind es bei asymmetrischen Verfahren zwei unterschiedliche Schlüssel – ein öffentlicher sowie ein privater.

Nun ist es zwar schön, wenn man unterschiedliche Schlüssel hat, allerdings sind asymmetrische Verfahren um einiges langsamer. Aus diesem Grund nutzt man teilweise asymmetrische Verfahren, um sicher einen Schlüssel für die schnellen symmetrischen Verschlüsselungen zu vereinbaren.

Asymmetrische Verfahren eignen sich außerdem für digitale Signaturen, die ohne diese Art der Verschlüsselung nicht existieren würden. Der Trick ist nämlich, dass man einen Text mit dem privaten Schlüssel signiert. Dann kann jeder mit Ihrem öffentlichen Schlüssel nachprüfen, ob der Text wirklich von Ihnen kommt – da ja nur Sie den privaten Schlüssel kennen und niemand ohne Schlüssel die Signatur fälschen kann. Auch ein verändertes Dokument würde auffallen, da die Signatur nicht mehr stimmen würde.

Damit man in so einem Fall nicht den ganzen Text signieren muss, werden sogenannte Hashverfahren bzw. Prüfsummen, etwa SHA-2, benutzt. Sie reduzieren einen Text oder auch andere Daten auf ein paar Bytes, die aber sehr stark vom Text abhängen. Ändert man beispielsweise nur einen Buchstaben in einem langen Text, sieht der Hashwert des gesamten Textes gleich ganz anders aus.

$ sha256sum buch.pdf
7df285aa60e28cb2a47d13549c6279d04e328a740bfeb5fe8bf8e34052842564
   buch.pdf

Listing 11.32     SHA-2 mit 256 Bit unter Linux: sha256sum

Mit dem sha256sum-Programm können Sie unter Linux solche Prüfsummen für Dateien oder andere Daten berechnen lassen. Im obigen Fall wird der SHA-2-Algorithmus mit einer 256 Bit langen Prüfsumme verwendet. Linux unterstützt mit weiteren Tools auch andere Prüfsummenlängen für SHA-2. Außerdem sind in der Regel alternative Algorithmen wie SHA-1 (sha1sum) oder MD5 (md5sum) durch Tools nutzbar, jedoch veraltet und unsicher.

Eine Prüfsumme sollte sich bei jeglicher Änderung in den Daten möglichst vollständig ändern. Ändern Sie daher nur ein einzelnes Zeichen, sieht der Hashwert völlig anders aus:[ 30 ]

$ echo "." >> buch.pdf
$ sha256sum buch.pdf
0cd37a82dfc25ed3e029547f61a568eb12304818fca3aaad7bc913587c13b195
   buch.pdf

Listing 11.33     Modifizierung der SHA-2-Prüfsumme

11.6.2    Secure Shell nutzen

Um SSH nutzen zu können, benötigen Sie in erster Linie einen Client und einen Server. Unter Unix-Systemen gibt es das Programm ssh, das uns eine Verbindung zu entfernten Rechnern ermöglicht.

Wie funktioniert das nun? Wir verbinden uns mit einem Rechner rechner als Benutzer user, indem wir ssh folgendermaßen aufrufen:

$ ssh user@rechner
user@rechner's password:
No mail.
Last login: Tue Apr 16 21:24:51 2024 from a.b.c.d
user@rechner: $

Listing 11.34     ssh benutzen

Man muss nur den Benutzer auf dem entfernten Rechner angeben und sein Passwort wissen und bekommt eine Shell auf einem entfernten Rechner. Das entfernte System kann dabei (wie im Beispiel) via DNS-Namen oder als IP-Adresse angegeben werden.

Secure Copy

SSH ist auch zum sicheren Kopieren von Dateien zwischen unterschiedlichen Rechnern geeignet. Dazu verwenden Sie das scp-Programm von der Syntax her genauso wie das normale cp-Kommando. Der einzige Unterschied besteht in der Angabe der auf entfernten Rechnern liegenden Dateien:

user@rechner:/home/user/test.txt

Listing 11.35     Entfernte Dateien ansprechen

Dieser Ausdruck bezeichnet die Datei /home/user/test.txt des Rechners rechner. Der Benutzername user wird dabei verwendet, um sich auf dem System anzumelden. Falls nötig, wird vor dem Kopiervorgang nach einem Passwort für den Benutzer bzw. die Benutzerin gefragt.

$ scp test.txt jploetner@172.20.2.1:~
jploetner@172.20.2.1's password:
test.txt  100% |**************************| 103 00:00

Listing 11.36     Ein Beispiel

In diesem Beispiel wurde die Datei test.txt aus dem aktuellen Verzeichnis auf den Rechner 172.20.2.1 und dort in das Homeverzeichnis des Benutzers jploetner kopiert. Sie erinnern sich? Die Tilde (~) steht auch als Alias für das Homeverzeichnis.

Automatisches Einloggen

SSH kann aber noch mehr, nämlich zum Beispiel Logins ohne Passwort auf der Basis asymmetrischer Verschlüsselungsverfahren durchführen. Zuerst müssen wir dazu mit dem Programm ssh-keygen ein entsprechendes Schlüsselpaar auf dem Client erstellen.

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key ( /.ssh/id_rsa): <Enter>
Enter passphrase (empty for no passphrase): <Enter>
Enter same passphrase again: <Enter>
Your identification has been saved in  /.ssh/id_rsa.
Your public key has been saved in  /.ssh/id_rsa.pub.
The key fingerprint is:
9b:e7:1e:1b:11:3a:f3:c5:a0:e7:18:a3:68:55:60:88  root@gateway

Listing 11.37     Schlüsselerstellung mit ssh-keygen

Hier haben wir zwei RSA-Schlüssel ohne Passphrase hergestellt. Das RSA-Verfahren ist ein bekanntes asymmetrisches Verschlüsselungsverfahren, weswegen wir auch zwei Schlüssel erhalten – einen privaten und einen öffentlichen.

Um SSH nun ohne Passwort nutzen zu können, müssen wir den öffentlichen Schlüssel noch zum Benutzeraccount auf dem Server bringen:

$ scp .ssh/id_rsa.pub jploetner@172.20.2.1: /.ssh/
jploetner@172.20.2.1's password:
id_rsa.pub 100% |*************************| 222 00:00
$ ssh jploetner@172.20.2.1
jploetner@172.20.2.1's password:
No mail.
Last login: Sun Dec 14 11:12:37 2023
$ cd  /.ssh
$ cat id_rsa.pub >> authorized_keys
$ exit
logout
Connection to 172.20.2.1 closed.

Listing 11.38     Schlüssel aktivieren

Dazu kopieren wir per scp den öffentlichen Schlüssel auf den Server und hängen die Datei dann mit einem cat lokal an die  /.ssh/authorized_keys an.

gateway:~# ssh jploetner@172.20.2.1
No mail.
Last login: Sun Dec 14 18:25:13 2023 from gateway
jploetner@mymachine: $

Listing 11.39     Der Test – Login ohne Passwort

Der abschließende Test zeigt nun, dass das Einloggen per SSH ohne Passwort funktioniert. Vielleicht machen Sie sich auch Gedanken über die Sicherheit, aber die ist nur gefährdet, wenn schon jemand Zugriff auf Ihren Benutzeraccount am Client hat, denn dann kann sich jeder ohne Passwort gleich zum nächsten Server verbinden. In der Praxis sollten Sie sich dieser Gefahr bewusst sein und für kritische Anwendungsfälle auf jeden Fall einen Schlüssel mit Passphrase erstellen.

Secure-Shell-Tunnel

Als Ausblick erläutern wir noch kurz den SSH-Tunnel. Bei einem solchen Tunnel wollen Sie eine unverschlüsselte Verbindung verschlüsseln, und zwar indem Sie die Daten über einen SSH-Kanal leiten. Dazu wird, anstatt eine direkte Verbindung aufzubauen, das ssh-Programm mit den entsprechenden Optionen gestartet.

Schema für einen SSH-Tunnel

Abbildung 11.2     Schema für einen SSH-Tunnel

SSH öffnet dann lokal bei Ihnen einen Port und leitet diesen auf den anderen Rechner weiter. Dort verbindet es das andere Ende des Tunnels mit dem gewünschten Port auf dem Server (siehe Abbildung 11.2). Nun können Sie die Verbindung einfach nutzen, indem Sie Ihr Programm (beispielsweise einen Chatclient) anweisen, sich nicht mit dem Server, sondern mit dem entsprechenden Port auf Ihrem eigenen Rechner zu verbinden. Den Rest übernimmt SSH. Einen Tunnel richten Sie wie folgt ein:

$ ssh -f -N -C -L 8888:rechner:6667 -l user rechner

Listing 11.40     Einen Tunnel aufbauen

Dieser Aufruf bewirkt Folgendes:

Jetzt müssen wir, um die verschlüsselte Verbindung zu nutzen, unserem Clientprogramm nur noch sagen, dass wir statt mit rechner:6667 mit localhost:8888 sprechen wollen. Ein netstat --tcp sollte uns dann eine Verbindung zu localhost Port 8888 und eine Verbindung zu rechner auf den SSH-Port anzeigen.

Das Ganze funktioniert natürlich nur, wenn wir uns auf dem entsprechenden Server mit SSH einloggen können. Zudem müssen Sie, um Ports unterhalb von 1024 adressieren zu können, root-Rechte besitzen. Also wählen Sie als Benutzer lieber einen höheren Port für die lokale Verbindung.

11.6.3    Der Secure-Shell-Server

Manche Leute meinen, dass ein Linux-Rechner einen SSH-Server dringender braucht als die Tastatur oder einen Bildschirm. Und da haben sie nicht so ganz unrecht. Eigentlich sollte auf jedem mit einem Netzwerk verbundenen Rechner dieser Dienst laufen, da er wirklich nützlich ist und als sicher angesehen wird.

Konfiguriert wird der Server hauptsächlich über die sshd_config, die sich meistens im Verzeichnis /etc/ssh befindet. Die Datei ist zum großen Teil mit sinnvollen Voreinstellungen belegt, sodass wir hier nur auf die wichtigsten Optionen eingehen werden: