Tutorial | SSH Login mit 2-Faktor-Authentifizierung FIDO Stick

von Thomas


Erstellt am 26.02.2020

Letztes Update am 17.11.2021


SoloKey eingesteckt am Notebook

Mit der Version OpenSSH 8.2 kommt der Support für U2F/FIDO. Somit ist es möglich ein SSH Schlüsselpaar zum Login auf einem Server, mit einem Security Token abzusichern. Im Fachjargon wird das 2-Faktor-Authentifizierung (2FA) genannt. Der Vorteil ist, dass das SSH Schlüsselpaar beim Erstellungsprozess mit dem FIDO Stick verschlüsselt wird und sich auch nur mit genau dem Stick wieder verwenden lässt. Sollte ein Angreifer an den privaten Schlüssel des Paars kommen, ist dieser ohne den Token nutzlos. Der private Schlüssel lässt sich nur mit Betätigen des Security Token nutzen.

Installation OpenSSH 8.2

ssh -V

Das aktuelle Arch Linux bringt OpenSSH schon in der neusten benötigten Version mit:

OpenSSH_8.8p1, OpenSSL 1.1.1l  24 Aug 2021

Mit Debian 11 ist Version 8.4p1 eingeganngen, sodass Debian 11 die Funktion ebenfalls unterstützt:

OpenSSH_8.4p1 Debian-5, OpenSSL 1.1.1k  25 Mar 2021

Bei älteren Systemen, wie Ubuntu, Debian, BSD empfehle ich folgende Installationen:

  • Github OpenSSH, in der README ist die Installation beschrieben. (Github)
  • Alternativ, mit einem Ubuntu Docker Image. (privater Blog)

Erzeugen eines Schlüsselpaars mit einem FIDO Stick

ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ecdsa_sk
Your public key has been saved in /home/user/.ssh/id_ecdsa_sk.pub

Verwendung des SSH-Schlüssels

Anschließend muss der Public Key auf den Server gepusht werden:

ssh-copy-id -i ~/.ssh/id_ecdsa_sk.pub user@<your-IP-or-domain>

Nun können wir das neu erzeugte Schlüsselpaar verwenden (beachtet das der Server ebenfalls Openssh Version 8.2 oder höher verwenden muss):

ssh user@<your-IP-or-domain>

Durch betätigen des Keys loggen wir uns automatisch ein.

Benutzen wir die Option -v können wir die Gegenseite kontrollieren, ob sie die gleiche Version wie wir unterstützt. Dabei müssen wir auf folgenden Zeilen achten:

debug1: Local version string SSH-2.0-OpenSSH_8.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_8.2
debug1: match: OpenSSH_8.2 pat OpenSSH* compat 0x04000000

Die Authentifizierung kann wie folgt kontrolliert werden:

debug1: Offering public key: /home/user/.ssh/id_ecdsa_sk ECDSA-SK SHA256:48ymh350lq9ytm44mutgjpimbi6lbj8klkjg8z62ewb6fugtng authenticator agent
debug1: Server accepts key: /home/user/.ssh/id_ecdsa_sk ECDSA-SK SHA256:48ymh350lq9ytm44mutgjpimbi6lbj8klkjg8z62ewb6fugtng authenticator agent
debug1: Authentication succeeded (publickey).

Welche FIDO Sticks können verwendet werden?

Prinzipiell kann jeder Stick der FIDO U2F unterstützt verwendet werden. Folgende Hersteller bieten solche Sticks an:

Probleme bei der Verwendung eines Security Tokens

Wichtig zu beachten ist, dass der Private SSH Schlüssel nur mit dem FIDO Security Token verwendbar ist. Sollte der Stick abhanden kommen kann der Private Schlüssel nicht mehr genutzt werden. Meines Wissens ist es aktuell nicht möglich Recoverycodes oder ähnliches zu erstellen. Eine Lösung wäre einen zweiten FIDO Stick als Backup zu verwenden. So müssten jedoch immer beide Keys auf den zu verbindenden Server gepusht werden.