【Arch Linux】セキュアブートとシステム全体の暗号化
概要
macOSや最近のWindowsではディスクを盗難された場合でもデータを論理的に見られないような仕組みが採用されています。また、起動するカーネルの改ざんを検証することで悪意のあるコードの実行からシステムを保護することができます。これらと似た環境をArch Linuxで実現することが本記事の内容です。
対象読者
- 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.confのHOOKSも次のように変更します。
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 Modeがenabledにっていることを確認してください。
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
参考
-
fstabの作成のみ不要です。 ↩︎
Discussion