Slide 1

Slide 1 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. YoctoProject UEFIセキュアブート
 2022-12-21

Slide 2

Slide 2 text

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


Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. YoctoProjectについて


Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. ターゲットボード


Slide 9

Slide 9 text

公開 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が載っているボードを使 用。

Slide 10

Slide 10 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. YoctoProjectとUEFIセキュアブート


Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. UEFIセキュアブートの処理イメージ


Slide 14

Slide 14 text

公開 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)が持っているという状況が多い

Slide 15

Slide 15 text

公開 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

Slide 16

Slide 16 text

公開 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はカスタムキーを登録できる

Slide 17

Slide 17 text

公開 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の証明書でバイナリを検証

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

公開 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のタブ

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

公開 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のタブ

Slide 22

Slide 22 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. meta-efi-secure-boot


Slide 23

Slide 23 text

公開 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

Slide 24

Slide 24 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. YoctoProjectでのLinuxのビルド


Slide 25

Slide 25 text

公開 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ディレクトリに移動される。

Slide 26

Slide 26 text

公開 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

Slide 27

Slide 27 text

公開 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"

Slide 28

Slide 28 text

公開 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 \ "

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

公開 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

Slide 31

Slide 31 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. meta-efi-secure-boot-helper


Slide 32

Slide 32 text

公開 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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

公開 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() { }

Slide 35

Slide 35 text

公開 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 }

Slide 36

Slide 36 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 署名ありのイメージ
 署名ありイメージの起動

Slide 37

Slide 37 text

公開 Copyright Cybertrust Japan Co., Ltd. All rights reserved. 署名なしのイメージ
 署名なしイメージの起動

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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