回避策なしで Windows 11
できること
VM の TPM を有効にすれば(ウィザードで、または構成に "tpm": true と書く)、あとは keelOS が処理します。初回起動時に TPM の ID(エンドースメントキー、証明書、SHA-256 の PCR バンク)を作成します。VM の起動や再開のたびに、新しい TPM エミュレーターを起動します。TPM の永続的な状態は VM 自身の ZFS データセットにあるため、スナップショットやコピーにも含まれます。
しくみ
VM からは標準の CRB TPM インターフェースが見えます。その裏で動くのは、QEMU や Proxmox も使っている TPM エミュレーター swtpm です。keelOS はその 2 つのチャネルの両方を接続します。TPM コマンド用のデータチャネルと、電源投入、リセット、状態の保存のための制御チャネルです。そのため、ゲストを再起動すると TPM もリセットされ、TPM の揮発性の状態(PCR、セッション、ロード済みのキー)はサスペンド時に VM のチェックポイントに保存され、再開時に新しいエミュレーターに読み込まれます。このチェックポイントは、ホストの再起動時に使われるものと同じです。
上流の bhyve の TPM コードも堅牢にしました。不正なコマンドには TPM を無効化せず TPM エラーを返し、未実装のレジスタは VM を止めずに実機と同じく無視し、エミュレーターが落ちてもゲストは TPM エラーを受け取って動作を続けます。
テストした内容
- Windows 11 25H2:インストーラー自身の TPM 2.0 と Secure Boot のチェックを、回避策なしで通過。
- BitLocker が TPM 保護機能でシステムディスクを暗号化。
- Windows の再起動:TPM が自動でアンシールし、回復キーは求められない。
- 新しいエミュレータープロセスでのサスペンドと再開:一時停止 3.7 秒、TPM と BitLocker は問題なし。
- PCR の値は再開の前後で同じで、ゲストの再起動時にはゼロから測定し直される。
あわせて、新しい VM ではすべての vCPU を 1 ソケットに置くようにしました(Windows 11 Pro が使えるソケットは 2 つまで)。また、Windows の再起動時にハングを起こしていた e1000 の割り込みのバグも修正しました。
未対応のこと
- TPM の状態ファイルは暗号化されていません。ディスクと同じマシン上にあるため、暗号化してもここではほとんど保護になりません。
- Microsoft の Secure Boot キーは事前登録されていません。
- Windows の「TPM のクリア」のように、次回起動時にファームウェアが実行すべき TPM の要求は失われます。上流の bhyve にも同じ問題があります。
- BitLocker を有効にする前に、起動可能なインストール用 ISO を取り外す必要があります。そうしないと Windows が拒否します。