Microsoft 서명 운영 체제 로더에서 로드된 UEFI 자체 서명 커널

Microsoft 서명 운영 체제 로더에서 로드된 UEFI 자체 서명 커널

UEFI에서 자체 운영 체제 로더(부트 로더)를 작성하고 있습니다. 운영 체제 로더는 Microsoft에서 서명했으므로 보안 부팅에서 실행될 수 있습니다. OS 로더는 사용자 선택에 따라 Windows 또는 Linux 커널을 로드할 수 있습니다(GRUB와 유사). Linux 커널을 EFI 스텁으로 구축했기 때문에 OS 로더에서 로드할 수 있습니다.

그러나 특정 요구 사항이 있습니다. Linux 커널에 자체 서명하겠습니다.

다른 서명되지 않은 커널이 아닌 자체 서명된 Linux 커널을 로드하도록 신뢰 체인을 설정하려면 어떻게 해야 합니까?

telcoM의 건의사항을 반영하여 2022년 1월 21일 수정됨

telcoM의 답변에 이어 SHIM 소스 코드를 다음에서 다운로드했습니다.https://github.com/rhboot/shim
PKI 키도 만들었습니다.
https://www.rodsbooks.com/efi-bootloaders/secureboot.html#initial_shim

$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Your Name/"
$ openssl x509 -in MOK.crt -out MOK.cer -outform DER

빌드된 SHIM 소스 사용

make VENDOR_CERT_FILE=MOK.cer

서명된 grubx64.efi를 얻기 위해 MOK.key를 사용하여 kernel.efi에 서명했습니다(이는 SHIM의 기본 로더가 grubx64.efi이기 때문입니다. 저는 기본값을 계속 사용했습니다).

sbsign --key MOK.key --cert MOK.crt --output grubx64.efi  kernel.efi

마지막으로 shimx64.efi를 loader.efi로 사용합니다(PreLoader 사용).https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/) 현재 Microsoft에서 서명한 shimx64.efi가 없기 때문입니다. 또한 mmx64.efi 및 fbx64.efi도 HashTool.efi를 통해 shimx64.efi(loader.efi)에 등록됩니다.

이것이 과정입니다.
PreLoader.efi --> loader.efi(shimx64.efi) --> grubx64.efi(kernel.efi)

SecureBoot를 비활성화한 후 모든 것이 제대로 작동했고 Linux 커널을 부팅할 수 있었습니다.
그러나 SecureBoot가 활성화되면 grubx64.efi 이미지를 부팅할 수 없습니다.

추가 업데이트

MOK.cer을 등록하려면 MokManager(mmx64.efi)를 사용해야 한다는 것을 알았습니다. mmx64.efi를 시도하고 MOK.cer을 등록했습니다. 그런데 Key가 성공적으로 등록되지 않은 것 같습니다.

내가 뭐 놓친 거 없니?

답변1

운영 체제 로더에는 자신의 커널에 서명하는 데 사용할 키의 공개 부분(인증서라고도 함) 복사본이 포함되어 있어야 합니다. 이 키가 변경될 때마다 Microsoft에서 운영 체제 로더에 다시 서명하도록 해야 합니다.

shimx64.efi보안 부팅을 처리하기 위해 많은 주요 배포판에서 사용하는 보안 부팅 shim 부트로더의 소스 코드를 연구하고 싶을 수도 있습니다.

https://github.com/rhboot/shim


또는 커널 서명 키의 공개 부분 복사본을 dbUEFI NVRAM 변수에 추가해야 합니다. 일반적으로 이는 PK시스템에서 보안 부팅 마스터 키(UEFI NVRAM 변수)를 교체하는 경우에만 가능합니다 . 이는 시스템의 펌웨어가 어떻게 구현되었는지(또는 실제로는만약에) 할 수 있습니다.

일반적인 가능성:

  1. UEFI 펌웨어 설정("BIOS 설정")에 보안 부팅 키 저장소를 직접 편집하는 방법이 포함되어 있는 경우 해당 방법을 사용하여 커널 서명 키를 변수에 직접 추가할 수 있습니다 db. PK먼저 기본 키를 재설정하거나 교체 해야 할 수도 있습니다 . 아래를 참조하세요.

  2. UEFI 펌웨어 설정에 보안 부팅 키 저장소를 직접 편집하는 방법이 포함되어 있지 않지만 보안 부팅 마스터 키를 0으로 만드는 방법이 포함되어 있는 경우 PK시작하기에 충분합니다. PK보안 부팅 위치 제로화보안 부팅 설정 모드, 모든 커널을 부팅할 수 있고 모든 보안 부팅 키 저장소를 편집할 수 있습니다. 새 보안 부팅 마스터 키(즉, 보안 부팅을 위해 커널에 서명하는 데 사용되는 것과 유사한 디지털 인증서)가 PK키 저장소 변수에 저장되면 설정 모드가 종료됩니다.

그리고보안 부팅 설정 모드, 모든 보안 부팅 키 저장소는 운영 체제 수준 프로그램에서 편집할 수 있어야 합니다.efivar https://github.com/vathpela/efivar.git또는sbsigntools https://git.kernel.org/pub/scm/linux/kernel/git/jejb/sbsigntools.git예를 들어. 실제로 이것이 항상 작동하는 것은 아닙니다. 이는 시스템 특정 펌웨어의 UEFI 구현 속성에 따라 달라집니다.

펌웨어에서 OS 수준 프로그램을 통한 보안 부팅 키 저장소 편집을 허용하지 않는 경우 이 패키지 KeyTool.efi에 있는 것과 같은 UEFI 모드 도구를 사용하면 더 나은 결과를 얻을 수 있습니다 efitools.https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git

(UEFI NVRAM 변수는 일반 운영 체제가 아닌 부팅 시 프로그램에서만 액세스할 수 있도록 보호할 수 있습니다 .efi. 보안 부팅 사양이 있음에도 불구하고 보안 부팅 키 저장소를 이런 방식으로 제한하는 것처럼 보이는 일부 UEFI 구현을 본 적이 있습니다. 필요하지 않습니다.)

답변2

보안 부팅을 위해 "머신 소유자 키" 키 저장소에 키를 추가할 수 있습니다. 이를 달성하기 위해 Scientific Linux는 다음 명령을 사용했습니다.

cd /tmp
curl http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt | openssl x509 -inform der  > DigiCertEVCodeSign.pem
curl http://cacerts.digicert.com/DigiCertEVCodeSigningCA-SHA2.crt  | openssl x509 -inform der >> DigiCertEVCodeSign.pem
curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27.pem
curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26.pem
curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26.pem

certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27.pem
certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26.pem
certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26.pem
# use mokutil to import 
mokutil --import /etc/pki/secure-boot/SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27

시스템 소유자의 키 저장소 작동을 담당하는 명령은 입니다 mokutil.

원천:http://ftp.scientificlinux.org/linux/scientific/7.9/x86_64/release-notes/#_about_uefi_secure_boot

관련 정보