# 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/grubx64.efi
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を手動でインストールします。
```sh:grub-efi-install.sh
#!/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
"
# Platform-specific modules
case $platform in
x86_64|i386)
CD_MODULES="$CD_MODULES
cpuid
play
tpm
"
;;
esac
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}" --sbat /usr/share/grub/sbat.csv
```
```
chmod u+x grub-efi-install.sh
sudo cp grub-efi-install.sh /usr/local/bin/
```
# 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 sbsign --key MOK.key --cert MOK.crt --output ${esp}/EFI/Manjaro/grubx64.efi ${esp}/EFI/Manjaro/grubx64.efi
sudo sbsign --key MOK.key --cert MOK.crt --output /boot/vmlinuz-6.0-x86_64 /boot/vmlinuz-6.0-x86_64
sudo cp -a $esp/EFI/Manjaro/grubx64.efi $esp/EFI/boot/grubx64.efi
sudo mokutil --import MOK.cer
```
# 4. カーネルの自動署名
インストール済みのカーネルについては、手動で署名しておく。
```
/usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' |xargs -I{} /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates" - ;then /usr/bin/sbsign --key MOK.key --cert MOK.crt --output {} {} ;fi'
```
Pacmanフックでカーネルインストールや更新時に自動で署名する。
```txt:/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
Target = linux-lts
Target = linux-hardened
Target = linux-zen
[Action]
Description = Signing kernel with Machine Owner Key for Secure Boot
When = PostTransaction
Exec = /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' |xargs -I{} /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates" - ;then /usr/bin/sbsign --key /etc/secureboot/MOK.key --cert /etc/secureboot/MOK.crt --output {} {} ;fi'
Depends = sbsigntools
Depends = findutils
Depends = grep
```
# 5. Grubの自動署名
Pacmanフックでgrubインストール、更新時に自動で署名する。
```txt:/etc/pacman.d/hooks/999-sign_grub_for_secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = grub
[Action]
Description = Signing grub with Machine Owner Key for Secure Boot
When = PostTransaction
Exec = /usr/local/bin/grub-efi-install.sh && /usr/bin/sbsign --key /etc/secureboot/MOK.key --cert /etc/secureboot/MOK.crt --output /boot/efi/EFI/Manjaro/grubx64.efi /boot/efi/EFI/Manjaro/grubx64.efi && cp -a /boot/efi/EFI/Manjaro/grubx64.efi /boot/efi/EFI/boot/grubx64.efi
Depends = sbsigntools
```
### 参考サイト
[セキュアブート - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%96%E3%83%BC%E3%83%88)