$30 off During Our Annual Pro Sale. View Details »

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.
    YoctoProject UEFIセキュアブート

    2022-12-21

    View Slide

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


    View Slide

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

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

    View Slide

  4. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    サマリ

    ■ YoctoProjectについて
    ■ ターゲットボード
    ■ UEFIセキュアブートについて
    ■ YoctoProjectを使用した実現方法
    今回の発表内容はブログの記事を元にしているため、ある程度YoctoProjectに関する知
    識が必要となります。

    View Slide

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


    View Slide

  6. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    YoctoProjectとは

    ■ YoctoProjectとは組み込みLinuxをビルドするための仕組み
    ■ ビルドシステムやビルドに必要なメタデータの集合体を提供
    ■ さまざまな分野で活用されている

    View Slide

  7. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    使用例

    ■ WSL/WSLv2(そのもの)の開発
    ■ オートモーティブ(AGL)
    ■ EMLinux(弊社製品)
    これらはほんの一例です。

    View Slide

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


    View Slide

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

    View Slide

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


    View Slide

  11. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    UEFIセキュアブートについて

    ■ 秘密鍵を使用してバイナリを署名
    ■ 実行時に署名が正しいかどうかを検証
    ■ 検証に使用する公開鍵証明書はNVRAMに保存されている
    ■ 正しい場合にのみ起動できる

    View Slide

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

    鍵 役割 主な所持者
    Platform Kay (PK) KEKの変更に必要 HWベンダ
    Key Exchange Key (KEK) db/dbxの変更に必要 OSベンダ
    db/dbx 実際のバイナリの検証に使用

    View Slide

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


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    カスタムキーの登録

    ROCK Pi Xでは通常のPCの用にUEFIファームウェアの設定画面(BIOS設定)を出すことがで
    きる。 UEFIセキュアブートに必要な鍵はこの画面の中で設定することができる。

    View Slide

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

    View Slide

  20. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    UEFIファームウェア(BIOS)の設定(3/4)

    Key Value
    Provison Factory Default Keys [Disabled]
    Key Managementのタブ

    View Slide

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

    View Slide

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


    View Slide

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

    View Slide

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


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    ビルド

    secure-core-minimal-imageをビルドする。
    $ bitbake secure-core-minimal-image

    View Slide

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

    View Slide

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


    View Slide

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

    View Slide

  33. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    grub-efi_%.bbappend(1/3)

    1. 署名されていないgrubの排除
    2. grubメニューの修正

    View Slide

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

    View Slide

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

    View Slide

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

    署名ありイメージの起動

    View Slide

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

    署名なしイメージの起動

    View Slide

  38. 公開
    Copyright Cybertrust Japan Co., Ltd. All rights reserved.
    まとめ

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

    View Slide

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

    View Slide