🙌

Manjaro Linuxでセキュアブート(secure boot)(shim-singed)

2022/11/25に公開

1. shim-signedパッケージの導入

paruまたはyayコマンドでaurから、shim-signedパッケージをインストールします。

esp=/boot/efi

paru -S shim-signed
sudo mv ${esp}/EFI/boot/bootx64.efi ${esp}/EFI/boot/bootx64.efi.bak
sudo cp /usr/share/shim-signed/shimx64.efi ${esp}/EFI/boot/bootx64.efi
sudo cp /usr/share/shim-signed/mmx64.efi ${esp}/EFI/boot/

ブートローダーshimを登録します。
espの場所にあわせてください。私の環境では、--disk /dev/sda --part 1でした。
後で、BIOSの設定でブートローダーとしてShimを設定しましょう。

sudo efibootmgr --unicode --disk /dev/sdX --part Y --create --label "Shim" --loader /EFI/boot/bootx64.efi

2. grubを必要なモジュールを含めてインストール

セキュアブート用のgrubを手動でインストールします。

#!/bin/bash
#
#
esp=/boot/efi
platform=$(uname -m)

CD_MODULES="
	all_video
	boot
	btrfs
	cat
	chain
	configfile
	echo
	efifwsetup
	efinet
	ext2
	fat
	font
	gettext
	gfxmenu
	gfxterm
	gfxterm_background
	gzio
	halt
	help
	hfsplus
	iso9660
	jpeg
	keystatus
	loadenv
	loopback
	linux
	ls
	lsefi
	lsefimmap
	lsefisystab
	lssal
	memdisk
	minicmd
	normal
	ntfs
	part_apple
	part_msdos
	part_gpt
	password_pbkdf2
	png
	probe
	reboot
	regexp
	search
	search_fs_uuid
	search_fs_file
	search_label
	sleep
	smbios
	squash4
	test
	true
	video
	xfs
	zfs
	zfscrypt
	zfsinfo
	"

	CD_MODULES="$CD_MODULES
	cpuid
	play
	tpm
	"

GRUB_MODULES="$CD_MODULES
	cryptodisk
	gcry_arcfour
	gcry_blowfish
	gcry_camellia
	gcry_cast5
	gcry_crc
	gcry_des
	gcry_dsa
	gcry_idea
	gcry_md4
	gcry_md5
	gcry_rfc2268
	gcry_rijndael
	gcry_rmd160
	gcry_rsa
	gcry_seed
	gcry_serpent
	gcry_sha1
	gcry_sha256
	gcry_sha512
	gcry_tiger
	gcry_twofish
	gcry_whirlpool
	luks
	lvm
	mdraid09
	mdraid1x
	raid5rec
	raid6rec
	"

sudo grub-install --target=x86_64-efi --efi-directory=$esp --modules="${GRUB_MODULES}" --disable-shim-lock --sbat /usr/share/grub/sbat.csv
#sudo grub-install --target=x86_64-efi --efi-directory=$esp --modules="${GRUB_MODULES}" --sbat /usr/share/grub/sbat.csv

3. MOK(Machine Owner Key)を用意する。

sbsigntoolsとmokutilをインストールしておきます。

sudo pacman -S sbsigntools mokutil
# MOKの作成
openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Machine Owner Key/" -out MOK.crt
openssl x509 -outform DER -in MOK.crt -out MOK.cer
sudo mkdir -p /etc/secureboot/
sudo cp MOK.* /etc/secureboot/
sudo mokutil --import MOK.cer

4. Grubに署名する

sudo sbsign --key MOK.key --cert MOK.crt --output ${esp}/EFI/Manjaro/grubx64.efi ${esp}/EFI/Manjaro/grubx64.efi
sudo cp -a $esp/EFI/Manjaro/grubx64.efi $esp/EFI/boot/grubx64.efi

5. カーネルに署名する

インストール済みのカーネルに署名しておきます。

/usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*'| xargs -I{} /bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates" - ;then sudo /usr/bin/sbsign --key /etc/secureboot/MOK.key --cert /etc/secureboot/MOK.crt --output {} {}; fi'

5. カーネルの自動署名

カーネルの更新に合わせて、自動署名するpacmanフックを作成します。

/etc/pacman.d/hooks/99-secureboot-kernel.hook
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Target = boot/linux*.kver

[Action]
Description = Signing Kenel for Secureboot
When = PostTransaction
Exec = /bin/sh -c 'while read -r f; do f=$(cat "$f"); f="/boot/vmlinuz-${f%.*}-x86_64" ; if ! /usr/bin/sbverify --list "$f" 2>/dev/null | /usr/bin/grep -q "signature certificates" - ;then /usr/bin/sbsign --key /etc/secureboot/MOK.key --cert /etc/secureboot/MOK.crt --output "$f" "$f" ;fi done'
NeedsTargets

終わりに

grubを手動インストールなどで、更新した場合には、署名を忘れないようにしてください。

参考サイト

セキュアブート - ArchWiki

Discussion