Manjaro Linuxで自動復号化のディスク暗号化と休止状態の実現方法
はじめに
今回は、モバイルノートパソコンのセキュリティを確保するためにディスクの暗号化を行う方法を備忘録として残します。
Manjaro Linuxを使用しましたが、Arch Linux系列のOSでも使用できると思います。
環境
- Manjaro Linux
- TPM2搭載PC (Windows 11 対応PC)
※解説のためにQEMU/KVMを使用します。
目標
Manjaro Linuxを次の構成でインストールすることを目指します。
- LVM on Luks (論理ディスクを暗号化する)
- TPM2を使用して自動復号化
- 休止状態を使用できる状態
- セキュアブート
- セキュリティの確保
パーティションの構成
物理ディスク
Partition | Type | Mount Point |
---|---|---|
/dev/vda1 | fat32 | /boot/efi |
/dev/vda2 | ext4 | /boot |
/dev/vda3 | lvm2 pv (Encrypted) | system |
論理ボリューム(/dev/sda3上のlvm2 pv)
Partition | Type | Mount Point |
---|---|---|
/dev/system/root | btrfs | / |
/dev/system/swap | linuxswap | none |
インストール方法
物理パーティションの準備
-
セキュアブートの無効化
-
Manjaro LinuxインストールディスクからBootします。
-
KDE Partition Managerなどを使用して、次のようなパーティションを作成します。
-
暗号化ディスクを準備する
cryptsetup luksFormat /dev/vda3
-
暗号化ディスクを開く
cryptsetup open /dev/vda3 cryptolvm
復号化されたコンテナが、
/dev/mapper/cryptolvm
から利用できます。
論理ボリュームの準備
-
開いたコンテナの上にボリュームを作成
pvcreate /dev/mapper/cryptolvm
-
ボリュームグループsystemを作成
vgcreate system /dev/mapper/cryptolvm
-
論理ボリュームを作成
#PCのメモリより大きいサイズを指定してください。 lvcreate -L 9G system -n swap lvcreate -l 100%FREE system -n root mkfsbtrfs /dev/mapper/system-root
OSのインストール
- Manjaro Linuxインストーラーを起動します。
-
ストレージデバイスを選択
までセットアップを続けます。 -
手動パーティション
を選択します。 - 次の画像のようにマウントポイントを指定します。
物理ディスク
/dev/vda1 : /boot/efi
/dev/vda2 : /boot
論理ディスク
/dev/mapper/system-root: /
インストール後の設定
-
ファイルシステムをマウントします。
mount -o subvol=@ /dev/mapper/system-root /mnt mount -o subvol=@home /dev/mapper/system-root /mnt/home mount -o subvol=@cache /dev/mapper/system-root /mnt/var/cache mount -o subvol=@log /dev/mapper/system-root /mnt/var/log mount /dev/vda2 /mnt/boot mount /dev/vda1 /mnt/boot/efi
-
chrootに入る
#arch linuxの場合は、`arch-chroot`を使用 manjaro-chroot /mnt
-
initramfsの設定
keyboard,encrypt,lvm2 フックをfilesystemの前に追加します。
#/etc/mkinitcpio.conf HOOKS=(... keyboard keymap block encrypt lvm2 ... filesystems ...)
-
initramfsの生成
mkinitcpio -p linux65
-
ブートローダーの設定
/etc/default/grub
のGRUB_CMDLINE_LINUX_DEFAULT
に次の内容を追記してください。UUIDは/dev/sdXXのUUIDに置き換えてください。#UUIDの確認方法 ls -al /dev/disk/by-uuid
cryptdevice=UUID=device-UUID:cryptolvm root=/dev/mapper/system-root
-
設定の適応
update-grub
-
chrootを抜け、インストールディスクを抜き、再起動します。起動時にパスワードを入力してください。
休止状態の設定
-
swap paritionの作成
mkswap /dev/mapper/system-swap
-
fstabの設定
次の内容を
/etc/fstab
に追記します。/dev/mapper/system-swap none swap defaults 0 0
-
initramfsの設定
/etc/mkinitcpio.conf
を開き、HOOKS
のfilesystems
の前にresume
を追加します。 -
ブートローダーの設定
/etc/default/grub
のGRUB_CMDLINE_LINUX_DEFAULT
のroot=
の前に次の内容を追記してください。resume=/dev/mapper/system-swap
-
設定を適応します
mkinitcpio -p linux65 update-grub
-
一度再起動します
-
テスト
ここで休止状態が機能するかテストしてください。
セキュアブートの設定
-
必要なパッケージをインストール
pacman -S efitools sbctl
-
現在の設定のバックアップ
for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
-
ファームウェアをSetup Modeにする
機種によって方法が違います。
確認方法
bootctl status
ここで、
Secure Boot: disabled (setup)
となっていれば成功です。 -
キーの作成、登録
sbctl create-keys sbctl enroll-keys -m
-
再びセキュアブートの状態を確認
sbctl status
Installed: sbctl is installed
と表示されていたら成功です。 -
セキュアブートを作動させるためのファイルを確認
sbctl verify
-
セキュアブートに対応したブートローダーのインストール
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
-
必要なファイルを署名
例:
sbctl sign -s /boot/efi/EFI/GRUB/grubx64.efi sbctl sign -s /boot/efi/EFI/boot/bootx64.efi sbctl sign -s /boot/linux65-x86_64
-
正しく署名されているか確認
sbctl verify
-
UEFIからセキュアブートを有効化する
-
再起動をして動作確認
TPM2によるディスク復号化
-
必要パッケージのインストール
pacman -S yay clevis #Run as user yay -S mkinitcpio-clevis-hook
-
鍵を登録する
clevis luks bind -d /dev/vda3 tpm2 '{"hash":"sha256","key":"rsa"}'
-
鍵を検証する
clevis luks list -d /dev/vda3
-
initramfsの設定
/etc/mkinitcpio.conf
を開き、HOOKS
のencrypt
の前にclevis
を追加する -
initramfsの再生成
mkinitcpio -p linux65
-
再起動をして動作確認
これにてインストール完了です。
参考文献
dm-crypt/システム全体の暗号化
【Linux】ボリュームのUUIDを確認する方法
電源管理/サスペンドとハイバネート
Unified Extensible Firmware Interface/セキュアブート
Clevis
Ubuntu 22.04でTPM2.0を使ってluksを自動復号化をする
Discussion