Manjaro Linuxでセキュアブート(secure boot)(efitools)
自己署名の鍵でセキュアブートする
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にもバックアップしておきます。)
#!/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/*
まとめ
- Grubを
--modules=tpm --disable-shim-lock
オプション付きで手動インストールする。(これは不要かもしれません。) - 自己署名用の鍵を作成する。
- efitoolsのKeytoolを起動できるように準備。
- grubとKeytoolを署名しておく。
- 再起動して、Keytoolで鍵を登録する。
- Securebootを有効にして、起動しなおす。
参考サイトが、非常に役に立ちました。
ありがとうございます。
Discussion