IT, Linux, Windows
Schreibe einen Kommentar

SSH Public Key Authentifizierung

Wer Server im Internet betreiben möchte, sollte sich immer zunächst über deren Sicherheit Gedanken machen. Neben einer Backupstrategie und regelmäßiger Aktualisierungen fängt das bereits mit der Anmeldung am Server an. Ein frisch installiertes Linux System wird zunächst erst einmal lediglich eine Anmeldung mit dem Systembenutzer root und einem Passwort auf dem ssh Standard-Port 22 zulassen und das sollte als erstes angepasst werden. Lange Zeit ging es vor allem darum ein sicheres, möglichst langes Passwort zu nutzen und Passwortmanager waren das Maß der Dinge. Seit aber selbst Windows einen OpenSSH Client vorinstalliert mitbringt, sollte dieser Umstand auch genutzt werden um auf die sehr viel sicherere Public Key Authentifizierung umzustellen und das möchte ich hier einmal skizzieren – es ist recht einfach.

In der folgenden Anleitung gehe ich von einem Client mit aktuellem Windows 10 oder 11 aus und einem Server mit aktuellem Debian basiertem Linux (Debian, Ubuntu, etc.). Für Änderungen an Konfigurationsdateien auf dem Server nutze ich mcedit, das Teil des Midnight Commander ist. Auf dem Windows Client nutze ich die Powershell (Community Version), die Windows Powershell tut es aber genauso gut. Außerdem würde ich euch das Windows Terminal ans Herz legen. Wer mit mehreren Shells arbeitet, wird das sehr schnell zu schätzen wissen und bei Arbeiten an den Einstellungen des ssh daemon eines Servers, sollte mindestens eine ssh Shell geöffnet bleiben. Ich arbeite also mit wenigstens zwei Powershell Fenstern.

Der Übersicht halber werde ich Linux Befehle mit einem $ kennzeichnen und Powershell Befehle mit einem PS>. So lassen sich auch unbeabsichtigte Zeilenumbrüche besser erkennen.


Öffne also eine Powershell und wechsle ggf. in das Benutzerverzeichnis. Dort erstellen wir das Arbeitsverzeichnis (.ssh) für den OpenSSH Client.

PS> cd $env.userprofile
PS> mkdir .ssh

Als nächstes lassen wir ein Schlüsselpaar im Arbeitsverzeichnis erstellen für unsere gewünschte Verbindung. Ändere „name“ zu Deinem Anmeldenamen, „hostname“ in den Hostnamen des Servers (2x) und „winname“ in den Anmeldenamen auf dem Windowsclient. Nach dem Abschicken des Befehls wirst Du zweimal nach einem Passwort gefragt, mit dem die Schlüssel verschlüsselt werden können. Diese müssen dann aber bei jeder Anmeldung wieder eingegeben werden. Wenn Du eine sichere Umgebung sicherstellen kannst, kannst Du ein leeres Passwort übergeben um die Schlüssel unverschlüsselt abzulegen.

 PS> ssh-keygen -C "name@hostname" -f C:\Users\winname\.ssh\hostname.ed25519 -t ed25519

Der Parameter -C ist lediglich ein Kommentar, der Dir später bei der Zuordnung helfen kann, wenn Du viele solcher Schlüssel hast, mit -f wird der Dateiname festgelegt in dem der Schlüssel gespeichert wird und -t bestimmt die Art des Schlüssels. In diesem Fall habe ich eine elliptische Kurve gewählt, die sehr schnell und sicher ist.

Du hast jetzt zwei Dateien im Verzeichnis .ssh erzeugt, wobei hostname.ed25519 Deinen privaten Schlüssel enthält und hostname.ed25519.pub den dazu passenden öffentlichen Schlüssel. Dann können wir uns das erste mal am Server anmelden. Ich gehe von einem frisch installiertem Server aus. Wenn der bereits in Benutzung ist, passe den zur Anmeldung notwendigen Benutzernamen an und wechsle mit su zum root User.

PS> ssh root@hostname.domain.de

Zunächst wird einmal nach Aktualisierungen gesucht und diese installiert und anschließend die zusätzlich hilfreichen/benötigten Werkzeuge.

$ apt update && apt upgrade -y
$ apt install mc sudo

Wenn das durchgelaufen ist erstellen wir einen neuen Hauptbenutzer, der fortan zur Anmeldung am Server genutzt wird (ersetze username mit einem Namen Deiner Wahl). Der wird dann auch gleich in die sudo Gruppe aufgenommen um später Befehle nutzen zu können, die root Privilegien erwarten.

