Ein Forenmitglied fragte mich auf Matrix wie es mit Windows 11 unter Bhyve aussähe, da ab FreeBSD 14.3 nun ja TPM unterstützt würde. Das führte zu etwa Bastelei und da TPM in Bhyve-VMs eher dünn dokumentiert ist, fasse ich die Erkenntnisse hier einmal zusammen. Das ist der manuelle Weg, Management-Scripte müssen das natürlich entsprechend integrieren. Und es ist der einfachst mögliche Fall, ein simples Software-TPM ohne Certificate Authority. Das ist genug für Windows 11 - wo die allermeisten Nutzer das TPM für verwenden werden wollen - aber wahrscheinlich zu wenig für spezielle Szenarien.
Zuerst muss swtpm installieren werden. Es kann beliebige Software-TPMs zur Verfügung stellen:
Jetzt kann ein Software-TPM erstellt werden:
Der swtmp-Prozess muss mindestens solange laufen, wie auch die Bhyve-VM läuft. Ein beenden des swtmp-Prozesses beendet auch den Bhyve-Prozess und damit die VM. Die Optionen sind:
Der swtpm-Prozess kann auch unter einem unpriviligierten Nutzer ausgeführt werden. In jedem Fall sollte die Datei des TPM-State mit minimalen Rechten versehen werden. Wenn sie abhanden kommt, ist es doof. Der Witz eines TPM ist ja gerade, dass die darin gespeicherten Secrets vor unbefugten Zugriffen (einigermaßen) sicher sind.
Nun kann das Software-TPM an die Bhyve-VM gebunden werden.
Für die Kommandozeile ist es:
Wer wie ich lieber die Config-Datei nutzt, kann es alternativ auch dort einbinden:
Anschließend wird der Gast das TPM erkennen. Unter Linux taucht ein /dev/tpm0 auf, unter Windows kann man in tpm.msc schauen. Windows 11 lässt sich ohne die bisher notwendigen Hacks installieren und funktioniert. Kleine Erkenntnis am Rande ist noch, dass Windows 11 die Minimalanforderung an die CPU anscheinend nicht prüft, wenn es virtualisiert läuft. Selbst auf dem wirklich alten Core i5-3350 in meinem Testsystem, der weitab von der Minimalanforderung ist, installierte es ohne zu Murren aus dem offiziellen ISO bis zum Desktop durch und ließ sich anschließend updaten.
Zuerst muss swtpm installieren werden. Es kann beliebige Software-TPMs zur Verfügung stellen:
pkg install swtpm
Jetzt kann ein Software-TPM erstellt werden:
swtpm socket --tpmstate backend-uri=file:///pfad/zu/tpm.state --server type=unixio,path=/pfad/zu/tpm.sock --tpm2 --flags not-need-init
Der swtmp-Prozess muss mindestens solange laufen, wie auch die Bhyve-VM läuft. Ein beenden des swtmp-Prozesses beendet auch den Bhyve-Prozess und damit die VM. Die Optionen sind:
--tpmstate backend-uri=file:///pfad/zu/tpm.state
: Datei, in welcher der TPM-State (also die Daten im TPM) gespeichert werden. Muss für jede VM eindeutig sein, mehrere VM dürfen sich kein TPM teilen. Das führt zu Chaos. Und muss dauerhaft erhalten bleiben, da sonst die im TPM gespeicherten Daten verloren gehen. Windows 11 findet das eher mäßig lustig. Existiert die Datei noch nicht, wird sie angelegt.--server type=unixio,path=/pfad/zu/tpm.sock
: Ein Unix Domain Socket für die Kommunikation zwischen swtmp und Bhyve. Muss wieder für jede VM eindeutig sein, wobei sich das eigentlich schon aus der Anforderung, ein TPM pro VM zu nutzen, ergibt.--tpm2
: Byhve unterstützt nur und und ausschließlich TPM 2.0. Das muss hier explizit gesagt werden, denn sonst erhält man ein TPM 1.2 und das wird nicht funktionieren. Es führt dann zu seltsamen Fehler im Gast-Betriebssystem.--flags not-need-init
: Weist swtpm an auch dann Lese- und Schreibzugriffe auf das TPM zuzulassen, wenn es nicht explizit initialisiert wurde. Notwendig, da die aktuelle UEFI-Firmware für Bhyve es nur so lala initiert. Mit einem zukünftigen Update auf ein aktuelles Tianocorewird das voraussichtlich nicht mehr notwendig sein.
Der swtpm-Prozess kann auch unter einem unpriviligierten Nutzer ausgeführt werden. In jedem Fall sollte die Datei des TPM-State mit minimalen Rechten versehen werden. Wenn sie abhanden kommt, ist es doof. Der Witz eines TPM ist ja gerade, dass die darin gespeicherten Secrets vor unbefugten Zugriffen (einigermaßen) sicher sind.
Nun kann das Software-TPM an die Bhyve-VM gebunden werden.
Für die Kommandozeile ist es:
-l tpm,swtpm,/pfad/zu/tpm.sock
Wer wie ich lieber die Config-Datei nutzt, kann es alternativ auch dort einbinden:
Code:
tpm.path=/pfad/zu/tpm.sock
tpm.type=swtpm
tpm.version=2.0
Anschließend wird der Gast das TPM erkennen. Unter Linux taucht ein /dev/tpm0 auf, unter Windows kann man in tpm.msc schauen. Windows 11 lässt sich ohne die bisher notwendigen Hacks installieren und funktioniert. Kleine Erkenntnis am Rande ist noch, dass Windows 11 die Minimalanforderung an die CPU anscheinend nicht prüft, wenn es virtualisiert läuft. Selbst auf dem wirklich alten Core i5-3350 in meinem Testsystem, der weitab von der Minimalanforderung ist, installierte es ohne zu Murren aus dem offiziellen ISO bis zum Desktop durch und ließ sich anschließend updaten.