GPG-Keys mit TPM verschlüsselt speichern
Analog zur Abscherung von SSH-Keys, lassen sich auch GPG-Keys mittels TPM (Trusted Platform Module) verschlüsselt speichern. Wie ihr das unter Linux bewerkstelligt, zeige ich euch in folgendem Beitrag.
Voraussetzungen & Vorbereitung
Ihr benötigt zum einen GnuPG ab v2.3 sowie einen Rechner mit einem TPM-2.0-Chip. Zu Testzwecken könntet ihr aber auch eine VM mit emuliertem TPM einsetzen. 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 Damit ihr auf den TPM-Chip zugreifen könnt, benötigt ihr entsprechende Rechte. Am einfachsten ist es, wenn ihr eurem Benutzer die Gruppe tss hinzufügt.
sudo gpasswd --add sl tss
Des Weiteren solltet ihr über einen (privaten) GPG-Key verfügen, den ihr per TPM verschlüsseln möchtet. In meinem Beispiel Fall sieht das bspw. wie folgt aus:
gpg --edit-key mustermann@example.com
gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Geheimer Schlüssel ist vorhanden.
gpg: "Trust-DB" wird überprüft
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: Tiefe: 0 gültig: 2 signiert: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 2u
sec rsa2048/0xF94EED5F9726292E
erzeugt: 2024-02-17 verfällt: niemals Nutzung: SC
Vertrauen: ultimativ Gültigkeit: ultimativ
ssb rsa2048/0x0D290375E6A7953D
erzeugt: 2024-02-17 verfällt: niemals Nutzung: E
[ ultimativ ] (1). Max Mustermann <mustermann@example.com>Aktuell liegen die o.a. privaten Keys verschlüsselt in meinem Benutzer-Home-Verzeichnis.
GPG-Key via TPM verschlüsseln
Führt nun folgende Befehle aus, um den privaten Master-Key per TPM zu verschlüsseln:
gpg --edit-key mustermann@example.com
gpg> keytotpm
Den Hauptschlüssel wirklich verschieben? (j/N) j Nachdem ihr die Nachfrage per j bestätigt habt, werdet ihr nach der Passphrase eures GPG-Keys gefragt. Nach erfolgter Eingabe müsst ihr anschließend die zu verwendende TPM-Passphrase festlegen:

Wenn alles geklappt hat, dann sollte euer privater Haupt-Key nun als TPM-protected markiert sein.
sec rsa2048/0xF94EED5F9726292E
erzeugt: 2024-02-17 verfällt: niemals Nutzung: SC
Kartennummer:TPM-Protected
Vertrauen: ultimativ Gültigkeit: ultimativ
ssb rsa2048/0x0D290375E6A7953D
erzeugt: 2024-02-17 verfällt: niemals Nutzung: E
[ ultimativ ] (1). Max Mustermann <mustermann@example.com>Das Gleiche wiederholen wir nun noch mit dem Encryption-Subkey.
gpg> key 1
gpg> keytotpm
sec rsa2048/0xF94EED5F9726292E
erzeugt: 2024-02-17 verfällt: niemals Nutzung: SC
Kartennummer:TPM-Protected
Vertrauen: ultimativ Gültigkeit: ultimativ
ssb* rsa2048/0x0D290375E6A7953D
erzeugt: 2024-02-17 verfällt: niemals Nutzung: E
Kartennummer:TPM-Protected
[ ultimativ ] (1). Max Mustermann <mustermann@example.com>Habt ihr weitere Subkeys, so könnt ihr für diese den Vorgang entsprechend wiederholen.
TPM-verschlüsselten GPG-Key verwenden
Im Prinzip ändert sich bei der Verwendung eurer GPG-Keys nichts. Ihr werdet nun jedoch immer nach der TPM-Passphrase gefragt, wenn euer privater GPG benötigt wird. Als Beispiel dient das Ver- und Entschlüsseln einer Datei:
gpg --output test.txt.gpg --encrypt --recipient mustermann@example.com test.txt
gpg --output test.txt.decrypted --decrypt test.txt.gpg
Für das Entschlüsseln mit eurem privaten GPG-Key müsst ihr nun statt der normalen Passphrase die TPM-Passphrase eingeben:

Fazit
Die TPM-bsierte Verschlüsselung von GPG-Keys ist seit GnuPG v2.3 leicht umzusetzen und für einige eventuell eine Alternative zu einem separat zu kaufenden Hardware-Security-Token, wie z.B. einem YubiKey, oder NitroKey.