SSH-Keys mit TPM verschlüsselt speichern

Mithilfe eines TPM (Trusted Platform Module) lassen sich SSH-Keys verschlüsselt speichern und absichern. Für den Zugriff auf den TPM-Chip wird dabei die PKCS#11-Schnittstelle verwendet.

Folgende Software wurde verwendet:
  • Arch Linux
  • tpm2-tools v5.2-1
  • tpm2-pkcs11 v1.8.0

SSH-Key mit TPM 2.0 verschlüsseln & absichern

Voraussetzungen & Vorbereitung

Grundsätzlich benötigt ihr nur einen Rechner mit TPM-2.0-Chip. Alternativ könnt ihr aber auch eine VM mit emuliertem TPM nutzen. Stellt sicher, dass bei euch der Pfad /dev/tpm0 existiert. Außerdem überprüft, ob ihr über einen TPM-2.0-Chip verfügt:

cat /sys/class/tpm/tpm0/tpm_version_major
2
Terminal / Konsole

Installiert nun die folgenden zwei Pakete mit folgendem Befehl:

sudo pacman -S tpm2-tools tpm2-pkcs11
Terminal / Konsole

Nach der Installation sollte euer System über eine Gruppe namens tss verfügen. Diese müsst ihr nun noch eurem Benutzer zuordnen:

groupadd tss
Terminal / Konsole

Store initialisieren

Im ersten Schritt müssen wir einen sogenannten Store inkl. Slot, quasi eine Art Smartcard-Slot, erzeugen:

tpm2_ptool init
action: Created
id: 1
Terminal / Konsole
Hinweis TPM-PKCS#11-Initialisierung

Weiterführende Informationen zur Store- und Token-Initialisierung findet ihr im GitHub-Repository von tpm2-pkcs11: tpm2-pkcs11 - Initialization

Token erzeugen

Als nächstes erstellt einen Token mit einem aussagekräftigem Label, sowie der Angabe eurer PIN(s), die ihr ihr später zum Zugriff auf euren verschlüsselten SSH-Key benötigt. Als PID gebt die ID an, die euch beim Initialisieren des Stores/Slots angezeigt wurde.

tpm2_ptool addtoken --pid 1 --label sshtoken --sopin mysuperpin --userpin mypin
Terminal / Konsole
Warnung Passwort/PIN innerhalb Befehl eingeben

Aus Sicherheitsgründen sollten Passwörter/PINs eigentlich nicht innerhalb eines Terminal-Befehls direkt angegeben werden, wei sie sonst z.B. in der Shell-History landen. Für Bash gibt es hier z.B. die Einstellung HISTCONTROL mit der konfiguriert werden kann, dass Befehle, die mit einem Leerzeichen anfangen, nicht in der History landen.

SSH-Key erzeugen

In diesem Schritt gibt es prinzipiell zwei Möglichkeiten: entweder ihr lasst den SSH-Key direkt mithilfe des TPMs erzeugen, oder ihr erstellt ganz normal euren SSH-Key und importiert diesen anschließend. Im Folgenden werde ich die Import-Variante erklären.

Erstellt euch ein temporäres Verzeichnis und generiert euch einen SSH-Key mit einer sicheren Passphrase:

mkdir /tmp/sshkey
cd /tmp/sshkey
ssh-keygen -t rsa -b 2048 -f tpm_rsa
Terminal / Konsole

Sichert euch den privaten SSH-Key weg, da dieser gleich wieder gelöscht werden wird. Als nächstes muss der SSH-Key in ein Format gebracht werden, dass sich zum TPM-Import eignet. Hierfür ist es auch wichtig, dass die bestehende Passphrase wieder entfernt wird:

ssh-keygen -f tpm_rsa -mPEM -ep
Terminal / Konsole

Anschließend kann der SSH-Key importiert werden:

tpm2_ptool import --label sshtoken --key-label ssh-key1 --userpin mypin --privkey /tmp/sshkey/tpm_rsa --algorithm rsa
action: import
private:
  CKA_ID: '65383138366632396534356364353363'
public:
  CKA_ID: '65383138366632396534356364353363'
Terminal / Konsole

Zur Verifizierung, dass der Import korrekt funktoniert hat, lasst euch den Inhalt des Tokens anzeigen:

tpm2_ptool listobjects --label sshtoken
- CKA_CLASS: CKO_PRIVATE_KEY
  CKA_ID:
  - '65383138366632396534356364353363'
  CKA_KEY_TYPE: CKK_RSA
  CKA_LABEL: ssh-key1
  id: 1
- CKA_CLASS: CKO_PUBLIC_KEY
  CKA_ID:
  - '65383138366632396534356364353363'
  CKA_KEY_TYPE: CKK_RSA
  CKA_LABEL: ssh-key1
  id: 2
Terminal / Konsole
Hinweis TPM-SSH-Key-Speicherung

Im konkreten Fall wird der SSH-Key nicht direkt im internen TPM-Speicher gespeichert, sondern verschlüsselt in - standardmäßig - $HOME/.tpm2_pkcs11. Der verschlüsselte SSH-Key kann jedoch nur durch euren TPM-Chip entschlüsselt werden. Details siehe z.B. Using a TPM for SSH authentication sowie tpm2-pkcs11-Doku.

Nachdem der Import geklappt hat, löscht die SSH-Key-Datei, z.B. mit shred.

Public-SSH-Key ermitteln bzw. exportieren

Zum Ermitteln des Public-Keys eures SSH-Keys dient folgender Befehl (Pfad zur PKCS#11-Bibliothek kann ggf. auf eurem System abweichen):

ssh-keygen -D /usr/lib/pkcs11/libtpm2_pkcs11.so
ssh-rsa AAAAB3NzaC1yc[...] ssh-key1
Terminal / Konsole

SSH-Key für Authentifizierung verwenden

Möchtet ihr nun euren mit TPM abgesicherten SSH-Key verwenden, um euch mit einem entfernten SSH-Server, der euren Public-SSH-Key hinterlegt hat, zu verbinden, könnt ihr folgenden Befehl ausführen:

ssh -I /usr/lib/pkcs11/libtpm2_pkcs11.so sl@myserver
Enter PIN for 'sshtoken':
Terminal / Konsole

Um den Pfad zur PKCS#11-Bibliothek nicht immer angeben zu müssen, könnt ihr alternativ auch eure SSH-Konfiguration entsprechend anpassen, oder SSH-Aliasse verwenden.

Fazit

Mit den hier vorgestellten Paketen, lassen sich SSH-Keys relativ leicht mit einem TPM-Chip absichern.

Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).