SSH-Keys mit Yubikey
So gut wie jede*r mit ein klein wenig Interesse an IT wird über Fälle gelesen haben, bei denen geheime Schlüssel versehentlich öffentlich gemacht wurden. Oft passiert dies, indem irgendwelche Git-Repositories öffentlich zugänglich gemacht werden. Es gibt z.B. zahlreiche Sammlungen sog. dotfiles
1, die das Verzeichnis .ssh
beinhalten. Dort liegen auch oft auch die geheimen Schlüssel für den Zugang zu diversen Systemen.
Dies kann man effektiv verhindern, indem diese Schlüssel nicht auf der Festplatte sondern in besonders gesicherten Bereichen abgelegt werden. Dies kann z.B. ein Yubikey2 sein. Wer keinen Yubikey hat, aber einen Rechner mit TPM Chip, kann sich auch gern den Artikel SSH-Keys mit TPM anschauen.
Ein Yubikey kann über verschiedene Verfahren in den SSH-Authentifizierungsprozess eingebunden werden, eine vollständige Liste der Verfahren findet sich unter 3. Ich werde hier auf das FIDO2-Verfahren eingehen. Hierzu benötigt man OpenSSH in Version 8.2p1 oder höher, sowie bestenfalls einen Yubikey ab Version 5.3. Frühere Versionen des Yubikeys funktionieren zwar auch, nutzen aber ECDSA4 5.
Um die Version des eigenen Yubikey zu ermitteln kann der folgende Befehl genutzt werden:
lsusb -v 2> /dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'
Zur Erzeugung der SSH-Keys benötigen wir noch ein paar Programme und Bibliotheken:
sudo apt install libfido2-1 libfido2-dev libfido2-doc fido2-tools
Nun kann man mit der Erzeugung des SSH-Keys beginnen.
Ein Yubikey vor der Version 5.3 nutzt ECDSA und damit folgenden Befehl:
ssh-keygen -t ecdsa-sk -f ~/.ssh/yubikey -C yubikey
Ein Yubikey ab Version 5.3 kann auch ED25519 nutzen:
ssh-keygen -t ed25519-sk -f ~/.ssh/yubikey -C yubikey # yubikey >= 5.3
Der Parameter -t
legt den Keytypen fest, wichtig ist das -sk
, sonst wird ein normaler SSH-Key erzeugt, der unabhängig vom Yubikey funktioniert. Der Parameter -C
legt einen Kommentar fest, der es später erleichtert den Key zuzuordnen. Der Parameter -f
legt fest wo und unter welchem Namen der Publickey, sowie eine Referenz auf den Privatekey abgelegt wird.
Optional kann noch der Parameter -O verify-required
verwendet werden, er sorgt dafür, dass der Button des Yubikeys gedrückt werden muss, wenn der Key zur Anmeldung genutzt werden soll.
Je nach Art des Yubikeys muss während der Keyerstellung der PIN des Yubikeys eingegeben werden.
Anschließend sollten in ~/.ssh
zwei neue Dateien zu finden sein:
- yubikey.pub: Der Publickey
- yubikey: Die Referenz auf den private Key im Yubikey. Die Datei sieht zwar aus wie ein normaler private Key, kann aber nur im Zusammenhang mit dem zugehörigen Yubikey genutzt werden
Die Handhabung des Publickeys unterscheidet sich nicht von normalen Publickeys, er kann wie gewohnt mit ssh-copy-id
auf die gewünschten Systeme übertragen werden. Sollte man den Publickey mal verlegt haben, kann man ihn jederzeit mit dem Befehl ssh-keygen -K
aus dem Yubikey auslesen.
Auch die Nutzung des Keys in einer ~/.ssh/config
unterscheidet sich nicht von einem normalen Key. Er kann wie gewohnt mittels IdentityFile ~/.ssh/yubikey
referenziert werden.
Ich empfehle stets mind. zwei Yubikeys zu verwenden und einen davon sicher zu verwahren, falls der Hauptkey einmal verloren gehen sollte.