Fedora IoTでディスク暗号化しつつTPMで自動アンロックする
created at
updated at
Fedora IoT を入れたのでその時のメモ。
ただし2024-05-05現在だとFedora IoT 40ではinitramfsの再生成に失敗して動かないので39に落とすとかSilverblue 40とかでやる必要あり
インストールする
インストールする時に適当なパスワードでディスクを暗号化する(ディスクと言っているが実際はパーティション単位)
この時のパスワードは後で消しちゃうので短いやつでも問題なし
TPMに鍵を登録
systemd-cryptenroll で鍵の設定をする
- まずはリカバリーキーを登録する:
systemd-cryptenroll /dev/disk --recovery-key
- まずはリカバリーキーを登録する:
- パスワードを削除:
systemd-cryptenroll /dev/disk --wipe-slot=password
- パスワードを削除:
- スロット0をTPMにしたいのでパスワードを一旦消している、がこだわりがないならやる必要はない
- TPMを登録:
systemd-cryptenroll /dev/disk --tpm2-device=auto --tpm2-pcrs=0,2,4,7
- TPMを登録:
- Fedora IoTだとアップグレードの度にカーネルのコマンドラインが変わって面倒なのでPCR8は入れていない
- どのPCRを見るかは https://uapi-group.org/specifications/specs/linux_tpm_pcr_registry/ を眺めながら決めるのがオススメ
- もし登録に失敗する場合は https://github.com/tpm2-software/tpm2-tools/issues/1956#issuecomment-601914151 のとおりにしてTPMを初期化する必要あり
- 念の為仮パスワードを登録:
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
で削除しておく