SSH-Keys mit TPM
Im Artikel SSH-Keys mit Yubikey habe ich erläutert, wie man einen Yubikey als SSH-Key nutzen kann. Doch Yubikeys sind nicht ganz billig und die meisten Geräte heutzutage bieten mit TPM1 eine kostengünstige Alternative.
Zunächst benötigen wir ein paar Softwarepakete:
sudo apt install libtpm2-pkcs11-tools libtpm2-pkcs11-1 opensc
Um zu prüfen, ob unser TPM erreichbar ist nutzen wir einfach folgenden Befehl:
ls /dev/tpm0
Wir hier kein Output generiert, steht unser TPM leider nicht zur Verfügung. Falls doch, können wir weitermachen. Zunächst fügen wir unseren User der Gruppe tss
hinzu. Anschließend nutzen wir su
um eine Session zu erzeugen, in der wir dieser Gruppe angehören (dies nicht nach einer Neuanmeldung am Rechner nicht mehr nötig).
sudo usermod -a -G tss "$(id -nu)"
su "$(id -nu)"
Um zu überprüfen ob unser TPM korrekt arbeitet können wir folgenden Befehl nutzen:
tpm2_getcap properties-fixed
Das Ergebnis sollte ein recht langer Output der Eigenschaften unseres TPM sein.
Nun können wir unseren Key im TPM erzeugen:
tpm2_ptool init
tpm2_ptool addtoken --pid 1 --label=ssh --userpin=1234 --sopin=1234
tpm2_ptool listtokens --pid 1
tpm2_ptool addkey --label=ssh --userpin=1234 --algorithm=rsa2048 --key-label "TPM SSH Key"
ssh-keygen -D /usr/lib/x86_64-linux-gnu/libtpm2_pkcs11.so.1
Hier die Erläuterung der einzelnen Parameter:
--pid 1
: legt den Slot im TPM fest, in dem wir unseren Key speichern wollen. In der Regel stehen mehrere Slots für unterschiedliche Keys zur Verfügung--userpin
: legt den PIN für die Nutzung des Keys fest--sopin
: ist unser Backup-PIN sollten wir denuserpin
einmal vergessen haben--label
/--key-label: dient zur Identifikation des Keys und kann einen beliebigen Wert haben--algorithm
: erzeugt einen RSA Key mit 2048 Bit, hier sollte man auch höhere Werte ausprobieren, ob diese Funktionieren ist jedoch abhängig von den Eigenschaften unseres TPM Chips, es stehen ggf. auch andere Verfahren als RSA zur Verfügung. Bestenfalls sollte hier natürlich EDDSA/ed25519 genutzt werden (nicht ECDSA). Soweit mir bekannt ist dies jedoch inlibtpm2
nocht nicht implementiert.
Wenn wir prüfen wollen, ob eventuell schon ein Slot genutzt wird, können wir dies mit folgendem Befehl tun:
pkcs11-tool --module /usr/lib/x86_64-linux-gnu/libtpm2_pkcs11.so.1 --show-info
Der Output könnte wie folgt aussehen:
Cryptoki version 2.40
Manufacturer tpm2-software.github.io
Library TPM2.0 Cryptoki (ver 0.0)
Using slot 0 with a present token (0x1)
Anstatt einen neuen Key zu erzeugen, ist es auch möglich einen bestehenden Key (z.B. ~/.ssh/id_rsa
) zu importieren:
tpm2_ptool import --label ssh --privkey ~/.ssh/id_rsa --userpin 1234
Um den Key nutzen zu können, muss er als usr/lib/x86_64-linux-gnu/libtpm2_pkcs11.so.1
referenziert werden. Am einfachsten geht dies über entsprechende Einträge in ~/.ssh/config
. Also zum Beispiel:
Host dns 192.168.178.100
HostName 192.168.178.100
PKCS11Provider /usr/lib/x86_64-linux-gnu/libtpm2_pkcs11.so.1
PasswordAuthentication no
IdentitiesOnly yes
User root
Da der Key so nun an unser Gerät gebunden ist, sollten wir natürlich dafür sorgen, dass wir weiterhin Zugriff auf unsere SSH-Systeme haben, wenn uns das Gerät einmal abhanden kommen sollte, oder schlicht nicht mehr korrekt funktioniert. Das kann z.B. über einen zweiten, normalen SSH-Key erfolgen, den wir ausschließlich auf einem USB-Stick speichern und sicher verwahren.