【Arch Linux】セキュアブートとシステム全体の暗号化
概要
macOSや最近のWindowsではディスクを盗難された場合でもデータを論理的に見られないような仕組みが採用されています。また、起動するカーネルの改ざんを検証することで悪意のあるコードの実行からシステムを保護することができます。これらと似た環境をArch Linuxで実現することが本記事の内容です。
対象読者
- Arch Linuxをインストールしたことがある
それぞれの環境に置き換えなければならない箇所や記事と関係がない箇所を詳細に説明をしません。
パーティションの作成
Arch Linuxのインストールメディアを起動し、次の条件でパーティションを作成します。内容はgdisk
の使用を想定しています。マウントはまだしないでください。
番号 | 容量 | タイプ | FS | マウントポイント |
---|---|---|---|---|
1 |
<300MiB | ef00 |
fat32 | /boot |
2 |
すべて | 8304 |
ext4 | / |
最初に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="esp/EFI/Linux/arch-linux.efi"
+#default_image="/boot/initramfs-linux.img"
+default_uki="esp/EFI/Linux/arch-linux.efi"
-fallback_image="/boot/initramfs-linux-fallback.img"
-#fallback_uki="esp/EFI/Linux/arch-linux-fallback.efi"
+#fallback_image="/boot/initramfs-linux-fallback.img"
+fallback_uki="esp/EFI/Linux/arch-linux-fallback.efi"
また、/etc/mkinitcpio.conf
のHOOKS
も次のように変更します。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)
追加する項目はsystemd
, keyboard
, sd-vconsole
, sd-encrypt
ですが、行末に追加しようとするとluksのロック解除ができなくなります。順序関係を崩さないように編集してください。
次に、ブートローダを設定して必要なディレクトリを作成します。
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
セキュアブートの設定はこれで完了です。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