CachyOS/既存パーティションを LUKS2 で暗号化
#CachyOS
環境
linux-cachyos 7.0.0-1
cryptsetup 2.8.6-1.1
ブートローダー: limine 11.4.1-1
パーティション
暗号化したい rootfs /dev/nvme0n1p6
ブートローダー /dev/nvme0n1p4
準備
バックアップは必ず取りましょう!
システムに最適なアルゴリズムを確認
code:console
$ cryptsetup benchmark
# テストはストレージI/Oがなくメモリ上のもののため目安です。
PBKDF2-sha1 3472105 回/秒 (256 ビットの鍵)
PBKDF2-sha256 6786899 回/秒 (256 ビットの鍵)
PBKDF2-sha512 2702515 回/秒 (256 ビットの鍵)
PBKDF2-ripemd160 1310720 回/秒 (256 ビットの鍵)
PBKDF2-whirlpool 1190211 回/秒 (256 ビットの鍵)
argon2i 15 回, 1048576 KB使用, 4 スレッド (256 のビットの鍵) (2000 ms 計測)
argon2id 15 回, 1048576 KB使用, 4 スレッド (256 のビットの鍵) (2000 ms 計測)
# Algorithm | キー | 暗号化 | 復号化
aes-cbc 128b 1849.4 MiB/s 7215.2 MiB/s
serpent-cbc 128b 137.4 MiB/s 919.3 MiB/s
twofish-cbc 128b 275.8 MiB/s 601.4 MiB/s
aes-cbc 256b 1406.3 MiB/s 6038.3 MiB/s
serpent-cbc 256b 136.3 MiB/s 926.1 MiB/s
twofish-cbc 256b 273.9 MiB/s 604.3 MiB/s
aes-xts 256b 9072.3 MiB/s 9007.9 MiB/s
serpent-xts 256b 810.7 MiB/s 839.1 MiB/s
twofish-xts 256b 566.6 MiB/s 570.5 MiB/s
aes-xts 512b 8517.8 MiB/s 8372.3 MiB/s
serpent-xts 512b 808.7 MiB/s 843.1 MiB/s
twofish-xts 512b 563.3 MiB/s 573.4 MiB/s
AES のアクセラレーションが効いているので AES-XTS を使うことにした
パーティションのバイトセクターサイズを確認
code:console
$ lsblk -o NAME,LOG-SEC,PHY-SEC /dev/nvme0n1p6
NAME LOG-SEC PHY-SEC
nvme0n1p6 512 512
└─crypt_root 512 512
手順ログ
以下の手順はライブブート環境で実行していると想定
online でも暗号化できるようなのだが、念の為ライブブートしてパーティションが in use でないようにする
ref. https://wiki.archlinux.org/title/Dm-crypt/Device_encryption#Encrypt_an_existing_unencrypted_file_system
1. fsck
何はともあれファイルシステムの問題があれば先に解決したい
code:console
# e2fsck -f /dev/nvme0n1p6
2. ファイルシステムのリサイズ
cryptencrypt で既存パーティションを暗号化する場合、ヘッダの格納領域として 32MiB 必要となる
-M オプションを使用すると、実際に利用されているサイズまでパーティションを縮小してくれる
code:console
# resize2fs -p -M /dev/nvme0n1p6
3. 暗号化開始
code:console
# cryptsetup reencrypt \
--encrypt \
--type luks2 \
--cipher aes-xts-plain64 \
--key-size 512 \
--pbkdf argon2id \
--reduce-device-size 32M \
/dev/nvme0n1p6
WARNING!
========
This will overwrite data on LUKS2-temp-7d109a3d-88fa-41ba-a199-318f3e40c41a.new irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for LUKS2-temp-7d109a3d-88fa-41ba-a199-318f3e40c41a.new:
Verify passphrase:
Finished, time 39m25s, 902 GiB written, speed 390.7 MiB/s
暗号化できたので、暗号化パーティションをブート可能にしていく
4. 暗号化パーティションをオープン
パスフレーズを求められるので入力
code:console
# cryptsetup open /dev/nvme0n1p6 crypt_root
5. 縮小したパーティションを元通りに拡張する
code:console
# resize2fs /dev/mapper/crypt_root
6. マッピングされたパーティション (/dev/mapper/crypt_root) をマウントし、chroot
code:console
# mount /dev/mapper/crypt_root /mnt
# mount /dev/nvme0n1p4 /mnt/boot
# arch-chroot /mnt
7. パーティションの UUID をそれぞれ調査
「暗号化パーティションの UUID」、「マッピングされたパーティションの UUID」をそれぞれ確認
code:console
# blkid /dev/nvme0n1p6
/dev/nvme0n1p6: UUID="7d109a3d-88fa-41ba-a199-318f3e40c41a" TYPE="crypto_LUKS" PARTUUID="e5eeea19-ff18-49e4-869e-17c00cad3ee8"
# blkid /dev/mapper/crypt_root
/dev/mapper/crypt_root: UUID="e050dd40-1fff-4845-a95a-e844b70868ea" BLOCK_SIZE="4096" TYPE="ext4"
8. 次の4ファイルをそれぞれ編集
/etc/crypttab
暗号化パーティションをマッピングする情報が記されている
「暗号化パーティションの UUID」でマッピングする
code:/etc/crypttab
# /etc/crypttab: mappings for encrypted partitions.
#
# Each mapped device will be created in /dev/mapper, so your /etc/fstab
# should use the /dev/mapper/<name> paths for encrypted devices.
#
# See crypttab(5) for the supported syntax.
#
# NOTE: You need not list your root (/) partition here, but it must be set up
# beforehand by the initramfs (/etc/mkinitcpio.conf). The same applies
# to encrypted swap, which should be set up with mkinitcpio-openswap
# for resume support.
#
# <name> <device> <password> <options>
crypt_root UUID=7d109a3d-88fa-41ba-a199-318f3e40c41a none luks,discard
/etc/fstab
変更する必要はないはずだが、rootfs の UUID が「マッピングされたパーティションの UUID」と一致していることを確認する
code:/etc/fstab took 3s
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=770D-E5CE /boot vfat defaults,umask=0077 0 2
UUID=e050dd40-1fff-4845-a95a-e844b70868ea / ext4 defaults,noatime 0 1
/etc/mkinitcpio.conf
mkinitcpio のフックに sd-encrypt が必要
こういう感じで plymouth, filesystems の間に追加
code:/etc/mkinitcpio.conf
HOOKS=(base systemd autodetect microcode kms modconf block keyboard sd-vconsole plymouth sd-encrypt filesystems fsck)
/etc/default/limine
Limine ブートローダーを使っている場合はこれ
それ以外のブートローダーのことは分かりません
Arch Wiki をみて! https://wiki.archlinux.org/title/Dm-crypt/Device_encryption#Encrypt_an_existing_unencrypted_file_system
rd.luks.name={暗号化パーティションの UUID}=crypt_root オプションが最低限必要
rd.luks.options=discard
NVMe SSD なので discard オプションを有効にしている
code:/etc/default/limine
ESP_PATH="/boot"
KERNEL_CMDLINEdefault+="nowatchdog splash rw rd.luks.name=7d109a3d-88fa-41ba-a199-318f3e40c41a=crypt_root rd.luks.options=discard root=UUID=e050dd40-1fff-4845-a95a-e844b70868ea"
BOOT_ORDER="*, *lts, *fallback, Snapshots"
ENABLE_ENROLL_LIMINE_CONFIG=yes
ブートローダー設定の変更後は以下のコマンドで反映
これを忘れるとブートできないし、PANIC: !!! SECURE BOOT IS ACTIVE BUT NO CONFIG CHECKSUM IS ENROLLED !!! とか言われる羽目になるぞ
code:console
# limine-enroll-config
# limine-mkinitcpio
9. 再起動 (お祈り)
TPM 2.0
TPM デバイスがあるマシンなら、TPM に格納したキーでパスフレーズ入力をスキップできる
code:console
# systemd-cryptenroll --tpm2-device=list
# systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme0n1p6
--tpm2-pcrs=0+7 は「マザーボードの基本設定(0)」と「セキュアブートの状態(7)」が書き換えられていないかチェックしてから鍵を渡すって意味っぽい
Limine にこういうオプションを指定する rd.luks.options=discard,tpm2-device=auto