🙌
Manjaro Linuxでセキュアブート(secure boot)(shim-singed)
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を手動インストールなどで、更新した場合には、署名を忘れないようにしてください。
Discussion