切腹倶楽部
日々是切腹
既存のGentooのrootfsをLUKSで暗号化する
{
date:
"",
category: "/unix-like"
}
既存のGentooシステムのディスクを暗号化したくなったのでゆるくやっていく。
この辺の話はディストロによって差が大きいので,脳死でArchWikiに従ってれば大丈夫という訳にはいかないのがアレなところ。
Gentoo Wiki・RHELのドキュメントも大いに参考になった。
今回やるパーティション構成は
nvme0n1
├─nvme0n1p1 2G part /boot # ESP
└─nvme0n1p2 11451.4G part / # btrfs
が
nvme0n1
├─nvme0n1p1 2G part /boot # ESP
└─nvme0n1p2 11451.4G part # LUKSコンテナ
└─linux 11451.4G crypt / # btrfs
になるみたいな感じのやつで,LVMは使わない。
XBOOTLDRパーティションを作ってカーネル等をそこに置く手もあるが,いろいろ考えるのが面倒だったので,クソデカESPを/bootにマウントして全てをそこに突っ込んでいる。
また,TPMを使って自動で暗号化解除したく,そこではClevisを使う。
下準備
USE='dracut grub' emerge -n sys-kernel/installkernel
emerge app-crypt/clevis::guru
cd /usr/src/linux
make install # clevisを含むinitramfsを生成・インストール
LUKSのheaderを格納するにあたり,パーティション上のファイルシステムを切り詰める必要がある。 ちなみにxfsはこれができないらしい。
btrfs files resize -32M /
32Mってのはcryptsetup-reencrypt(8)の受け売り。
やる
LiveCD等から起動して作業する。
まず,ディスク上のデータに暇乞いをする。 したら,暗号化をする。 幸運なことにエラー無しで暗号化が済んだら,マウントして生存確認をする。
cryptsetup reencrypt --new --reduce-device-size 32M /dev/nvme0n1p2
cryptsetup open --allow-discards --persistent /dev/nvme0n1p2 linux # ついでにallow-discardsフラグを立てておく
mount /dev/mapper/linux /mnt/rootfs
btrfs files resize max /mnt/rootfs # 念の為
ダメそうだったら復号してやり直す。
cryptsetup close linux
cryptsetup reencrypt --decrypt --header hoge_hdr /dev/nvme0n1p2
# ↑このheaderってのは中断した復号を再開するときに必要になるらしい
できたらClevisでTPMの鍵をLUKSに登録する。
clevis
はchrootして実行してもよい。
# arch-chroot /mnt/rootfs # お好みで
clevis luks bind -d /dev/nvme0n1p2 tpm2 '{}'
以上。
総括
カーネル引数すら弄ってないのに,なんかこれだけで動いた。dracut万歳!
ただ,systemdじゃないのが悪いのかdracutが悪いのか知らんが,rd.luks.name
・rd.luks.allow-discards
のカーネル引数がなんか無視される。
が,動いてるのでまあヨシとする。
Gentooの前にArch+mkinitcpioでやった時はもうちょいややこしかった。