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.
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
Installiert nun die folgenden zwei Pakete mit folgendem Befehl:
sudo pacman -S tpm2-tools tpm2-pkcs11
Nach der Installation sollte euer System über eine Gruppe namens tss
verfügen. Diese müsst ihr nun noch eurem Benutzer zuordnen:
groupadd tss
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
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
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
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
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'
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
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
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':
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.