Asymmetrische Verschlüsselung mit SSH
Es gibt zwar zu diesem Thema viele Tutorials im Netz, jedoch konnte ich mir bisher keines so richtig merken.
Was kann man damit eigentlich anstellen?
Normalerweise logge ich mich in einen Server mit einem Benutzernamen und einem Passwort ein. Der Server überprüft dann, ob mein eingegebener Benutzername zum auf dem Server gespeicherten Passwort (meist ein Hash) passt und gewährt mir im positiven Fall dann Zugriff. Das lässt sich eigentlich ganz gut mit einem Zahlenschloss an einem Fahrrad vergleichen: Nur wer die korrekte Kombination kennt, kann dieses Schloss öffnen. Bei einem Fahrradschloss kann ich als böser Bube jedoch durch Ausprobieren die korrekte Kombination herausfinden. Das ist lediglich eine Frage der Zeit. Je einfacher mein Passwort aufgebaut ist (etwa „3333“, desto weiniger Zeit wird der Angreifer benötigen.
Aufgrund dieser Problematik wurde im Serverbereich die Authentifizierung via Schlüssel (Key) erfunden. Das Verfahren ist eigentlich sehr pfiffig: Der Benutzer generiert zunächst einmal zwei Schlüssel: Einen privaten und einen öffentlichen. Bei der Anmeldung am Server geschieht nun folgendes:
Der Benutzer sendet seinen Benutzernamen, der aber mit mit seinem privaten Schlüssel verschlüsselt (unkenntlich gemacht) ist. Der Server besitzt den öffentlichen Schlüssel und den Benutzernamen des Benutzers. Bei ihm kommt nun eine kryptische Zeichenkette an, die er nur mit dem öffentlichen Schlüssel wieder in den Benutzernamen umwandeln kann. Die öffentliche Schlüssel muss zu dem privaten Schlüssel passen. Zudem taugt der öffentliche Schlüssel nur zur Entschlüsselung, nicht jedoch zur Verschlüsselung.
Um ganz genau zu sein (Danke Markus…):
Speziell bei SSH ist es nun so, dass die asymmetrische Verschlüsselung nach diesem Verfahren nur verwendet wird, um einen Schlüssel für eine performantere synchrone Verschlüsselung auszuhandeln. Nach dem Handshake machen Server und Client also „ihr eigenes Ding“.
Vorteil:
Nur wer im Besitz des privaten Schlüssels ist, kann sich am Server anmelden. Das Ausprobieren von Passworten ist theoretisch nicht denkbar (man müsste die Verschlüsselung imitieren), aber praktisch immens schwierig und zeitaufwendig.
Ein Bild für dieses Verfahren ist z.B. ein Fahrradschloss mit Schlüssel. Der private Schlüssel hängt am Schlüsselbund des Benutzers. Die Schlossmechanik selbst ist der öffentliche Schlüssel und weit aufwendiger zu imitieren als etwa eine Zahlenkombination herauszufinden.
Natürlich kann man mit dem Verfahren nicht nur Benutzernamen, sondern alle möglichen Texte verschlüsseln. – z.B. auch E‑Mails. Den öffentlichen Schlüssel kann man gefahrlos weitergeben, sodass sich den jeder Empfänger herunterladen kann.
Hier einmal ein einfaches Schaubild:
Wie funktioniert das nun praktisch?
Zunächst muss man in einem Linuxsystem als normaler Benutzer (Clientbenutzer) einen privaten und einen öffentlichen Schlüssel generieren. Das funktioniert über den Befehl:
ssh-keygen ‑d
Dabei wird ein Passwort abgefragt. Man kann seinen privaten Schlüssel zusätzlich durch ein Passwort schützen, d.h. nur derjenige, der dieses Passwort besitzt, darf mit diesem Schlüssel verschlüsseln. Möchte man z.B. via Script vom fremden Server Dateien holen oder schreiben (eine typischen Anwendung), darf kein Passwort vergeben werden und gleichzeitig muss der private Schlüssel gegen unbefugten Zugriff verstärkt gesichert werden.
Durch diesen Befehl entstehen zwei Dateien im Homeverzeichnis des gerade eingeloggten Benutzers:
1. /.ssh/id_dsa.pub (öffentlicher Schlüssel)
2. /.ssh/id_dsa (privater Schlüssel)
Nur der erste Schlüssel darf verteilt werden, also das System verlassen!
Jetzt muss der öffentliche Schlüssel auf den Server gelangen., auf den man sich per Key einloggen möchte.
Damit sind die Arbeiten auf dem Client abgeschlossen.
Teil 2: Arbeiten auf dem Server
Man sollte sich zunächst überlegen, unter welchen Benutzernamen (Serverbenutzer) man sich auf dem Server einloggen möchte. Es ist nicht immer empfehlenswert, dass das der Rootbenutzer ist.
Man loggt sich zunächst auf dem Server mit dem gewünschten Benutzer ein und kopiert die Datei id_dsa.pub vom Client in das Homeverzeichnis des Serverbenutzers. Danach legt man dort mit
touch $HOME/.ssh/authorized_keys
die Datei „authorized_keys“ an und kopiert mit
cat $HOME/id_dsa.pub » $HOME/.ssh/authorized_keys
den öffentlichen Schlüssel in diese Datei. Anschließend sollte man auf dem Server mit
rm $HOME/id_dsa.pub
Die kopierte Schlüsseldatei wieder löschen.
Teil 3: Generalprobe
Man loggt sich jezt als Clientbenutzer auf dem Client ein. Anschleßend überprüft man durch:
ssh serverbenutzer@server.tld
ob das alles funktioniert. Hat man einen Schlüssel ohne Passwort erzeugt, sollte man jetzt auf dem Server als
serverbenutzer
eingeloggt sein. Das funktioniert nicht, wenn man auf dem Client als ein anderer Benutzer eingeloggt ist weil da das Schlüsselpaar eben nur für einen Nutzer gilt.
Gesehen :-)