u-ryo's blog

various information for coding...

Category: Secure Boot

Secure Boot 3 (using Signed Grub in the Official Package)

| Comments

ubuntu公式パッケージのsigned grubを使う方法

USBメモリに直接ubuntuをインストールするために、 8GBのUSBメモリを用意しました。 それさえあれば、至極簡単です。

  1. VirtualBox等で、USBメモリにubuntuを入れる(そのままだと2GBスワップになるので、適宜調整。インストール後は4GB程の使用量なので、最初から5GB程でもよいかも。VMをEFIにしておくのを忘れないように。あと先頭にvfat32のEFI用パーティションを)
  2. リブートした後、/etc/efi/ubuntu//etc/efi/BOOTにリネーム
  3. linux-signed-image-genericgrub2-efi-amd86-signedも入っているので、
    1
    
    $ sudo cp -rpi /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed /etc/efi/BOOT/BOOTx64.EFI
    
  4. これでSecure BootなPCに挿してリブート

Secure Boot 2 (using Self-signed Cert)

| Comments

訂正

/EFI/ubuntu/... ではブート時に読み込まない、 と前回下記ましたが、efibootmgrで変更出来そうです。 が、今回はUSBメモリからのブートが要件なので、 efibootmgrは使えません。

手法2

「loopbackモジュールを含めたgrubを自力で署名する」 手法が漸くわかりました

  1. efitoolsをapt-get installしておきます
  2. 自己署名証明書(pem形式とder形式)を作成します
  3. 必要なモジュールを含めたgrubを作ります (ここまでモジュール入れないとうまく行きませんでした。 iso9660cpioくらいでいいような気はしますが下限は試してません)
    1
    
    $ grub-mkimage -d /usr/lib/grub/x86_64-efi -o BOOTx64.EFI -O x86_64-efi -p "" part_gpt part_msdos ntfs ntfscomp hfsplus fat ext2 normal chain boot configfile linux multiboot efi_gop loopback linuxefi affs afs bfs btrfs cbfs cpio cpio_be exfat hfs iso9660 jf
    
  4. 出来たBOOTx64に自己署名証明書で署名します
    1
    
    $ sbsign --key /etc/secureboot/key-material/test-key.rsa --cert /etc/secureboot/key-material/test-cert.pem BOOTx64.EFI
    
  5. 上記で出来るBOOTx64.EFI.signedを、USBメモリの/EFI/BOOT/BOOTx64.EFIとしてコピーします
  6. 自己署名証明書(der形式)をUSBメモにコピーします
  7. PCでUSBブートし、BIOSメニューから、自己署名証明書を読み込ませます

これでUSBメモリ内のisoファイルから立ち上がるようになりました。

ただ、BIOSメニューに自己署名証明書を読み込ませるUIのない場合、 実機が今はないので試せないこともあり、どうするのかはよくわかりません。

cf.

Secure Boot

| Comments

Linux (ubuntu)でSecure Bootを求められました。 ubuntuには、Linux-signed-imageとかgrub-efi-amd64-signedとかっていう パッケージがあるので、何か出来そうなんですけど、 じゃ具体的にどうやるの? というのは意外と書いてないので、苦労してます。

取り敢えず、grub-installで「--secure-boot」というオプションがあるので、

1
$ sudo grub-install --force --no-floppy --efi-directory=/mnt/ --target=x86_64-efi --uefi-secure-boot /dev/sdb

とすると、USBメモリには、/mnt/EFI/ubuntu/ の下にsignedなgrubx64.efiやshimx64.efiが入るんですが、 /EFI/ubuntu/... ではブート時に読み込まないので、 /EFI/BOOT/ にリネームし、 また、/EFI/BOOT/grubx64.efi(又はshimx64.efi) を/EFI/BOOT/BOOTX64.efi にリネームし、 /boot/grub/grub.cfg を、

1
2
3
4
5
6
7
8
9
set timeout=3
set default=0

menuentry "Run Ubuntu Live ISO" {
       set gfxpayload=keep
       loopback loop (hd0,gpt1)/airscope3.iso
       linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/airscope3.iso splash --- debian-installer/language=ja keyboard-configuration/layoutcode?=jp keyboard-configuration/modelcode?=jp109
       initrd (loop)/casper/initrd.lz
}

とすると、grubまでは立ち上がりました。 更にブートするには、loopbackモジュールが必要になり、 それはunsignedなので、そこで引っ掛かりますが、 仕組み上、signed grubでモジュールは使えない(使えてしまうとillegalなモジュールが入り込めてしまう)ので、

  1. loopbackモジュールを使わない
  2. loopbackモジュールを含めたgrubを自力で署名する

前者はUSBメモリをHDとして直接インストールすれば良さそうですが、 8GB以上の容量が必要になります。 現状手元にそんな容量のUSBメモリがありません。 後者は、かなり面倒そうです。Micro$osftに署名してもらうにはお金かかりそうですし、 自分で署名してそのキーをMOK?を使って云々という手法は、 まだ読み込んでません...