UEFIで独自のオペレーティングシステムローダ(ブートローダ)を作成しています。オペレーティングシステムローダーはマイクロソフトによって署名されているため、セキュアブートで実行できます。 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
セキュアブートを処理するために、多くの主要なディストリビューションで使用されるセキュアブートシムブートローダのソースコードを研究したいかもしれません。
https://github.com/rhboot/shim
または、カーネル署名キーの公開部分コピーをdb
UEFI NVRAM変数に追加する必要があります。通常、これはPK
システムがセキュアブートマスターキー(UEFI NVRAM変数)を交換する場合にのみ可能です。これは、システムのファームウェアがどのように実装されたか(または実際にはもし)できます。
一般的な可能性:
UEFIファームウェア設定(「BIOS設定」)にセキュアブートキーストアを直接編集する方法が含まれている場合は、その方法を使用してカーネル署名キーを変数に直接追加できます
db
。PK
まず、主キーをリセットまたは交換する必要があるかもしれません。下記をご覧ください。UEFIファームウェア設定にセキュアブートキーストアを直接編集する方法は含まれていませんが、セキュアブートマスターキーをゼロにする方法が含まれている場合は、起動する
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実装の一部を見たことがあります。必要ありません。)