Upgrade to Pro — share decks privately, control downloads, hide ads and more …

YoctoProject UEFIセキュアブート

YoctoProject UEFIセキュアブート

YoctoProjectベースのLinuxを作成しUEFIセキュアブートをためします。

Yusuke Mitsuki

December 20, 2022
Tweet

Other Decks in How-to & DIY

Transcript

  1. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 自己紹介


    三ツ木 祐介 IoT関連の部署で組込Linuxのポーティングなどを主に行っています。 YoctoProjectに関する事が得意です。 個人の活動としては、CQ出版のインターフェース誌で 「YoctoProjectではじめる組み込みLinux開発入門」 という連載記事を書いています。 また個人ブログ、みつきんのメモを書いています。
  2. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. サマリ


    ▪ YoctoProjectについて ▪ ターゲットボード ▪ UEFIセキュアブートについて ▪ YoctoProjectを使用した実現方法 今回の発表内容はブログの記事を元にしているため、ある程度YoctoProjectに関する知 識が必要となります。
  3. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. YoctoProjectとは


    ▪ YoctoProjectとは組み込みLinuxをビルドするための仕組み ▪ ビルドシステムやビルドに必要なメタデータの集合体を提供 ▪ さまざまな分野で活用されている
  4. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 使用例


    ▪ WSL/WSLv2(そのもの)の開発 ▪ オートモーティブ(AGL) ▪ EMLinux(弊社製品) これらはほんの一例です。
  5. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. ROCK

    Pi X
 ▪ Intel Cherry Trail quad core processor Z8350 ▪ LPDDR3 ▪ up to 4K@30 HDMI ▪ GbE LAN UEFIファームウェアを使用したいのでx86系のSoCが載っているボードを使 用。
  6. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIセキュアブートについて


    ▪ 秘密鍵を使用してバイナリを署名 ▪ 実行時に署名が正しいかどうかを検証 ▪ 検証に使用する公開鍵証明書はNVRAMに保存されている ▪ 正しい場合にのみ起動できる
  7. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIセキュアブートの鍵


    鍵 役割 主な所持者 Platform Kay (PK) KEKの変更に必要 HWベンダ Key Exchange Key (KEK) db/dbxの変更に必要 OSベンダ db/dbx 実際のバイナリの検証に使用
  8. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. セキュアブートに使用する鍵


    ▪ UEFIセキュアブートでは実際のバイナリの署名を検証するのはdb/dbx ▪ db/dbxに鍵を登録するにはKEKの秘密鍵が必要になる ▪ KEKはPKによって署名されているが、PKの秘密鍵はH/Wベンダしか持っ ていない ▪ UEFIを使用する場合、大概H/WはPC ▪ KEKの秘密鍵はマイクロソフト(MS)が持っているという状況が多い
  9. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. ブートシーケンス


    ROCK Pi Xでセキュアブートするにはmeta-efi-secure-bootを使用する。 今回の環境では、次のような順序でプログラムが実行される。 1. UEFIファームウェア 2. shim 3. SELoader(meta-efi-secure-bootオリジナル) 4. grub 5. Linux Kernel
  10. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. エンタープライズ/組み込みの違い


    ▪ PC、サーバ向けのお話ではH/Wは既成品であることが多い ▪ H/Wにいちいち署名してもらうのは現実的じゃない ▪ 大概のH/Wで動作するWindowの持ち主のMSの鍵で署名してもらう ▪ セキュアブートする場合大概はMSの鍵 ▪ shimに署名してもらうのは大変 ▪ 組み込み分野ではH/Wも作る場合が多い ▪ 必ずしもshimはMS鍵で署名される必要はない ▪ 今回のターゲット上のshimも自前の鍵で署名している ▪ ROCK Pi Xはカスタムキーを登録できる
  11. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. meta-efi-secure-bootでの署名検証


    ▪ UEFIセキュアブートのdbの検証はshimに対して行う ▪ shimは通常であればgrubを起動する • shimはPE形式のバイナリに対してのみ検証 • grub.cfgやカーネル、initrdなどの非PEのファイルは検証できない ▪ 非PEの検証を行うためにSELoaderを導入 ▪ SELoaderはshimの証明書でバイナリを検証
  12. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. カスタムキーの登録


    ROCK Pi Xでは通常のPCの用にUEFIファームウェアの設定画面(BIOS設定)を出すことがで きる。 UEFIセキュアブートに必要な鍵はこの画面の中で設定することができる。
  13. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIファームウェア(BIOS)の設定(2/4)


    Key Value System Mode User Secure Boot Active Vendor Keys Not Active Secure Boot [Enabled] Secure Boot Mode [Custom] Securityのタブ
  14. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIファームウェア(BIOS)の設定(3/4)


    Key Value Provison Factory Default Keys [Disabled] Key Managementのタブ
  15. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIファームウェア(BIOS)の設定(4/4)


    Secure Boot variable Size Key# Key source Platform Key(PK) 843 1 Custom * Key Exchange Keys 823 1 Custom * Authorized Signatures 821 1 Custom * Forbidden Signatures 813 1 Custom * Authorized TimeStamps 0 0 Key Managementのタブ
  16. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. ブートパーティション


    . ├── EFI │ └── BOOT │ ├── Hash2DxeCrypto.efi │ ├── LockDown.efi │ ├── Pkcs7VerifyDxe.efi │ ├── SELoaderx64.efi │ ├── boot-menu.inc │ ├── boot-menu.inc.p7b │ ├── bootx64.efi │ ├── efi-secure-boot.inc │ ├── efi-secure-boot.inc.p7b │ ├── grub.cfg │ ├── grub.cfg.p7b │ ├── grubenv │ ├── grubx64.efi │ ├── mmx64.efi │ ├── password.inc │ └── password.inc.p7b ├── bzImage └── bzImage.p7b
  17. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. pokyの取得、設定


    ビルド環境と基本的なメタデータのセットであるpokyを取得 $ git clone git://git.yoctoproject.org/poky -b kirkstone bitbakeなどのツールを使用できるように環境変数を設定 $ source poky/oe-init-build-env build この時点でbuildディレクトリに移動される。
  18. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 依存関係のあるレイヤ


    UEFIセキュアブートに必要なレイヤを取得する。 $ bitbake-layers layerindex-fetch meta-oe $ bitbake-layers layerindex-fetch meta-efi-secure-boot -b master ROCK Pi Xで使用するためのカスタマイズを行うレイヤも取得する。 これは筆者が作成し githubに置いたもの。 $ pushd ../poky $ git clone https://github.com/mickey-happygolucky/meta-efi-secure-boo t-helper.git $ popd $ bitbake-layers add-layer ../poky/meta-efi-secure-boot-helper
  19. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. local.confの修正


    conf/local.confの下の方に下記の内容を追加する。 MACHINE = "genericx86-64" DL_DIR = "${TOPDIR}/../downloads" # systemd DISTRO_FEATURES_append = " systemd pam" VIRTUAL-RUNTIME_init_manager = "systemd" DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" VIRTUAL-RUNTIME_initscripts = "" # secure boot #SIGNING_MODEL = "user" INITRAMFS_IMAGE = "secure-core-image-initramfs" DISTRO_FEATURES_append = " efi-secure-boot"
  20. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. local.confの修正(cont.)


    conf/local.confの下の方に下記の内容を追加する。 IMAGE_EFI_BOOT_FILES_append = " \ ${KERNEL_IMAGETYPE}.p7b \ Hash2DxeCrypto.efi;EFI/BOOT/Hash2DxeCrypto.efi \ LockDown.efi;EFI/BOOT/LockDown.efi \ Pkcs7VerifyDxe.efi;EFI/BOOT/Pkcs7VerifyDxe.efi \ SELoaderx64.efi;EFI/BOOT/SELoaderx64.efi \ boot-menu.inc;EFI/BOOT/boot-menu.inc \ boot-menu.inc.p7b;EFI/BOOT/boot-menu.inc.p7b \ bootx64.efi;EFI/BOOT/bootx64.efi \ efi-secure-boot.inc;EFI/BOOT/efi-secure-boot.inc \ efi-secure-boot.inc.p7b;EFI/BOOT/efi-secure-boot.inc.p7b \ grub.cfg;EFI/BOOT/grub.cfg \ grub.cfg.p7b;EFI/BOOT/grub.cfg.p7b \ grubenv;EFI/BOOT/grubenv \ grubx64.efi;EFI/BOOT/grubx64.efi \ mmx64.efi;EFI/BOOT/mmx64.efi \ password.inc;EFI/BOOT/password.inc \ password.inc.p7b;EFI/BOOT/password.inc.p7b \ "
  21. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. ビルド


    secure-core-minimal-imageをビルドする。 $ bitbake secure-core-minimal-image
  22. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 書き込み


    bmaptoolで書き込む。メディアはUSBメモリスティックか、SDカードを使用する。 SDカードを使用する場合はオンボードのカードスロットではなく、USB接続のカードリーダ を使用する必要がある。 メディアが自動でマウントされている場合はアンマウントする。 $ sudo umount /media/${USER}/* 下記のコマンドで書き込む。 $ cd tmp/deploy/images/genericx86-64/ $ sudo bmaptool copy secure-core-minimal-image-genericx86-64.wic /dev/sda
  23. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 構成


    設定ファイルを上書きしたいのでプライオリティは20と高めに設定している。 . ├── COPYING.MIT ├── README.md ├── conf │ └── layer.conf └── recipes-bsp └── grub ├── grub-efi │ └── boot-menu.inc └── grub-efi_%.bbappend
  24. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. grub-efi_%.bbappend(1/3)


    1. 署名されていないgrubの排除 2. grubメニューの修正
  25. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. grub-efi_%.bbappend(2/3)


    do_deployをから実装で上書きすることで署名されていないgrubが起動メディアにインス トールされることを回避。 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" # avoid the installing grubx64.efi which does not certified. do_deploy() { }
  26. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. grub-efi_%.bbappend(3/3)


    ルートFSが/dev/hda2になっているので、/dev/sda2に修正。 initrdを指定していたが、今 回は不使用なので削除 menuentry "Sample EFI boot" --unrestricted { savedefault set fallback=1 linux /bzImage root=/dev/sda2 ro rootwait }
  27. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. まとめ


    ▪ YoctoProjectでUEFIセキュアブートを実現 ▪ meta-efi-secure-bootレイヤを使用する ▪ ボードによっては調整用のレイヤを作成する必要がある ▪ 署名の無いイメージを起動しようとするときちんとエラーになる ▪ 組み込みLinuxの開発にはYoctoProjectが便利
  28. 公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 信頼とともに

    留意事項 本資料に記載されている会社名、製品名、サービス名は、当社または各社、各団体の商標もしくは登録商標です。 その他本資料に記載されているイラスト・ロゴ・写真・動画・ソフトウェア等は、当社または第三者が有する知的財産権やその他の権利により守られております。 お客様は、当社が著作権を有するコンテンツについて、特に定めた場合を除き、複製、改変、頒布などをすることはできません。 本資料に記載されている情報は予告なしに変更されることがあります。また、時間の経過などにより記載内容が不正確となる場合がありますが、当社は、当該情報を更新する義 務を負うものではありません。