SSH Verbindung ohne Passwort (mit Key)

Für eine erhöhte Sicherheit beim SSH-Login bietet sich die Authentifizierung mittels SSH-Schlüssel an.
Zusätzlich wird der Login mittels Passwort deaktiviert.

In dieser Anleitung wird die Generierung auf Windows und Linux (auch WSL) beschrieben und abschließend, wie der öffentliche Schlüssel auf den Server zu legen und die SSH-Konfiguration vorzunehmen ist.

SSH Schlüssel auf Windows generieren

In neueren Windows 10 Versionen steht der OpenSSH-Client bereit. Falls dieser nicht installiert ist, kann dieser installiert werden.
Hierfür nutzt man unter Einstellungen “Apps & Features”, klickt auf “Optionale Features” und installiert mittels “Feature hinzufügen” den OpenSSH-Client.

Nach der Installation stehen die Kommandozeilen-Tools zur Verfügung und die Generierung kann durchgeführt werden.
Je nach Plattform die man unterstützten möchte, kann es notwendig sein den veralteten Standard (RSA) zu verwenden.
In diesem Fall sollte man einen möglichst großen Schlüssel verwenden (4096 Bit). Gemäß der Doku empfiehlt sich das Schlüsselverfahren ecdsa zu verwenden.

ssh-keygen -t ecdsa -b 521
ssh-keygen -t rsa -b 4096
ssh-keygen -t ed25519

Hier ein komplettes Beispiel in dem der Pfad mittels Enter bestätigt und ein Passwort für den Schlüssel festgelegt wird. Das Passwort schützt den Schlüssel im Fall von Diebstahl durch Datei-Kopieren!

# .ssh Ordner im $HOME anlegen und betreten
cd
mkdir .ssh
cd .ssh

# Key generieren
C:\Users\User\.ssh>ssh-keygen -t ecdsa -b 521

Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\User/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\User/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\User/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx User@PC
The key's randomart image is:
+---[ECDSA 521]---+
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
+----[SHA256]-----+

Nach der Generierung finden sich, je nach gewähltem Verfahren zwei Dateien im Verzeichnis .ssh:

  • id_$verfahren (privater Schlüssel)
  • id_$verfahren.pub (öffentlicher Schlüssel)

Die *.pub Datei ist nützlich, aber nicht zwingend notwendig, da diese immer wieder aus dem privaten Schlüssel generiert werden kann:

ssh-keygen -f $privater_schlüssel -y
# <Passwort eingeben>

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAF1mthDNIv98jiT5qF85YCd9QmvgK+bTn/VLQVRmJyC12dOSjGpcam4c5Uu9t5dEXtr1bRSW9nCC7Ro6Exla0y86AALfgrTTAFysotLuqJD5bigQN5J50qpZJwUs8wlB12NehrNvAfCQiEYvmN6Bg0RugUyHSi21jlQ4kSj6RsDMAT9Xw==

SSH Schlüssel auf Linux (oder WSL) generieren

Im Regelfall sollte die Anwendung ssh-keygen bereits installiert sein. Ist dies nicht der Fall, müssen die Pakete dafür installiert werden. Wie immer für Ubuntu / Debian und Archlinux:

pacman -Syu openssh
apt update && apt install openssh-client

Im Anschluss wird wie unter Windows der Schlüssel generiert:

ssh-keygen -t ecdsa -b 521
ssh-keygen -t rsa -b 4096
ssh-keygen -t ed25519

Mehr Informationen dazu finden sich oben in der Windows-Anleitung.
Der Ausgabe-Pfad ist ebenfalls der $Benutzer-Ordner/.ssh.

ohne Passwort, aber per Key

Der öffentliche Schlüssel muss in das Home-Verzeichnis des Users gelegt werden, als der man sich einloggen möchte. In diesem Beispiel nennt er sich “user1”.
Den Inhalt der id_$verfahren.pub legt man nun in die authorized_keys Datei (/home/user1/.ssh/authorized_keys.
Diese Datei kann eine beliebige Menge von öffentlichen Schlüsseln enthalten.
Hinter dem Schlüssel können Kommentare hinzugefügt werden.

# Auflisten der Keys
cat /home/user1/.ssh/authorized_keys

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAF1mthDNIv98jiT5qF85YCd9QmvgK+bTn/VLQVRmJyC12dOSjGpcam4c5Uu9t5dEXtr1bRSW9nCC7Ro6Exla0y86AALfgrTTAFysotLuqJD5bigQN5J50qpZJwUs8wlB12NehrNvAfCQiEYvmN6Bg0RugUyHSi21jlQ4kSj6RsDMAT9Xw== mein kommentar zum schlüssel

Funktionstest

Beim Verwenden des Schlüssels muss dieser mit dem gewählten Kennwort geöffnet werden:

ssh user1@server.host
Enter passphrase for key 'C:\Users\User/.ssh/id_ecdsa':
Last login: Sun Apr 25 22:34:34 2021 from x.x.x.x
user1@server ~

Möchte man nicht jedes mal das Kennwort eingeben, bietet sich ein SSH Agent an.
Dieser hält solange er läuft den SSH-Schlüssel bereit.
Deshalb muss man den privaten Schlüssel nur einmalig öffnen.

ssh-agent bash
ssh-add
# <Passwort eingeben>
``´

Unter Windows kann der Agent-Dienst deaktiviert sein, in diesem Fall muss man diesen vorab mittels Powershell (als Admin) aktivieren:

```powershell
Get-Service -Name ssh-agent | Set-Service -StartupType Manual

Passwort Authentifizierung deaktivieren

Unter bearbeitet man die OpenSSH-Server-Konfiguration und startet den Dienst neu. Falls etwas fehlschlägt, auf gar keinen Fall die Konsolenverbindung trennen.
Ein Neustart bricht eine existierende Verbindung nicht ab, sodass man die Fehlkonfiguration noch reparieren kann! In diesem Beispiel verwenden wir nano (auch wenn ich vim bevorzuge).
Nach Bearbeitung beendet man diesen mit “STRG + X”, “y”, “Enter”.

nano /etc/ssh/sshd_config

# verbietet root Login mittels Passwort
# (ohne SSH Key ist dann kein root Login mehr möglich)
PermitRootLogin prohibit-password

# verbiete generell Passwort-Authentifizierung
PasswordAuthentication no

Ausnahmen für bestimmte Benutzer

Es kann hilfreich sein, einzelnen Benutzern die Authentifizierung dennoch zu erlauben:

# erlaube für Benutzer "user2" Passwort-Authentifizierung
Match User user2
  PasswordAuthentication yes
  
# erlaube allen Benutzern der Gruppe sshpass Passwort-Authentifizierung
Match Group sshpass
  PasswordAuthentication yes

SSH-Daemon neustarten

systemctl restart sshd.service

# im Fehlerfall prüfen:
systemctl status sshd.service

https://www.ssh.com/academy/ssh/keygen