🔏

【Arch Linux】セキュアブートとシステム全体の暗号化

に公開

概要

macOSや最近のWindowsではディスクを盗難された場合でもデータを論理的に見られないような仕組みが採用されています。また、起動するカーネルの改ざんを検証することで悪意のあるコードの実行からシステムを保護することができます。これらと似た環境をArch Linuxで実現することが本記事の内容です。

対象読者

それぞれの環境に置き換えなければならない箇所や記事と関係がない箇所を詳細に説明をしません。

パーティションの作成

Arch Linuxのインストールメディアを起動し、次の条件でパーティションを作成します。内容はgdiskの使用を想定しています。マウントはまだしないでください。

番号 容量 タイプ FS マウントポイント
1 300MiB < ef00 fat32 /boot
2 すべて 8304 任意 /

最初にEFIシステムパーティションのみフォーマットを行います。

mkfs.fat -F32 /dev/sda1

ルートファイルシステムの暗号化

暗号化にはluksを使用します:

cryptsetup luksFormat /dev/sda2

パスワード入力のプロンプトが表示されるので適宜入力してください。
オープンすることで普通のブロックデバイスのように扱うことができます:

cryptsetup open /dev/sda2 root

暗号化したパーティションをフォーマットします。

mkfs.ext4 /dev/mapper/root

ファイルシステムのマウント

作成したパーティションをマウントしていきます。

mount /dev/mapper/root /mnt
mount --mkdir /dev/sda1 /mnt/boot

マウント後のインストールプロセスはほぼ変わりません[1]。必須パッケージをインストールしてarch-chroot /mntを実行してください。

統合カーネルイメージ

セキュアブートで署名済みイメージを検証するために統合カーネルイメージを作成します。
/etc/mkinitcpio.d/linux.presetのコメントを2箇所編集します。

-default_image="/boot/initramfs-linux.img"
-#default_uki="/efi/EFI/Linux/arch-linux.efi"
+#default_image="/boot/initramfs-linux.img"
+default_uki="/boot/EFI/Linux/arch-linux.efi"
-#fallback_uki="/efi/EFI/Linux/arch-linux-fallback.efi"
+fallback_uki="/boot/EFI/Linux/arch-linux-fallback.efi"

このとき、.*_ukiのパスが/efiから始まっていることに注意してください。本事例では/bootへマウントしているため書き換えています。

次に、/etc/mkinitcpio.confHOOKSも次のように変更します。

HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)

追加する項目はsd-encryptですが、行末に追加しようとするとluksのロック解除ができなくなります。順序関係を崩さないように編集してください。

また、/etc/vconsole.confが無い場合は次のコマンドを実行してください。

echo "KEYMAP=us" > /etc/vconsole.conf

次に、ブートローダを設定して必要なディレクトリを作成します。

bootctl install

統合カーネルイメージを作成します。

mkinitcpio -p linux

このあとの手順は一般的なものです。ユーザの作成やソフトウェアのインストールなどを行ってシャットダウンしてください。

再起動

ArchLinuxを起動する前にUEFIの設定からセキュアブートモードをSetup Modeに変更します。
また、起動時にluksで設定したパスワードの入力を求められるので入力してください。

セキュアブートを設定する

sbctlを使用します。次のコマンドで、Setup Modeenabledにっていることを確認してください。

sbctl status

鍵の生成とインストールを行います:

sbctl create-keys
sbctl enroll-keys -m

最後に、ブートローダとOSのイメージに署名をします。次のコマンドで署名すべきファイルを確認することができます。

sbctl verify

署名します:

sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI
sbctl sign -s /boot/EFI/Linux/arch-linux.efi
sbctl sign -s /boot/EFI/systemd/systemd-bootx64.efi
sbctl sign -s /boot/vmlinuz-linux

存在しないイメージファイルが表示される場合は、sbctlのデータベースから削除することができます。

sbctl remove-file /boot/initramfs-linux-fallback.img

完全に削除する場合は以下のコマンドを実行します。

rm -rf /var/lib/sbctl/*

セキュアブートの設定はこれで完了です。UEFIからセキュアブートを有効化して再起動してください。

TPMでロック解除

次のコマンドはリカバリーキーの設定を行います。撮影するなどして安全に保管してください。

systemd-cryptenroll /dev/sda2 --recovery-key

最後に、既存のキーを削除してTPMからロードされるように設定します。

systemd-cryptenroll /dev/sda2 --wipe-slot=empty --tpm2-device=auto

Keyslotsが2つ登録されていることを確認します:

cryptsetup luksDump /dev/sda2

参考

脚注
  1. fstabの作成のみ不要です。 ↩︎

Discussion