💭

Manjaro Linuxでセキュアブート(secure boot)(efitools)

2022/11/26に公開

自己署名の鍵でセキュアブートする

shim-signedパッケージを利用しない場合です。
自分でPlatform Keyなどを作成して、その鍵(PK,KEK,db)をefitoolsのKeytoolで登録します。
その鍵で署名したGrubで起動する形です。
この場合、私の環境では、カーネルの署名を行わなくても、起動できました。

必要なパッケージ

cert-to-efi-sig-listコマンドなどを使うので、efitoolsパッケージなどをインストールします。

sudo pacman -S efitools sbsigntools

grubの手動インストール

オプションに次の2つを加えて、手動インストールします。(不要かもしれません。)
--modules=tpm --disable-shim-lock

sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Manjaro --modules=tpm --disable-shim-lock --recheck

セキュアブートに必要な鍵を用意します。

自己署名用の鍵を生成します。
次のスクリプトはカレントディレクトリ下にsecurebootディレクトリを作り、そこに格納するようにしています。(そこに出来たファイルを、一時的に/boot/efi以下にコピーします。/etc/securebootにもバックアップしておきます。)

MOK-key-generate.sh
#!/bin/bash
mkdir -p secureboot
cd secureboot

uuidgen --random > GUID.txt

openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Platform Key/" -out PK.crt
openssl x509 -outform DER -in PK.crt -out PK.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth

sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null rm_PK.auth

openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Key Exchange Key/" -out KEK.crt
openssl x509 -outform DER -in KEK.crt -out KEK.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth

openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=my Signature Database key/" -out db.crt
openssl x509 -outform DER -in db.crt -out db.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth

# 鍵を一時的に EFI パーティションに置く
cd ..
sudo mkdir -p /boot/efi/secureboot
sudo cp secureboot/* /boot/efi/secureboot/
# /etc/securebootに一応バックアップを残す
sudo mkdir -p /etc/secureboot
sudo cp secureboot/* /etc/secureboot

grubとKeytoolを署名する

efibootmgr -vでそれぞれのパスを確認できます。

sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/Manjaro/grubx64.efi /boot/efi/EFI/Manjaro/grubx64.efi
sudo sbsign --key db.key --cert db.crt --output /boot/efi/KeyTool-signed.efi /usr/share/efitools/efi/KeyTool.efi

(デュアルブートなら) Windows の署名

らしいです。

sbsign --key db.key --cert db.crt --output /boot/efi/EFI/Microsoft/Boot/bootmgr.efi /boot/efi/EFI/Microsoft/Boot/bootmgr.efi

未確認。

ブートマネージャーに登録する

grubはgrub-installコマンドでブートローダーとして登録されています。
KeyTool-signed.efiを手動で登録します。
sdaの部分は適宜、自分の環境にあわせてください。

efibootmgr -c -d /dev/sda -p 1 -L key_app -l '\KeyTool-signed.efi'

efibootmgr -vで、keytoolとgrubが両方、有効になっているか確認します。

efibootmgr -v

Keytoolで起動する

確認できたら、再起動して、BIOSメニューの起動順序の設定でKeytoolが起動するように設定してください。
Keytoolが起動したら、/boot/efi/securebootにコピーしておいたファイルを登録します。(PK,KEK,DB)
登録できたら、BIOSメニューを再び立ち上げて、起動順序でGrubを起動するように設定します。
セキュアブートも有効にしましょう。

※ 詳細は、参考サイトもご覧ください。

無事GrubからManjaro Linuxが起動したら、Keytool を他人に開かせないため、削除しておきます。

efibootmgr -B --bootnum (key_app の番号) 

/boot/efi/securebootにコピーした鍵も削除しておきます。

su
shred -n 3 /boot/efi/secureboot/*
rm /boot/efi/secureboot/*

まとめ

  1. Grubを--modules=tpm --disable-shim-lockオプション付きで手動インストールする。(これは不要かもしれません。)
  2. 自己署名用の鍵を作成する。
  3. efitoolsのKeytoolを起動できるように準備。
  4. grubとKeytoolを署名しておく。
  5. 再起動して、Keytoolで鍵を登録する。
  6. Securebootを有効にして、起動しなおす。

参考サイトが、非常に役に立ちました。
ありがとうございます。

参考サイト

セキュリティパラノイアに送る ArchLinux - Qiita
セキュアブート - ArchWiki

Discussion