보안 부팅이 가능한 grub용 루프백 모듈

보안 부팅이 가능한 grub용 루프백 모듈

우분투 파생상품으로 멀티부팅 USB 스틱을 만들고 있습니다. 저는 온라인에서 찾은 몇 가지 튜토리얼을 따랐습니다. 기본적으로 isos를 USB 스틱에 넣은 다음 스틱에 설치된 grub을 사용하여 부팅합니다.

그러나 다음과 같은 문제가 있습니다. 내 스틱은 보안 부팅이 켜진 상태에서도 작동해야 합니다. 그러나 isos를 부팅하려면 루프백 grub 모듈이 필요하며 보안 부팅을 켠 상태로 부팅하면 보안 부팅에서 grub이 루프백 모듈을 로드하는 것을 금지합니다. 그래서 부팅이 안되네요

보안 부팅을 활성화한 상태에서 grub에서 iso를 부팅할 수 있는 사람이 있습니까?

감사합니다

발레리오

답변1

현재 이 문제를 해결하려고 노력 중입니다.

보안 부팅 중에 모듈 로드를 방지하기 위해 우분투의 grub이 명시적으로 패치된 것 같습니다. 오류 메시지는 약간 도움이 되지 않습니다. 어떤 모듈이 로드되고 있는지에 관계없이 오류가 발생하면 혼란스럽게 파일 이름을 참조합니다.

apt-get source grub-common
   ...
grep -C 10 "Secure Boot forbids" -r .
   ...
#ifdef GRUB_MACHINE_EFI
  if (grub_efi_secure_boot ())
    {
      grub_error (GRUB_ERR_ACCESS_DENIED,
                  "Secure Boot forbids loading module from %s", filename);
      return 0;
    }
#endif
...

이것을 추가하는 패치는 ./debian/patches/no_insmod_on_sb.patch입니다.

가장 좋은 방법은 루프백 지원을 하드코딩하거나 모듈 로드를 허용하도록 grub을 다시 빌드하는 것입니다. 아니면 USB에서 부팅할 때 보안 부팅을 비활성화할 수도 있습니다(이는 매우 드문 활동이기 때문에).

grub이 모듈을 로드하도록 허용하는 것이 보안에 미치는 영향은 다소 복잡하므로 누군가가 즉시 내가 틀렸다고 말하고 논쟁을 벌여야 하므로 이에 대한 언급을 피하겠습니다.

답변2

서명된 grub 이미지(최소한 Ubuntu 20.04와 함께 제공되는 테스트한 이미지)의 현재 버전에는 모듈이 포함되어 있으므로 loopback로드/삽입할 필요가 없습니다. 사실, 위의 답변에서 이미 언급했듯이 이것은 불가능합니다. Ubuntu 설치/라이브 환경과 Windows 10 설치를 부팅할 수 있는 외장 드라이브를 만들기 위해 사용한 구성을 게시합니다.

결국에는 압축을 푼 Windows 파일용으로 512MB EFI, 20GB NTFS, Ubuntu ISO를 포함한 다른 모든 파일용으로 큰 FAT32 파티션 등 여러 파티션을 사용하게 되었습니다. Windows에는 이제 4GB보다 큰 설치 파일이 포함되어 있으므로 NTFS가 필요합니다. 현재로서는 서명된 grub 이미지에 exfat 모듈이 포함되어 있지 않다고 생각하므로 여기서는 NTFS가 유일한 옵션입니다. 참고로, 압축을 푼 Windows 파일은 파티션 루트에 있어야 하는데, 하위 디렉터리에 저장하는 것은 제게는 효과가 없었습니다.

다음은 EFI 파티션에 grub을 설치하는 데 사용한 구성입니다.

sudo grub-install \
--boot-directory=[EFI mount point]/boot \
--efi-directory=[EFI mount point] \
--uefi-secure-boot \
--removable \
--target=x86_64-efi \
--no-bootsector \
/dev/sdaX

그리고 파일은 다음과 같습니다 grub.cfg(첫 번째 메뉴 항목 위의 줄은 중복된 것 같지만 이것이 제가 사용한 실제 구성입니다).

search --no-floppy --set=root --fs-uuid [UUID of EFI partition]
set prefix=($root)'/boot/grub'
configfile $root/EFI/BOOT/grub.cfg

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry 'Ubuntu 20.04.1' --class ubuntu --class gnu-linux --class gnu --class os {        
    set isodir='/images/ubuntu'
    set isoname='ubuntu-20.04.1-desktop-amd64.iso'
    set isofile=$isodir/$isoname
    
    search --no-floppy --set=isodev --fs-uuid [UUID of FAT32 partition]

    loopback loop0 ($isodev)/$isofile
    linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
    initrd (loop0)/casper/initrd
}

menuentry 'Windows 20H2' {
    set efi_path=/efi/boot/bootx64.efi
    
    search --no-floppy --set=windev --fs-uuid [UUID of NTFS partition]
    chainloader ($windev)/$efi_path
}

menuentry 'UEFI Firmware Settings' {
    fwsetup
}

그게 전부입니다. 누군가가 그것이 유용하다고 생각하기를 바랍니다.

관련 정보