#!/coding/blatt
Sammelsurium mit Schwerpunkten Linux & IT-Sicherheit

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.

Folgende Software wurde verwendet:
  • Arch Linux
  • gpg v2.4.3

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
Terminal / Konsole

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
Terminal / Konsole

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>
Terminal / Konsole

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
Terminal / Konsole

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:

TPM-Passphrase für GPG-Key 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>
GPG-Key als TPM-protected markiert

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>
Terminal / Konsole

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 
Terminal / Konsole

Für das Entschlüsseln mit eurem privaten GPG-Key müsst ihr nun statt der normalen Passphrase die TPM-Passphrase eingeben:

TPM-Passphrase für GPG-Key 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.