Arch Linuxでsecure bootを設定した
Arch Linuxでsecure boot
Arch Linuxをセキュアブートに対応させました。 主な理由は別ディスクにinstallしたWindows11のディスク暗号化をまともに運用するのに必要だったからです。
手順は基本的にArch Wikiのガイドの通りでちゃんとできました!。
sbctlで鍵を生成して自分で署名をする
作業をする行う前にUEFI BIOSに入りsecure bootをsetup modeに設定します。
起動してから、必要なツールをinstallします。
$ sudo pacman -S efitools sbctl
まず、すでに存在するefi鍵の確認を行います。
$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
続いて、sbctl create-keysで鍵を生成して,enroll-keysで鍵を追加します。
ここで、-mオプションはマイクロソフトの鍵を消さずに自分で生成した鍵を追加するようすることを意味します。
これを忘れると、マイクロソフトの鍵で署名された一部のデバイスドライバが読めなくなって最悪の場合ではマシンが文鎮化する恐れがあります。
$ sudo sbctl create-keys $ sudo sbctl enroll-keys -m # -mオプションを忘れないようにすること
今回鍵を登録しようとしたところ以下のようなエーラーが出ました。
‼ File is immutable: /sys/firmware/efi/efivars/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8c ‼ File is immutable: /sys/firmware/efi/efivars/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f You need to chattr -i files in efivarfs
どうやら書き込みしたいファイルがイミューダブルなのでミューダブルになるようにしろとのことなので以下のようにしてミューダブルにしました。
$ sudo chattr -i /sys/firmware/efi/efivars/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8c $ sudo chattr -i /sys/firmware/efi/efivars/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f
この後で再び鍵の登録を行うとちゃんと成功しました。
$ sudo sbctl enroll-keys -m Enrolling keys to EFI variables... With vendor keys from microsoft...✓ Enrolled keys to the EFI variables!
続いてsbctl verifyで署名が必要なファイルを調べます。
チェック
$ sudo sbctl verify Verifying file database and EFI images in /boot... ✗ /boot/EFI/BOOT/BOOTX64.EFI is not signed ✗ /boot/EFI/systemd/systemd-bootx64.efi is not signed failed to verify file /boot/initramfs-linux-fallback.img: /boot/initramfs-linux-fallback.img: invalid pe header failed to verify file /boot/initramfs-linux.img: /boot/initramfs-linux.img: invalid pe header failed to verify file /boot/intel-ucode.img: /boot/intel-ucode.img: invalid pe header failed to verify file /boot/loader/entries/arch.conf: /boot/loader/entries/arch.conf: invalid pe header failed to verify file /boot/loader/entries.srel: /boot/loader/entries.srel: invalid pe header failed to verify file /boot/loader/loader.conf: /boot/loader/loader.conf: invalid pe header failed to verify file /boot/loader/random-seed: /boot/loader/random-seed: invalid pe header ✗ /boot/vmlinuz-linux is not signed
結果としては以下の3個のファイルに対しての署名が必要だったので
- /boot/EFI/BOOT/BOOTX64.EFI is not signed
- /boot/EFI/systemd/systemd-bootx64.efi is not signed
- /boot/vmlinuz-linux is not signed
$ sudo sbctl sign -s /boot/vmlinuz-linux $ sudo sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI $ sudo sbctl sign -s /boot/EFI/systemd/systemd-bootx64.efi
によって行いました。
今回をこの作業を行なったマシンはsystemd-bootでかつその更新をsystemd-boot-update.serviceで行なっているので以下のコマンドで/usr/lib内のブートローダーを直接署名しました。
# for systemd-boot $ sudo sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi
この後でUEFI BIOSに入りsecure boot enableにしてから無事起動できたらOKです。
感想
途中の鍵の登録では-mオプションを忘れると最悪マシンを文鎮化する可能性があるということでビビリながら作業していました。
しかしsbctlで鍵の作成&登録&署名は思っていたよりも簡単にできました。