Fedora IoTでディスク暗号化しつつTPMで自動アンロックする

Fedora IoTを入れたのでその時のメモ。

ただし2024-05-05現在だとFedora IoT 40ではinitramfsの再生成に失敗して動かないので39に落とすとかSilverblue 40とかでやる必要あり

インストールする

インストールする時に適当なパスワードでディスクを暗号化する(ディスクと言っているが実際はパーティション単位)

この時のパスワードは後で消しちゃうので短いやつでも問題なし

TPMに鍵を登録

systemd-cryptenrollで鍵の設定をする

  1. まずはリカバリーキーを登録する: systemd-cryptenroll /dev/disk --recovery-key
  2. パスワードを削除: systemd-cryptenroll /dev/disk --wipe-slot=password
    • スロット0をTPMにしたいのでパスワードを一旦消している、がこだわりがないならやる必要はない
  3. TPMを登録: systemd-cryptenroll /dev/disk --tpm2-device=auto --tpm2-pcrs=0,2,4,7
  4. 念の為仮パスワードを登録: systemd-cryptenroll /dev/disk --password
    • TPMでアンロックできなかった場合にリカバリーキーを入力させられるけど文字数多くてしんどいので入れておくとよい

/etc/crypttabを編集

/etc/crypttabを編集してTPMでアンロックしてくれるようにする

対象のディスクのオプションにtpm2-device=autoを追加する

luks-hoge UUID=hoge none tpm2-device=auto,discard

initramfsにTPM関連のモジュールを追加

tpm2-tssをinitramfsに追加しないとアンロックされないので追加する

rpm-ostree initramfs --enable --arg=--force-add --arg=tpm2-tss を実行するとinitramfsが再生成される

カーネルコマンドラインを編集

rpm-ostree kargs --editor を実行するとエディタが立ち上がってカーネルに渡すコマンドラインを編集できるので rd.luks.options=tpm2-device=auto を追加する

# Current kernel arguments are shown below, and can be directly edited.
# Empty or commented lines (starting with '#') will be ignored.
# Individual kernel arguments should be separated by spaces, and the order
# is relevant.
# Also, please note that any changes to the 'ostree=' argument will not be
# effective as they are usually regenerated when bootconfig changes.
rd.luks.uuid=luks-hoge rd.luks.options=tpm2-device=auto root=UUID=hoge rootflags=subvol=root rw

編集を終えると反映される

再起動してみる

以上の手順で自動アンロックされるようになっているはずなので再起動してみる、自動でアンロックされてログイン画面まで飛んでいれば🆗

仮パスワードを残している場合はsystemd-cryptenroll /dev/disk --wipe-slot=passwordで削除しておく