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

created at
updated at

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

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

インストールする
インストールする時に適当なパスワードでディスクを暗号化する(ディスクと言っているが実際はパーティション単位)
この時のパスワードは後で消しちゃうので短いやつでも問題なし

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

/etc/crypttabを編集
/etc/crypttabを編集してTPMでアンロックしてくれるようにする
対象のディスクのオプションにtpm2-device=autoを追加する
/etc/crypttab
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 を追加する
kargs
# 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で削除しておく