$ adduser --shell /bin/bash username
$ usermod -G sudo username

Anschließend verwenden wir dieses Fenster nicht mehr, halten es aber für den Notfall offen. Öffne eine weitere Powershell, in der Du Deine Änderungen überprüfen und die weiteren Schritte durchführen kannst. Dort verbindest Du Dich mit dem gerade erstelltem Benutzer mit dem Server.

 PS> ssh username@hostname.domain.de

Nach erfolgter Anmeldung prüfen wir auch gleich die sudo Berechtigung. Die sollte nach dem ersten Befehl (und nach einer einstellbaren Zeitspanne erneut) das Kennwort des Benutzers abfragen, bei mehreren aufeinander folgenden Befehlen aber nicht mehr.

$ sudo apt update
$ mkdir .ssh

Wenn das alles funktioniert hat, können wir uns an die Konfiguration des ssh Daemon machen. Erst einmal melden wir uns vom Server mit exit ab und senden den öffentlichen Schlüssel zum Server. Danach verbinden wir uns wieder neu. Wie bereits oben gelernt anpassen (winname, hostname 2x, username, domain).

$ exit
PS> scp C:\Users\winname\.ssh\hostname.ed25519.pub username@hostname.domain.de:~/.ssh/authorized_keys
PS> ssh username@hostname.domain.de
$ sudo mc

Der letzte Befehl startet den Midnight Commander mit root Rechten und wir wechseln in das Verzeichnis /etc/ssh um die Datei sshd_config zu bearbeiten (markieren, dann F4 drücken).

sshd_config im Midnight Commander
sshd_config im Midnight Commander

Drei Einträge sind anzupassen und ggf. die Raute (#) davor zu entfernen.

#Port 22
PermitRootLogin no
AuthorizedKeysFile      .ssh/authorized_keys  .ssh/authorized:keys2
PasswordAuthentication no

Wenn Du den Port anpassen möchtest, wähle einen oberhalb der Standardports (die ersten 1024) und entferne die Raute am Beginn der Zeile. ACHTUNG: wenn Du bereits eine Firewall scharf geschaltet hast, muss der neue Port freigegeben werden! PermitRootLogin regelt ob oder wie sich der root Benutzer remote anmelden kann und das sollte unterbunden werden. AuthorizedKeysFile ist üblicherweise bereits richtig vorbelegt (Raute entfernen). In dem wir PasswordAuthentication auf no setzen, unterbinden wir die Anmeldung mit Passwort. Mit F2 speichern, mit F10 den Editor verlassen und ein weiteres Mal F10 um den Midnight Commander zu beenden.

$ systemctl restart ssh
$ exit
PS> cd $env.userprofile
PS> cd .ssh
PS> notepad config

Der erste Befehl startet den ssh Deamon neu, der Folgende beendet die remote (SSH) Sitzung mit dem Server, die nächsten Beiden wechseln in das OpenSSH Konfigurationsverzeichnis des aktuell in Windows angemeldeten Benutzers und der letzte startet den Editor mit der Datei config. Sollte die nicht vorhanden sein, wirst Du gefragt ob sie erstellt werden soll und beantwortest den Dialog mit Ja. In die Datei schreibst Du folgende Zeilen einschließlich der Einrückungen (Tabulator). Die fett geschriebenen Teile sind Schlüsselworte und müssen genau so vorhanden sein. Im restlichen Teil ersetzt Du wieder hostname (3x), domain mit TLD (.de), username und winname wie bereits gewohnt. Wenn Du den Port auf dem Server geändert hast, muss der hier natürlich analog eingetragen werden. Speichern und beenden.

Host hostname
	HostName hostname.domain.de
	User username
	Port 22
	IdentityFile C:\Users\winname\.ssh\hostname.ed25519

Weitere Verbindungen können mit einer Leerzeile getrennt angefügt werden. Damit bist Du fertig und kannst das überprüfen. Mit einem kurzen Befehl solltest Du jetzt eine Verbindung zum Server aufbauen können.

PS> ssh hostname

Ich hoffe Dir damit ein klein wenig geholfen zu haben Deinen Server etwas sicherer zu gestalten. Als Nebenprodukt geht die Anmeldung von jetzt an auch noch schneller von der Hand.

Schreibe einen Kommentar