__aki_nikki__

分子分光学の研究をしている大学院生の日記です

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で鍵の作成&登録&署名は思っていたよりも簡単にできました。