h-terao.dev
Open palette Ctrl+K

NixOS で TPM2 を用いて LUKS2 を自動解錠する

Sep 12, 2026 / NixOS

NixOS で TPM2 を用いた LUKS2 の自動解錠を試してみたので、備忘録としてまとめておきます。 自動解錠を設定したい動機は、NixOS を導入した PC を Bluetooth キーボードで普段操作しているのですが、 起動時の暗号化されたディスクを解錠するタイミングだけはまだ Bluetooth 接続が行われず、キーボードを有線接続する必要があるためです。 あまりにも面倒すぎる🫠

なお、NixOS をインストールするタイミングでルートディスクを LUKS2 で暗号化していることと、 PC に TPM 2.0 が搭載されており、UEFI で有効になっていることが前提です。

LUKS2 ボリュームを確認する

最初に、対象となる LUKS2 ボリュームの UUID を確認します。

Terminal window
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 configurations
security.tpm2.enable = true;
security.tpm2.pkcs11.enable = true;
security.tpm2.tctiEnvironment.enable = true;
# Enable TPM2 for initrd
boot.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 等のコマンドで設定を反映しておきます。

Note

上記設定には不要な設定が含まれている気がします。 面倒なので切り出していませんが、とりあえず私の環境だとこれで動いていることを確認しています。

TPM2 に鍵を登録する

設定を反映したら、systemd-cryptenroll を使って LUKS2 ボリュームに TPM2 の鍵を登録します。

Terminal window
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