NixOS で TPM2 を用いて LUKS2 を自動解錠する
NixOS で TPM2 を用いた LUKS2 の自動解錠を試してみたので、備忘録としてまとめておきます。 自動解錠を設定したい動機は、NixOS を導入した PC を Bluetooth キーボードで普段操作しているのですが、 起動時の暗号化されたディスクを解錠するタイミングだけはまだ Bluetooth 接続が行われず、キーボードを有線接続する必要があるためです。 あまりにも面倒すぎる🫠
なお、NixOS をインストールするタイミングでルートディスクを LUKS2 で暗号化していることと、 PC に TPM 2.0 が搭載されており、UEFI で有効になっていることが前提です。
LUKS2 ボリュームを確認する
最初に、対象となる LUKS2 ボリュームの UUID を確認します。
lsblk --fsこのコマンドを実行すると、各パーティションのファイルシステムの種類や UUID が表示されます。luks- で始まる文字列が表示されていると思うので、そのパーティションの UUID を控えておきます。
なお、コマンド以外に hardware-configuration.nix の内容からも UUID を確認できます。hardware-configuration.nix の中に以下のような記述を探してみてください。
boot.initrd.luks.devices."luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".device = "/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";NixOS の設定
configuration.nix など、NixOS の設定を管理しているファイルに以下を追加します。
security.polkit.enable = true;
# TPM2 configurationssecurity.tpm2.enable = true;security.tpm2.pkcs11.enable = true;security.tpm2.tctiEnvironment.enable = true;
# Enable TPM2 for initrdboot.initrd.systemd.enable = true;boot.initrd.systemd.tpm2.enable = true;boot.initrd.luks.devices."luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".crypttabExtraOpts = [ "tpm2-device=auto"];xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx の部分は、先ほど確認した LUKS2 ボリュームの UUID に置き換えてください。
設定を保存したら、sudo nixos-rebuild switch 等のコマンドで設定を反映しておきます。
上記設定には不要な設定が含まれている気がします。 面倒なので切り出していませんが、とりあえず私の環境だとこれで動いていることを確認しています。
TPM2 に鍵を登録する
設定を反映したら、systemd-cryptenroll を使って LUKS2 ボリュームに TPM2 の鍵を登録します。
sudo systemd-cryptenroll \ --tpm2-device=auto \ --tpm2-pcrs=0+7 \ --wipe-slot=tpm2 \ /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx既存のパスフレーズを質問されるので入力します。 システムを再起動し、暗号化されたディスクがパスフレーズなしで自動解錠されることを確認できれば、設定は完了です。
まとめ
インターネット上には、既に TPM を用いた LUKS2 の自動解錠に関する情報はいくつもあります。しかし、NixOS での設定例はそれぞれが微妙に異なるアプローチを採用していて、私の環境だとうまく動作しないことが多かったです。
この記事では、一応私の環境で動作した設定例をまとめてみました。 NixOS のバージョンや TPM2 の実装、その他諸々の環境の差異によって動作しない可能性もあります。もしうまくいかない場合は、公式ドキュメントや他の情報源も参考にしてみてください。
私の設定は ここ にまとまっています。 Denix という Nix ライブラリを使っていて設定ファイルの書き方が少し特殊ですが、興味があれば参考にしてみてください。
Last Updated: Sep 12, 2026