セキュアブート

目次

5.1. セキュアブートとチェーンオブトラスト
5.2. HAB とは
5.3. セキュリティとして期待される効果
5.4. 署名環境を構築する
5.4.1. 署名環境について
5.4.2. uboot-imx のセキュアブートの実装仕様
5.4.3. ATDE を準備する
5.4.4. アップデートファイル作成ツール (mkswu) を準備する
5.4.5. セキュアブートおよびストレージ暗号化に必要なスクリプトを取得する
5.4.6. セキュアブートおよびストレージ暗号化に使用するスクリプトの説明
5.4.7. 環境構築
5.5. セキュアブートおよびルートファイルシステム(rootfs)の暗号化
5.5.1. セキュアブートおよび rootfs の暗号化を行う SWU イメージの作成
5.5.2. SWU イメージのインストール
5.6. 動作確認
5.6.1. セキュアブートの確認
5.7. 量産用 Armadillo のセキュアブートおよびストレージ暗号化
5.7.1. インストールディスクイメージ作成用の SWU イメージを生成する
5.7.2. Armadillo に USBメモリを挿入
5.7.3. インストールディスクイメージ作成用 SWU を Armadillo にインストールする
5.7.4. 開発環境を別の Armadillo に複製する
5.7.5. 開発環境を複製した Armadillo の動作確認
5.8. セットアップ完了後のアップデートの運用
5.8.1. 署名済みブートローダーの更新方法
5.8.2. 署名済み Linux カーネルの更新方法
5.9. 補足情報
5.9.1. secureboot.conf の設定方法
5.9.2. 署名済みイメージと展開先
5.9.3. セキュアブートのフロー
5.9.4. ビルドのプロセスフロー
5.9.5. ファームウェアアップデートのフロー
5.9.6. SRK の無効化と切り替え

この章ではセキュアブートを有効にする方法について説明します。 また、セキュアブートをベースにしたいくつかの技術についても紹介します。

5.1. セキュアブートとチェーンオブトラスト

組み込みデバイスへの攻撃は様々な方向から行われます。ある方向のセキュリティ対策が強固な場合、攻撃者は回避可能な別の方向がないのか模索します。攻撃者のコードを何らかの方法でデバイスに組み込んで対策を回避するのが、単純ですが有効な方法でしょう。IoT デバイスはネットワーク上のサービスとデータのやり取りを行います。通信路の暗号化、サーバーとデバイスの相互認証などの対策を講じたとしても、IoT デバイス上にあるソフトウェアに攻撃者のコードを組み込むことで対策を回避してシステムに侵入される可能性があるのです。

セキュアブートは、起動ソフトウェアのディジタル署名を用いて正規ソフトウェアであることを確認してから起動する処理のことです。攻撃者によって作られた不正なコードを実行前に検出することができます。セキュアブートはチェーンオブトラスト (chain of trust) と表裏一体に実装されます。チェーンオブトラストとは、その名の通り、信頼を繋いでいく形態のことを指します。ルートオブトラストと呼ばれる基礎となる情報から枝葉のように繋がれた情報を認証していくことで、繋がれた個々のコンポーネントだけでなくシステムを信頼できるものにしてくれます。セキュアブートは、起動時にソフトウェアを順番に認証することで信頼を次に繋いでいるのです。セキュアブートの範囲をどこまでにするかによりますが、起動時に認証されたソフトウェアで別の情報を認証すれば、チェーンオブトラストを繋げていくことができます。また、IoT デバイスとクラウドサービスから構成されるような広範囲に及ぶシステムは特に信頼が必要になります。信頼できるセキュリティ基盤を構築するためには、構成するソフトウェアが正規のリリース物であることを確認することが重要になります。チェーンオブトラストを採用することでより信頼できる IoT システムとなり得るのです。

./images/chain_of_trust.png

図5.1 チェーンオブトラスト


では、どういったケースでセキュアブートを採用するべきでしょうか。セキュアブートはセキュアな組み込みデバイスを実現する上で最初のステップにするべき技術です。しかし、導入するのであればコスト面にも配慮することが必要でしょう。まず、製造時の追加コストが必要です。鍵等を書き込む工程が必要になります。ただ書き込めばよいわけではなく、漏洩があってはいけないので物理的な隔離などセキュアに書き込む必要があります。メンテナンスにも追加のコストが必要です。ソフトウェアのリリース時にはソフトウェアの署名が必要になります。こちらも、物理的な隔離などの漏洩、汚染対策が必要になります。また、どこまでやるかによりますが、定期的な鍵の更新、インシデントや製品寿命による鍵のリボーケーションなどのメンテナンスコストが必要になってきます。費用対効果を検討してからの導入をお勧めします。

5.2. HAB とは

HAB (High Assurance Booting) は、NXP が提供するセキュアブートの実装です。i.MX 8M Plus の BootROM には HABv4 が組み込まれます。デフォルトでは無効な状態になっていますが、一度、eFuse に情報を書き込むことでセキュアブートが有効になり、それ以降、有効な状態のまま変更不可能になります。HABv4 で規定する仕様では次の情報をブートローダーイメージに追加することで BootROM が起動時にブートローダーの認証を行います。

  • CSF (Command Sequence File)、IVT (Image Vector Table)
  • SRK (Super Root Key)、CSF、IMG 署名確認鍵
  • イメージの署名

NXP は署名ツールとして CST (Code Signing Tool) をリリースしています。本来、署名範囲などは環境によって様々な実装がなされるべきなので署名ツール自体にはその辺りの仕様が含まれません。ブートローダーの実装仕様に依存します。Armadillo Base OS で採用される uboot-imx のセキュアブート処理では、Trusted Firmware-A (ATF)、OP-TEE OS、Linux カーネルイメージまでが認証の対象になります。署名に関する概要は以下のとおりです。

  • 署名確認用の鍵は X.509 証明書に対応する
  • 署名は RSA/ECC に対応する

    • RSA 1024, 2048, 3072, 4096 bits
    • ECC NIST P-256, NIST P-384, NIST P-521
  • 署名のダイジェストは SHA256 のみ
[注記]

HAB の詳しい仕様は以下を参照してください。

[ティップ]

セキュアブートのフローは 「セキュアブートのフロー」 を参照してください。

イメージの詳しいフォーマットと展開先については 「署名済みイメージと展開先」 を参照してください。

アップデートのフローの詳細については 「ファームウェアアップデートのフロー」を参照してください。

5.3. セキュリティとして期待される効果

Armadillo-IoT ゲートウェイ G4/Armadillo-X2 と Armadillo Base OS を利用することで、 以下のようなセキュリティ機能を実現することができます。

表5.1 セキュリティとして期待される効果

機能期待される効果

セキュアブート

ブートローダーと Linux Kernel の改竄を検出することができます。また、 署名とその検証によって、正規ソフトウェアのみの起動を強制させることができます。

ストレージの暗号化

ファイルがフラッシュメモリに保存されている間は暗号化によって ファイルは保護されます。 通常はアプリケーションやデータなどはファイルとして保存されるので、 そういったファイルに情報資産が含まれるケースでの活用が考えられます。


以降の作業を行うことで、セキュアブートを有効化し、ストレージを暗号化することが出来ます。

[注意]

ブートローダーの暗号化に関しては対応しておりません。

5.4. 署名環境を構築する

まず、セキュアブートをセットアップするために必要な環境を構築していきます。

5.4.1. 署名環境について

ここで利用する署名環境の構成は以下のとおりです。

表5.2 署名環境

ツール/パッケージ説明

ATDE(Atmark Techno Development Environment)

提供元 : アットマークテクノ

Armadillo シリーズの開発環境として VirtualBox イメージとして配布されます。

CST(Code Signing Tool) パッケージ

提供元 : NXP

HAB の署名を行うツールや鍵を生成するツールです。 Linux パッケージとして提供されています。

mkswu パッケージ

提供元 : アットマークテクノ

Armadillo Base OS のファームウェアアップデートの仕組みである SWUpdate 用のアップデートファイルを生成するツールを含みます。

build-rootfs-[VERSION].tar.gz

提供元 : アットマークテクノ

Armadillo Base OS のルートファイルシステムを生成するツールを含みます。

Alpine Linux をベースにアットマークテクノのパッケージを加えた構成になります。

Armadillo-IoT ゲートウェイ G4

https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4/tools

Armadillo-X2

https://armadillo.atmark-techno.com/resources/software/armadillo-x2/tools

imx-boot-[VERSION].tar.gz

提供元 : アットマークテクノ

ブートローダーのソースコードや、セキュアブート及びストレージ暗号化用の SWU イメージをつくるスクリプトを含みます。

Armadillo-IoT ゲートウェイ G4

https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4/boot-loader

Armadillo-X2

https://armadillo.atmark-techno.com/resources/software/armadillo-x2/boot-loader

baseos-[VERSION].tar.zst

提供元 : アットマークテクノ

Armadillo Base OS のルートファイルシステムのビルド済みバイナリです。

Armadillo-IoT ゲートウェイ G4

https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4/baseos

Armadillo-X2

https://armadillo.atmark-techno.com/resources/software/armadillo-x2/baseos


[注記]

ビルドの全体的なプロセスフローについては 「ビルドのプロセスフロー」に図があります。

5.4.2. uboot-imx のセキュアブートの実装仕様

セキュアブートの実装は uboot-imx のガイドに準拠しています。 詳しい仕様は以下を参照してください。 取得したソースツリー内にドキュメントがあります。

[ティップ]

セキュアブートのフローは 「セキュアブートのフロー」 を参照してください。

イメージの詳しいフォーマットと展開先については 「署名済みイメージと展開先」 を参照してください。

アップデートのフローの詳細については 「ファームウェアアップデートのフロー」を参照してください。

5.4.3. ATDE を準備する

製品マニュアルを参考に作業をしてください。

5.4.4. アップデートファイル作成ツール (mkswu) を準備する

mkswu は SWUpdate に対応したアップデートファイルを生成するツールです。 製品マニュアルを参考に ATDE をセットアップしてください。

[注記]

セキュアブートに対応する mkswu は 4.0-1 以上になります。

[重要項目]

SWU イメージの暗号化

SWU イメージはデフォルト設定では暗号化されません。 通信路は TLS で守られても、ファイルで保管されているときには平文なので SWU イメージ内にある機密情報が漏洩する可能性があります。 SWU イメージに漏洩すると問題のある情報資産を含めるときには必ず暗号化するべきです。

Armadillo-IoT ゲートウェイ G4/Armadillo-X2 の製品マニュアル内の「最初に行う設定」を 実施するときには、以下の質問では y と答えてください。

アップデートイメージを暗号化しますか? (N/y)

バージョンの確認方法は以下のとおりです。

[ATDE ~]$ dpkg -l mkswu
ii  mkswu        6.4-1

図5.2 mkswu のバージョン確認


5.4.5. セキュアブートおよびストレージ暗号化に必要なスクリプトを取得する

以下のURLから「ブートローダー ソース(u-boot等)」を取得してください。

Armadillo-IoT ゲートウェイ G4

https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4/boot-loader

Armadillo-X2

https://armadillo.atmark-techno.com/resources/software/armadillo-x2/boot-loader

取得したアーカイブ内にセキュアブートおよびストレージ暗号化に必要なスクリプトが含まれています。

[注記]

本書作成時点で利用したパッケージは以下のとおりです。

  • imx-boot-2020.04-at25.tar.gz

ブートローダーのソースコードのアーカイブを展開します。 以降、このアーカイブをホームディレクトリに展開した想定で説明します。

[ATDE ~]$ tar xaf imx-boot-[VERSION].tar.gz 1
[ATDE ~]$ cd imx-boot-[VERSION] 2

図5.3 ブートローダーのソースコードのアーカイブを展開する


1

[VERSION] はバージョンによって変化します

2

imx-boot-[VERSION]に移動します。

5.4.6. セキュアブートおよびストレージ暗号化に使用するスクリプトの説明

imx-boot-[VERSION] に存在する secureboot.sh というスクリプトを用いてセキュアブートおよびストレージの暗号化を行います。

以降の作業で使用する secureboot.sh のオプションは次のとおりです。

表5.3 以降で使用する secureboot.sh のオプション

オプション説明

setup

imx-boot-[VERSION] と同じディレクトリ階層に、セキュアブート及びストレージ暗号化を行うための環境である secureboot_x2 ディレクトリを作成します。

secureboot_init

セキュアブート及びルートファイルシステムの暗号化を行うための SWU イメージを作成します。

make_installer

開発用 Armadillo の環境を複製したインストールディスクメージを作成する SWU イメージを生成します。 作成したインストールディスクイメージを量産用 Armadillo にインストールすることで以下のような環境を準備できます。

  • セキュアブートの有効化
  • ルートファイルシステム及びアプリケーション領域の暗号化
  • 開発用 Armadillo の環境の複製

5.4.7. 環境構築

以下のように、imx-boot-[VERSION] 上で secureboot.sh の setup オプションを実行してください。

[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh setup
imx-code-signing-tool package is needed to setup secureboot.
Install imx-code-signing-tool? [Y/n] 1
...省略
OK: Linking /home/atmark/secureboot_x2/build-rootfs to /home/atmark/secureboot_x2/build-rootfs-[VERSION]
OK: Linking /home/atmark/secureboot_x2/imx-boot to /home/atmark/imx-boot-[VERSION]
Setup /home/atmark/secureboot_x2 successfully. Run './secureboot.sh secureboot_init' next. 2

図5.4 secureboot.sh setup の実行


1

Enterを押すと、CST の Linux パッケージをインストールします。

2

secureboot_x2 ディレクトリが作成されます。

imx-boot-[VERSION] ディレクトリと同じ階層に secureboot_x2 ディレクトリが作成されます。

デフォルトでは、secureboot_x2 ディレクトリ内は以下の構成になっています。

secureboot_x2
├── build-rootfs -> /home/atmark/secureboot_x2/build-rootfs-[VERSION] 1
├── build-rootfs-[VERSION] 2
├── cst 3
├── imx-boot -> /home/atmark/imx-boot-[VERSION] 4
├── out 5
├── secureboot.conf 6
├── secureboot.sh -> /home/atmark/imx-boot/secureboot.sh 7
└── swu 8
└── tmp 9

1

シンボリックリンク元が使用する build-rootfs ディレクトリになります。

2

build-rootfs-[VERSION] が imx-boot-[VERSION] と同じ階層になければダウンロードします。

3

CSTによって生成された鍵などが配置されます。

4

シンボリックリンク元が使用する imx-boot ディレクトリになります。

5

Linuxカーネルおよびブートローダーのイメージが配置されます。

6

secureboot.sh の設定ファイルです。imx-boot-[VERSION]/secureboot.conf.example からコピーされます。

7

シンボリックリンク元が使用する secureboot.sh になります。

8

セキュアブートおよびディスク暗号化を行うための SWU イメージが配置されます。

9

secureboot.sh を実行した時に生成される一時ファイルが配置されます。

[注記]

CST(Code Signing Tool)はNXPからソースコードをダウンロードしたものを使用することも可能です。

https://www.nxp.com/search?keyword=IMX_CST_TOOL_NEW

既にダウンロードしたCSTを使用している場合は、secureboot_x2/secureboot.confを以下のように修正してください。

以下では、ダウンロードしてきた CST( cst-[VERSION] )をホームディレクトリに配置していることを想定しています。

[ATDE ~]$ tar xaf IMX_CST_TOOL_NEW.tgz 1
[ATDE ~]$ ls
cst-[VERSION] :(省略)
[ATDE ~]$ cat ../secureboot_x2/secureboot.conf

:(省略)

# CST directory where signing keys are kept. Keep preciously!
#CST="$SCRIPT_DIR/cst"
CST="/home/atmark/cst-[VERSION]" 2

:(省略)

図5.5 ダウンロードした IMX_CST_TOOL_NEW を使用する


1

ダウンロードしたCSTのアーカイブを展開します。

2

展開したCSTディレクトリを絶対パスでCST変数に指定してください。

以上で環境構築は完了です。

5.5. セキュアブートおよびルートファイルシステム(rootfs)の暗号化

開発用 Armadillo に対してセキュアブートおよび rootfs を暗号化する流れは以下のとおりです。

[注記]

ビルドの全体的なプロセスフローについては 「ビルドのプロセスフロー」に図があります。

5.5.1. セキュアブートおよび rootfs の暗号化を行う SWU イメージの作成

secureboot.sh の secureboot_init を実行します。

この時に使用できるオプション引数は以下の通りです。

表5.4 secureboot_init の引数

オプション引数説明

--image

使用する Linux カーネルイメージを指定できます。絶対パスで指定してください。secureboot.conf 内の LINUX_IMAGE 変数で指定することもできます。

--initrd

署名および rootfs の暗号化時に使用する initrd を指定できます。絶対パスで指定してください。secureboot.conf 内の LINUX_INITRD 変数で指定することもできます。

--dtb

使用する dtb ファイルを指定できます。絶対パスで指定してください。secureboot.conf 内の LINUX_DTB 変数で指定することもできます。

--dtbo

使用する dtbo ファイルを指定できます。絶対パスで指定してください。secureboot.conf 内の LINUX_DTB_OVERLAYS_PREAPPLY 変数で指定することもできます。

--modules

使用する modules ディレクトリを指定できます。絶対パスで指定してください。secureboot.conf 内の LINUX_MODULES 変数で指定することもできます。


at-dtweb(Device Tree をカスタマイズするツール)を利用して作成した dtbo ファイルを使用する場合は以下のように指定してください。

ここでは、作成した dtbo ファイル( armadillo_iotg_g4-at-dtweb.dtbo )をホームディレクトリに配置したとします。

[ATDE ~/imx-boot-[VERSION]]$./secureboot.sh secureboot_init --dtbo /home/atmark
/armadillo_iotg_g4-at-dtweb.dtbo

図5.6 カスタマイズした dtbo ファイルを使用する場合


[注記]

at-dtweb についての説明は製品マニュアルをご参照ください。

オプション引数を指定せずに実行した場合は、デフォルトの dtb ファイルなどを使用します。 imx-boot-[VERSION] ディレクトリ下で以下のように secureboot_init を実行してください。

[ATDE ~/imx-boot-[VERSION]]$./secureboot.sh secureboot_init
Logging build outputs to /home/atmark/secureboot_x2/tmp/secureboot_init.log

Secure boot signing keys already setup

Building imx-boot (boot loader)...
make: ディレクトリ '/home/atmark/imx-boot' に入ります
fatal: No names found, cannot describe anything.
fatal: No names found, cannot describe anything.
wget "http://www.nxp.com/lgfiles/NMG/MAD/YOCTO"/firmware-imx-8.11.bin -O firmware-imx-8.11.bin
--2025-02-10 16:51:17--  http://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.11.bin
www.nxp.com (www.nxp.com) をDNSに問いあわせています... 23.34.103.180
www.nxp.com (www.nxp.com)|23.34.103.180|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1470673 (1.4M) [application/octet-stream]
`firmware-imx-8.11.bin' に保存中

firmware-imx-8.11.bin                                100%[=====================================================================================================================>]   1.40M  --.-KB/s 時間 0.1s

2025-02-10 16:51:17 (13.2 MB/s) - `firmware-imx-8.11.bin' へ保存完了 [1470673/1470673]

chmod +x firmware-imx-8.11.bin
/home/atmark/imx-boot/firmware-imx-8.11.bin  \
        || { rm -f firmware-imx-8.11.bin; echo "Extract failed, rerun make"; false; }
Welcome to NXP firmware-imx-8.11.bin

You need to read and accept the EULA before you can continue. 1

::(省略)

Do you accept the EULA you just read? (y/N) y 2
EULA has been accepted. The files will be unpacked at 'firmware-imx-8.11'

Unpacking file .......................................................................... done
make: ディレクトリ '/home/atmark/imx-boot' から出ます
Created /home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed

Signing linux image...
Created /home/atmark/secureboot_x2/out/Image.signed

Building initrd for mmc (first time is slow)
Signing linux image (mmc)...
Created /home/atmark/secureboot_x2/out/Image.signed-mmc

Building 1_write_srk_install_kernel.swu...
Enter pass phrase for /home/atmark/mkswu/swupdate.key: 3
Building 2_secureboot_close.swu...
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
Building 3_disk_encryption.swu...
Enter pass phrase for /home/atmark/mkswu/swupdate.key:


Please install SWU images in the following order:
 - /home/atmark/secureboot_x2/swu/1_write_srk_install_kernel.swu 4
 - /home/atmark/secureboot_x2/swu/2_secureboot_close.swu
 - /home/atmark/secureboot_x2/swu/3_disk_encryption.swu

1

NXP の EULA の承諾を求められる場合は、下矢印キーを押し続けてください。

2

下矢印キーが入力された場合は消した後、y を入力してください。

3

SWU イメージを3つ作成するので、パスワードの入力を3回求められます。

4

SWU イメージが3つ作成されます。

ビルド後に以下の SWU イメージが作られていることをご確認ください。

[ATDE ~/imx-boot-[VERSION]]$ ls ../secureboot_x2/swu/
1_write_srk_install_kernel.swu  2_secureboot_close.swu  3_disk_encryption.swu

図5.7 secureboot_init コマンドにより作成された SWU イメージ


これらの SWU イメージを Armadillo にインストールすることでセキュアブートの有効化およびストレージの暗号化を実現できます。

[重要項目]

secureboot.sh secureboot_init を実行して生成された鍵(cst/keys)は今後も利用するものです。 壊れにくい、セキュアなストレージにコピーしておくことをお勧めします。

[重要項目]

鍵の更新は計画性を持って行ってください。 たとえば開発時のみ利用する鍵、運用時に利用する鍵を使い分ける。 また、鍵は定期的に更新が必要です。以下を参考にしてください。

5.5.2. SWU イメージのインストール

secureboot.sh secureboot_init によって作成された SWU イメージは以下になります。

表5.5 生成された SWU イメージ

SWU イメージ名説明

1_write_srk_install_kernel.swu

署名されたブートローダーおよびlinuxカーネルイメージのインストール、SRKのハッシュの書き込みを行います。

2_secureboot_close.swu

セキュアブートの close 処理を行います。

3_disk_encryption.swu

rootfs (rootfs)の暗号化に対応したlinuxカーネルイメージのインストールを行います。


生成された SWU イメージを以下の順に Armadillo にインストールしてください。

  • 1_write_srk_install_kernel.swu
  • 2_secureboot_close.swu
  • 3_disk_encryption.swu

SWU イメージのインストール方法については製品マニュアルをご参照ください。

5.5.2.1. 1_write_srk_install_kernel.swu のインストール

1_write_srk_install_kernel.swu を Armadillo にインストールすることで以下の設定が行われます。

  • 署名されたブートローダーおよびLimux カーネルイメージのインストール
  • eFuse への SRK ハッシュの書き込み
  • ブートローダーにおいて CFG_ENV_FLAGS_LIST_STATIC で指定された環境変数以外の変更の禁止
  • ブートローダーのプロンプトの使用の禁止

1_write_srk_install_kernel.swu をインストールしただけでは、まだセキュアブートは有効になりません。

1_write_srk_install_kernel.swu が Armadillo に正常にインストールされた場合の起動ログを以下に示します。

:(省略)

Requesting system reboot 1
[ 3801.975472] imx2-wdt 30280000.watchdog: Device shutdown: Expect reboot!
[ 3801.982451] reboot: Restarting system

:(省略)

Secure boot disabled 2

HAB Configuration: 0xf0, HAB State: 0x66
No HAB Events Found! 3

## Loading kernel from FIT Image at 40480000 ...
   Using 'armadillo' configuration
   Trying 'kernel' kernel subimage
     Description:  linux kernel
     Created:      2025-02-13  10:13:01 UTC
     Type:         Kernel Image
     Compression:  zstd compressed
     Data Start:   0x404800cc
     Data Size:    10353399 Bytes = 9.9 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x80080000
     Entry Point:  0x80080000
   Verifying Hash Integrity ... OK

:(省略)

Starting kernel ...

:(省略)

図5.8 1_write_srk_install_kernel.swu をインストールした後の起動ログ


1

Armadillo を再起動します。

2

この時点ではまだセキュアブートは有効ではありません。

3

「No HAB Events Found!」が表示されていることをご確認ください。

5.5.2.2. 2_secureboot_close.swu のインストール

2_secureboot_close.swu を Armadillo にインストールすることで、close 処理が行われてセキュアブートが有効になります。 SRK ハッシュが書き込まれていない、もしくは /boot/Image が存在する場合はこの SWU イメージはインストール時にエラーになります。

[注記]

i.MX 8M plus 内にある SNVS (Secure Non-Volatile Storage) で利用される鍵は、 close 処理をしないとテスト用の鍵が使われます。 テスト用の鍵はデバイス間で共通なため、そのままでは簡単に復号できてしまいます。 close 処理を行うことで、デバイスに固有な鍵を利用するようになります。

以下、2_secureboot_close.swu が Armadillo に正常にインストールされた場合の起動ログを以下に示します。

:(省略)

Secure boot enabled 1

HAB Configuration: 0xcc, HAB State: 0x99
No HAB Events Found! 2

## Loading kernel from FIT Image at 40480000 ...
   Using 'armadillo' configuration
   Trying 'kernel' kernel subimage
     Description:  linux kernel
     Created:      2025-02-13  10:13:01 UTC
     Type:         Kernel Image
     Compression:  zstd compressed
     Data Start:   0x404800cc
     Data Size:    10353399 Bytes = 9.9 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x80080000
     Entry Point:  0x80080000
   Verifying Hash Integrity ... OK

:(省略)

Starting kernel ...

:(省略)

図5.9 2_secureboot_close.swu をインストールした後の起動ログ


1

セキュアブートが有効であることをご確認ください。

2

「No HAB Events Found!」が表示されていることをご確認ください。

5.5.2.3. 3_disk_encryption.swu のインストール

3_disk_encryption.swu を Armadillo にインストールすることで、ストレージが暗号化されます。

以下、3_disk_encryption.swu が Armadillo に正常にインストールされた場合の確認方法を以下に示します。

:(省略)

Starting kernel ...

:(省略)

Welcome to Alpine Linux 3.20
Kernel 5.10.233-0-at on an aarch64 (/dev/ttymxc1)

armadillo login: root 1
Password:
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.


Please note this system is READ-ONLY with a read-write overlayfs,
after updating password make sure to save new password with
# persist_file /etc/shadow

You can change this message by editing /etc/motd.
Last update on Mon Feb 17 11:26:14 JST 2025, updated:
  extra_os.secureboot_init: 2 -> 3
  boot_linux: 1 -> 3
armadillo:~# lsblk 2
NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
mmcblk2      179:0    0   9.8G  0 disk
├─mmcblk2p1  179:1    0   300M  0 part
├─mmcblk2p2  179:2    0   300M  0 part
│ └─rootfs_1 252:0    0   299M  0 crypt /live/rootfs 3

:(省略)

図5.10 3_disk_encryption.swu をインストールした後の確認方法


1

root にログインします。

2

lsblk コマンドを実行します。

3

/live/rootfs に crypt の表記があり、rootfs が暗号化されていることを確認できます。

5.6. 動作確認

5.6.1. セキュアブートの確認

Linux カーネルが起動することを確認してください。 Linux カーネルまで起動しない場合、uboot-imx のコマンドでHAB の状態を確認することができます。

Linux 起動まで正常な起動ログ

: (省略)
Booting from mmc ...

## Checking Image at 40480000 ...
Unknown image format!
53522 bytes read in 22 ms (2.3 MiB/s)

Authenticate image from DDR location 0x40480000...

Secure boot enabled 1

HAB Configuration: 0xcc, HAB State: 0x99
No HAB Events Found! 2

## Flattened Device Tree blob at 45000000
   Booting using the fdt blob at 0x45000000
   Using Device Tree in place at 0000000045000000, end 0000000045010111

Starting kernel ...
: (省略)

1

セキュアブートが有効な場合に表示されます

2

問題がない場合はイベントが表示されません

ブートローダーに問題がある場合の起動ログ

: (省略)
spl: ERROR:  image authentication unsuccessful
### ERROR ### Please RESET the board ###
: (省略)

Linux カーネルイメージに問題がある場合の起動ログ

: (省略)
Authenticate image from DDR location 0x40480000...
bad magic magic=0x14 length=0xa1 version=0x0
bad length magic=0x14 length=0xa1 version=0x0
bad version magic=0x14 length=0xa1 version=0x0
Error: Invalid IVT structure

Allowed IVT structure:
IVT HDR      = 0x4X2000D1
IVT ENTRY    = 0xXXXXXXXX
IVT RSV1      = 0x0
IVT DCD      = 0x0
IVT BOOT_DATA = 0xXXXXXXXX
IVT SELF      = 0xXXXXXXXX
IVT CSF      = 0xXXXXXXXX
IVT RSV2      = 0x0
Authenticate Image Fail, Please check 1
: (省略)

1

認証に失敗しています

u-boot コマンドの hab_status

問題がない場合

u-boot=> hab_status

Secure boot enabled

HAB Configuration: 0xcc, HAB State: 0x99
No HAB Events Found!

Linux カーネルイメージの署名確認で問題がある場合

u-boot=> hab_status

Secure boot disabled

HAB Configuration: 0xf0, HAB State: 0x66

--------- HAB Event 1 -----------------
event data:
        0xdb 0x00 0x14 0x45 0x33 0x0c 0xa0 0x00
        0x00 0x00 0x00 0x00 0x40 0x1f 0xdd 0xc0
        0x00 0x00 0x00 0x20

STS = HAB_FAILURE (0x33)
RSN = HAB_INV_ASSERTION (0x0C)
CTX = HAB_CTX_ASSERT (0xA0)
ENG = HAB_ENG_ANY (0x00)

5.7. 量産用 Armadillo のセキュアブートおよびストレージ暗号化

開発用 Armadillo のセキュアブートを実施した後、量産用の Armadillo に対してセキュアブートを設定する必要があります。 セキュアブートの設定は開発用 Armadillo の設定を引き継ぎます。 また、量産用 Armadillo では rootfs の他に コンテナイメージなどのアプリケーション領域の暗号化も行います。

以下にセキュアブートおよび rootfs とアプリケーション領域の暗号化に対応したインストールディスクイメージの作成手順を示します。

5.7.1. インストールディスクイメージ作成用の SWU イメージを生成する

secureboot.sh の make_installer オプションを使用します。 以下に示すオプション引数があります。

表5.6 make_installer の引数

オプション引数説明

--cn

インストールディスクイメージの改ざん防止のために内部で使用している openssl で使用します。 デフォルトでは 「Secure boot installer [ランダムな10桁の英数字]」 が使用されます。


以下のコマンドを実行してください。

[ATDE ~/imx-boot-[VERSION]]$./secureboot.sh make_installer
Logging build outputs to /home/atmark/secureboot_x2/tmp/make_installer.log

Downloading https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/image/baseos-x2-installer-latest.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  167M  100  167M    0     0  5480k      0  0:00:31  0:00:31 --:--:-- 14.7M

Building initrd for verity (first time is slow)
Signing linux image (verity)...
Created /home/atmark/secureboot_x2/out/Image.signed-verity

Building SWU...
Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1


Install following SWU image with an USB drive plugged in:
 - /home/atmark/secureboot_x2/swu/secureboot_make_installer.swu 2

図5.11 secureboot.sh make_installer の実行


1

SWUイメージを作成するためのパスワードを入力してください。

2

インストールディスクイメージ作成用の SWU イメージが生成されます。

secureboot_make_installer.swu が存在することをご確認ください。

atmark@atde9:~/imx-boot$ ls /home/atmark/secureboot_x2/swu/secureboot_make_installer.swu
/home/atmark/secureboot_x2/swu/secureboot_make_installer.swu

図5.12 secureboot.sh make_installer のよって作成された SWU イメージ


5.7.2. Armadillo に USBメモリを挿入

Armadillo に電源を投入し、インストールディスクを保存するための USB メモリを挿入してください。

[警告]

USB メモリは vfat もしくは ext4 形式でフォーマットし、空き容量が 10GB 以上のものを使用してください。

インストールディスクイメージは installer.img という名前で保存します。すでに同名のファイルが存在する場合は上書きされます。

5.7.3. インストールディスクイメージ作成用 SWU を Armadillo にインストールする

ABOS Web を使用して、生成した secureboot_make_installer.swu をインストールしてください。 実行時は ABOS Web 上に図5.13「secureboot_make_installer.swu インストール時のログ」ようなログが表示されます。

secureboot_make_installer.swu をインストールします。

SWU アップロード完了

SWUpdate v2024.12.0-git20250115-r0

Licensed under GPLv2. See source distribution for detailed copyright notices.

[INFO ] : SWUPDATE running : [print_registered_handlers] : no handler registered.

[INFO ] : SWUPDATE running : [main] : Running on iot-g4-es1 Revision at1

[INFO ] : SWUPDATE started : Software Update started !

[INFO ] : SWUPDATE running : [install_single_image] : Installing pre_script

[INFO ] : SWUPDATE running : [read_lines_notify] : No base os update: copying current os over

[INFO ] : SWUPDATE running : [read_lines_notify] : Waiting for btrfs to flush deleted subvolumes

[INFO ] : SWUPDATE running : [install_single_image] : Installing Copying installer to USB device

[INFO ] : SWUPDATE running : [install_single_image] : Installing swdesc_command_nochroot 'podman kill -a'

[INFO ] : SWUPDATE running : [install_single_image] : Installing swdesc_script_nochroot --stdout-info /home/atmark/secureboot_x2/swu/.secureboot_make_installer/secureboot_make_installer.sh

[INFO ] : SWUPDATE running : [read_lines_notify] : Secure boot enabled setting for production Armadillo is already set

[INFO ] : SWUPDATE running : [read_lines_notify] : ./

[INFO ] : SWUPDATE running : [read_lines_notify] : ./installer_verity_cert.pem

[INFO ] : SWUPDATE running : [read_lines_notify] : ./installer_verity_key.pem

[INFO ] : SWUPDATE running : [read_lines_notify] : ./sd_copy/

[INFO ] : SWUPDATE running : [read_lines_notify] : ./sd_copy/boot/

[INFO ] : SWUPDATE running : [read_lines_notify] : ./sd_copy/boot/Image

[INFO ] : SWUPDATE running : [read_lines_notify] : /target/mnt/installer.img-in-progress (436MB) was bigger than 338MB and was not truncated.

[INFO ] : SWUPDATE running : [read_lines_notify] : Checking if /target/mnt/installer.img-in-progress can be used safely...

[INFO ] : SWUPDATE running : [read_lines_notify] : Using installer image on image file.

[INFO ] : SWUPDATE running : [read_lines_notify] : Growing installer main partition

[INFO ] : SWUPDATE running : [read_lines_notify] : Resize device id 1 (/dev/loop0p1) from 394.00MiB to max

[INFO ] : SWUPDATE running : [read_lines_notify] : Environment OK, copy 1

[INFO ] : SWUPDATE running : [read_lines_notify] : Copying armadillo's root password to installer

[INFO ] : SWUPDATE running : [read_lines_notify] : Copying boot image

[INFO ] : SWUPDATE running : [read_lines_notify] : Installer will enable secure boot

[INFO ] : SWUPDATE running : [read_lines_notify] : Copying rootfs

[ERROR] : SWUPDATE failed [0] ERROR : awk: /proc/4442/mountinfo: No such file or directory

[INFO ] : SWUPDATE running : [read_lines_notify] : Copying /opt/firmware filesystem

[INFO ] : SWUPDATE running : [read_lines_notify] : Copying appfs

[INFO ] : SWUPDATE running : [read_lines_notify] : At subvol app/snapshots/volumes

[INFO ] : SWUPDATE running : [read_lines_notify] : At subvol app/snapshots/boot_volumes

[INFO ] : SWUPDATE running : [read_lines_notify] : At subvol app/snapshots/boot_containers_storage

[INFO ] : SWUPDATE running : [read_lines_notify] : Trying to shrink the installer partition...

[INFO ] : SWUPDATE running : [read_lines_notify] : Shrinking the installer partition...

[INFO ] : SWUPDATE running : [read_lines_notify] : Cleaning up and syncing changes to disk...

[INFO ] : SWUPDATE running : [read_lines_notify] : Trying to install btrfstune (btrfs-progs-extra) in memory from internet

[INFO ] : SWUPDATE running : [read_lines_notify] : fetch https://download.atmark-techno.com/alpine/v3.20/atmark/aarch64/APKINDEX.tar.gz

[INFO ] : SWUPDATE running : [read_lines_notify] : fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main/aarch64/APKINDEX.tar.gz

[INFO ] : SWUPDATE running : [read_lines_notify] : fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/community/aarch64/APKINDEX.tar.gz

[INFO ] : SWUPDATE running : [read_lines_notify] : (1/1) Installing btrfs-progs-extra (6.8.1-r1)

[INFO ] : SWUPDATE running : [read_lines_notify] : Executing busybox-1.36.1-r29.trigger

[INFO ] : SWUPDATE running : [read_lines_notify] : OK: 231 MiB in 197 packages

[INFO ] : SWUPDATE running : [read_lines_notify] : Computing verity hashes...

[INFO ] : SWUPDATE running : [read_lines_notify] : Installer updated successfully!

[INFO ] : SWUPDATE running : [read_lines_notify] : -rw------- 1 root root 415.0M Feb 17 17:00 /target/mnt/installer.img

[ERROR] : SWUPDATE failed [0] ERROR : Installer successfully created!

[ERROR] : SWUPDATE failed [0] ERROR : Failing update on purpose to allow re-install

[INFO ] : SWUPDATE running : [install_single_image] : Installing post_script

[INFO ] : SWUPDATE running : [read_lines_notify] : Removing unused containers

[INFO ] : SWUPDATE running : Installation in progress

[INFO ] : SWUPDATE successful ! SWUPDATE successful !

swupdate exited
インストールが成功しました。

図5.13 secureboot_make_installer.swu インストール時のログ


完了後、USBメモリを抜いてください。

無事に生成が完了した場合、USBメモリ上に installer.img が保存されています。 この installer.img を microSD に書き込むことでインストールディスクを作成することができます。

5.7.4. 開発環境を別の Armadillo に複製する

作成したインストールディスクイメージを microSD に書き込み、開発に使用した Armadillo 以外の個体にイントールします。

[注意]

インストール先の Armadillo の eMMC 内のデータは上書きされて消えるため、以下のディレクトリにある必要なデータは予めバックアップを取っておいてください。

  • /var/app
  • /var/log
  • container image

「インストールディスクイメージ作成用 SWU を Armadillo にインストールする」 の手順で使用した USB メモリの中に installer.img が保存されています。

ATDE 上で installer.img の microSD への書き込みを行う場合は、以下の手順に従ってインストールディスクを作成します。

  • PC に USB メモリを挿入してください。
  • VirtualBoxの左上のペインの [デバイス] → [USB] から、USB メモリを ATDE にマウントします。
  • ここではホームディレクトリにコピーします。
[ATDE ~] sudo cp /media/atmark/<USBをマウントしたディレクトリ>/installer.img ./

図5.14 ATDE に installer.img をコピーする


  • VirtualBoxの左上のペインの [デバイス] → [USB] から、USB メモリを ATDE にアンマウントします。
  • PC に microSD を挿入してください。
  • VirtualBoxの左上のペインの [デバイス] → [USB] から、microSD を ATDE にマウントします。
  • microSD を ATDE にマウントします。
  • installer.img を microSD に書き込みます。
[ATDE ~] mount 1
:(省略)
/dev/sd[X] on /media/atmark/rootfs_0 type btrfs (rw,nosuid,nodev,relatime,space_cache=v2,subvolid=5,subvol=/,uhelper=udisks2)
[ATDE ~] sudo umount /dev/sd[X] 2
[ATDE ~] sudo dd if=installer.img of=/dev/sd[X] bs=1M oflag=direct status=progress 3

図5.15 microSD に installer.img を書き込む


1

microSD が /dev/sd[X] として識別されていることを確認します。[X] は環境によって異なりますので、環境に合わせてください。

2

/dev/sd[X] をアンマウントします。

3

installer.img を microSD に書き込みます。

  • microSD を PC から抜いてください。

作成した microSD のインストールディスクによるインストール手順は製品マニュアルを参考にしてください。

5.7.5. 開発環境を複製した Armadillo の動作確認

開発環境を複製した Armadillo を起動します。 起動時のログは「セキュアブートの確認」をご参照ください。

Armadillo にログイン後、以下のコマンドを実行すると、rootfs 及び アプリケーション領域が暗号化されていることを確認できます。

armadillo:~# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
mmcblk2       179:0    0   9.8G  0 disk
├─mmcblk2p1   179:1    0   300M  0 part
│ └─rootfs_0  252:0    0   299M  0 crypt /live/rootfs 1
├─mmcblk2p2   179:2    0   300M  0 part
├─mmcblk2p3   179:3    0    50M  0 part
│ └─mmcblk2p3 252:1    0    49M  0 crypt /var/log 2
├─mmcblk2p4   179:4    0   200M  0 part
│ └─mmcblk2p4 252:2    0   199M  0 crypt /opt/firmware 3
└─mmcblk2p5   179:5    0     9G  0 part
  └─mmcblk2p5 252:3    0     9G  0 crypt /var/tmp 4
                                         /var/app/volumes
                                         /var/app/rollback/volumes
                                         /var/lib/containers/storage_readonly
:(省略)

図5.16 rootfs 及び アプリケーション領域が暗号化されていることを確認


1

crypt の表記があるので、rootfs が暗号化されています。

2 3 4

crypt の表記があるので、アプリケーション領域が暗号化されています。

5.8. セットアップ完了後のアップデートの運用

コンテナ内のアプリケーションのアップデートはセットアップとは関係なく、 とくに特別な対応なしで通常どおりの方法でアップデートが可能です。 製品マニュアルを参考にしてください。

署名済みブートローダーや Linux カーネルを更新する場合は以下の手順に従ってください。

5.8.1. 署名済みブートローダーの更新方法

以下のURLにおける「ブートローダー ソース(u-boot等)」から最新のブートローダーを取得してください。

Armadillo-IoT ゲートウェイ G4

https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4/boot-loader

Armadillo-X2

https://armadillo.atmark-techno.com/resources/software/armadillo-x2/boot-loader

ブートローダーのソースコードのアーカイブを展開します。 以降、このアーカイブをホームディレクトリに展開した想定で説明します。

[ATDE ~]$ tar xaf imx-boot-[VERSION].tar.gz 1

図5.17 最新のブートローダーのソースコードを展開する


1

アーカイブを展開します。[VERSION] はバージョンによって変化します。

secureboot_x2/imx-boot のシンボリックリンク元を最新のものにつけかえます。

[ATDE ~]$ rm -rf secureboot_x2/imx-boot 1
[ATDE ~]$ ln -s /home/atmark/imx-boot-[VERSION] /home/atmark/secureboot_x2/imx-boot 2

図5.18 最新のブートローダーのソースコードをシンボリックリンク元にする


1

シンボリックリンクを削除します。

2

imx-boot-[VERSION] をシンボリックリンク元として secureboot_x2/imx-boot のシンボリックリンクを作成します。

最新のブートローダーに署名を行います。

[ATDE ~]$ cd imx-boot-[VERSION]
[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh imxboot
Logging build outputs to /home/atmark/secureboot_x2/tmp/imxboot.log

Building imx-boot (boot loader)...
fatal: No names found, cannot describe anything.
fatal: No names found, cannot describe anything.
Created /home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed 1

図5.19 最新のブートローダーに署名する


1

最新のブートローダー対して署名したファイルが作成されます。

最新の署名済みブートローダーをインストールするための SWU イメージを作成します。

[ATDE ~/imx-boot-[VERSION]]$ cd ~/mkswu 1
[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/boot.desc . 2
[ATDE ~/mkswu]$ cat boot.desc
swdesc_boot "/home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed" 3
[ATDE ~/mkswu]$ mkswu boot.desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key: 4
boot.swu を作成しました。5
[ATDE ~/mkswu]$ mkswu --show boot.swu 6
# boot.swu

# Built with mkswu [mkswu のバージョン]
# signed by "atmark"

swdesc_boot  --version boot [VERSION] /home/atmark/secureboot_x2/out/imx-boot_armadillo_x2.signed

図5.20 最新の署名済みブートローダーを SWU イメージに組み込む


1

mkswu ディレクトリに移動します。

2

使用する desc ファイル(boot.desc)を mkswu ディレクトリにコピーします。

3

swdesc_boot の引数を最新の署名済みブートローダーのファイルパスに置き換えてください。

4

SWU イメージを作成するためのパスワードの入力を求められます。

5

boot.swu がカレントディレクトリに作成されます。

6

boot.swu の中身を表示します。[VERSION] が最新であることをご確認ください。

作成した boot.swu を Armadillo にインストールすることでブートローダーをアップデートできます。

5.8.2. 署名済み Linux カーネルの更新方法

署名済み Linux カーネル更新するために、secureboot.sh linux コマンドを使用します。

このコマンドは以下の状況の場合に最新の Linux カーネルの apk パッケージを自動で取得します。

  • secureboot_x2/tmp/linux_apk ディレクトリが存在せず、--image 及び --dtb 引数によって Linux カーネルイメージと dtb ファイルを指定していない

更新時には、既にsecureboot_x2/tmp/linux_apk ディレクトリが存在しているはずです。 最新の Linux カーネルを取得したいので、secureboot_x2/tmp/linux_apk ディレクトリのディレクトリ名を変更します。 バックアップの必要がなければ削除してください。

[ATDE ~]$ mv secureboot_x2/tmp/linux_apk secureboot_x2/tmp/linux_apk.old 1

図5.21 secureboot_x2/tmp/linux_apk のディレクトリ名を変更する


1

ディレクトリ名を変更します。

at-dtweb でカスタマイズした dtbo ファイルを署名する Linux カーネルイメージに組み込みたい場合は、secureboot.sh linux コマンド実行時に --dtbo でその dtbo ファイルの絶対パスを指定してください。

以下では、引数を指定せずに secureboot.sh linux コマンドを実行します。

[ATDE ~]$ cd imx-boot-[VERSION]
[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh linux
Logging build outputs to /home/atmark/secureboot_x2/tmp/linux.log

Downloading https://download.atmark-techno.com/armadillo-iot-g4/baseos/linux-at-x2-latest.apk 1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15.9M  100 15.9M    0     0  10.4M      0  0:00:01  0:00:01 --:--:-- 10.4M

Select which initrd to build: [none|plain|mmc|verity] 2
mmc 3
Building initrd for mmc (first time is slow)
Signing linux image (mmc)...
Created /home/atmark/secureboot_x2/out/Image.signed-mmc 4

図5.22 最新の Linux カーネルイメージに署名する


1

最新の Linux カーネルの apk の apk パッケージを取得します。

2

セキュアブート及びストレージの暗号化を行っている場合は mmc を、署名飲みを行っている場合は none または plain を選択してください。none の場合は initrd を使用しません。

3

ここでは、セキュアブート及びストレージの暗号化を行っている前提で mmc を選択します。

4

ストレージ暗号化対応の署名済み Linux カーネルイメージが作成されます。

SWU イメージを作成するための desc ファイルを作成します。

[ATDE ~/imx-boot-[VERSION]]$ cd ~/mkswu 1
[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/encrypted_rootfs_linux_update.desc . 2
[ATDE ~/mkswu]$ cat encrypted_rootfs_linux_update.desc 3
# This example is intended for users with ENCRYPTED_ROOTFS.
# Ignore it if not using encryped rootfs.

# version must be updated everytime like normal updates
swdesc_option version=[LATEST_VERSION] 4

# Image.signed is an a linux image with initrd built using
# imx-boot/secureboot.sh linux
swdesc_boot_linux "/home/atmark/secureboot_x2/out/Image.signed-mmc" 5

図5.23 最新の署名済み Linux カーネルイメージを SWU イメージに組み込む desc ファイルを作成する


1

mkswu ディレクトリに移動します。

2

作成した署名済み Linux カーネルイメージを SWU イメージに組み込むための desc ファイル(encrypted_rootfs_linux_update.desc)を mkswu ディレクトリにコピーします。

3

encrypted_rootfs_linux_update.desc の中身を表示します。

4

[LATEST_VERSION] は更新する際の最新のバージョンに書き換えてください。

5

作成した署名済み Linux カーネルイメージのパスをswdesc_boot_linux の引数に指定してください。

SWU イメージを作成します。

[ATDE ~/mkswu]$ mkswu encrypted_rootfs_linux_update.desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1
encrypted_rootfs_linux_update.swu を作成しました。2
[ATDE ~/mkswu]$ mkswu --show encrypted_rootfs_linux_update.swu 3
# encrypted_rootfs_linux_update.swu

# Built with mkswu [mkswu のバージョン]
# signed by "atmark"

swdesc_boot_linux  --version boot_linux [LATEST_VERSION] /home/atmark/secureboot_x2/out/Image.signed-mmc

図5.24 最新の署名済み Linux カーネルイメージが組み込まれた SWU イメージを作成する


1

SWU イメージを作成するためのパスワードの入力を求められます。

2

encrypted_rootfs_linux_update.swu がカレントディレクトリに作成されます。

3

encrypted_rootfs_linux_update.swu の中身を表示します。[LATEST_VERSION] が最新であることをご確認ください。

作成した encrypted_rootfs_linux_update.swu を Armadillo にインストールすることで Linux カーネルイメージをアップデートできます。

5.9. 補足情報

5.9.1. secureboot.conf の設定方法

secureboot.conf はセキュアブートイメージ生成スクリプト secureboot.sh の設定ファイルです。以下はコンフィグの一部です。

CST_ECC

既存の CA 証明書を利用するかどうかを設定する

  • y: EC を利用する
  • n: RSA を利用する
CST_KEYLEN, CST_KEYTYPE
鍵長を設定する

表5.7 セキュアブート用の鍵の種類

AlgorithmCST_KEYLENCST_KEYTYPE

RSA 1024

1024

1024_65537

RSA 2048

2048

2048_65537

RSA 3072

3072

3072_65537

RSA 4096

4096

4096_65537

EC NIST P-256

p256

prime256v1

EC NIST P-384

p384

secp384r1

EC NIST P-521

p521

secp521r1


CST_SOURCE_INDEX
SRK は最大 4 本まで持つことができます。この設定ではどの SRK を利用するのか設定します。 設定値は 0 はじまりで、0 がデフォルトです。
CST_UNLOCK_SRK
SRK のリボーク時に利用します。デフォルト設定では攻撃や事故の防止のために、 リボークができない状態になっています。#CST_UNLOCK_SRK=y のコメントを外すことで リボークが可能な状態になります。
LINUX_IMAGE,LINUX_DTB
FIT イメージに組み込むための Linux kernel イメージとデバイスツリーブロブ (DTB) の絶対パス。
LINUX_DTB_OVERLAYS
Linux 向けの Device tree オーバーレイ用ファイルを組み込むために利用する。いったん、Linux の device mapper を利用してルートファイルシステムを暗号化してしまうと、ブートローダーでは鍵がないとファイルを読むことができない。そのために FIT イメージに組み込んでおくためのオプション。/boot/overlays.conf にも同様の修正を加えてください。 以下は例です。組み込みたいファイルを追加してください。
LINUX_DTB_OVERLAYS=(
        armadillo_iotg_g4-nousb.dtbo
        armadillo_iotg_g4-sw1-wakeup.dtbo
)
LINUX_INITRD
暗号化されたルートファイルシステムを復号するための処理を行うための initrd の絶対パス。encrypted boot を利用しない場合には設定は不要です。

5.9.2. 署名済みイメージと展開先

以下にブートローダーの署名済みイメージと展開先についての例を示します。緑色の部分が BootROM によって署名検証される部分、橙色の部分は SPL によって署名検証される部分になります。

./images/memmap_secureboot_spl.png

図5.25 ブートローダーの署名済みイメージ


./images/memmap_encryptedboot_spl.png

図5.26 暗号化ブートローダーの署名済みイメージ


Linux の署名済みイメージと展開先の例は以下のとおりです。水色の部分は U-Boot によって署名検証される部分になります。

./images/memmap_secureboot_linux.png

図5.27 Linux カーネルの署名済みイメージ


./images/memmap_storage_encryption.svg

図5.28 ストレージ暗号化に対応した Linux カーネルの署名済みイメージ


5.9.3. セキュアブートのフロー

以下に SPL (Secondary Program Loader) のブートフローの概要を示します。点線で囲っている部分はセキュアブートで有効になる処理です。

./images/spl_boot_sequence.png

図5.29 SPL セキュアブートのフロー


U-Boot のブートフローの概要は以下のとおりです。SPL と同様に点線で囲っている部分はセキュアブートで有効になる処理です。

./images/u-boot_boot_sequence.png

図5.30 U-Boot セキュアブートのフロー


5.9.4. ビルドのプロセスフロー

./images/build-flow_storage-encryption.svg

図5.31 セキュアブートのビルドフロー


5.9.5. ファームウェアアップデートのフロー

./images/update-flow_secureboot.svg

図5.32 ファームウェアアップデートのフロー


5.9.6. SRK の無効化と切り替え

何らかのインシデント対応による鍵更新、また、鍵の定期更新などが必要な場合、その時点で利用している鍵を無効化して、別の鍵に切り替えることが可能です。ただし、その場合は複数 (i.MX 8M Plus の場合、最大 4 つ) の SRK が書かれていることが前提となります。

5.9.6.1. SRK の無効化 (revocation)

ここでは SRK1 (index 0) から SRK2 (index 1) に変更する例を説明します。

  1. secureboot.conf の revocation のロックを解除する設定を有効にします

    デフォルトでは eFuse の revoke レジスタはロックされているので書き込みできません。 ロックは HAB の設定で解除することができます。常にロックを解除すると攻撃者に 悪用される可能性があるので通常はロックされるべきです。

    imx-boot-[VERSION}/secureboot.conf を開いて、CST_UNLOCK_SRK=y のコメントを 外してください。 secureboot.conf の詳細については 「secureboot.conf の設定方法」 を参照してください。

    [ATDE ~]$ vi imx-boot-[VERSION]/secureboot.conf
  2. 署名済みイメージを書き込む

    環境に合わせて、署名済みか、暗号化+署名済みのイメージを作成して、 イメージを書き込んでください。

  3. 再起動
  4. Unlock を確認する

    再起動時の uboot-imx のプロンプトを立ち上げてレジスタ値を確認します。 以下のコマンドを実行してください。bit1 (SRK_REVOKE_LOCK) が落ちていると Unlock 状態です。

    u-boot=> md 0x30350050 1
    30350050: 00007dbc 1

    1

    7dbc の bit 1 が落ちているので unlock 状態

  5. SRK を無効化する

    ビットフィールドはビットは 0 はじまりで、鍵の番号は 1 はじまり (1,2,3,4) になります。 bit0 が SRK1、bit1 が SRK2、bit2 が SRK3、bit3 が SRK4 です。

    [注意]

    以下のコマンドはあくまで例なので、そのまま実行しないで下さい。

    SRK1 を無効化する場合は以下のコマンドを実行してください。最終引数が無効化する鍵の設定値です。

    u-boot=> fuse prog 9 3 1

5.9.6.2. SRK の切り替え

ここでは SRK1 (index 0) から SRK2 (index 1) に変更する例を説明します。

  1. SRK の変更

    secureboot.conf の CST_SOURCE_INDEX を 0 から 1 に変更してください。 secureboot.conf の詳細については 「secureboot.conf の設定方法」 を参照してください。

    [ATDE ~]$ vi imx-boot-[VERSION]/secureboot.conf
  2. 再署名する

    環境に合わせて、署名済みか、暗号化+署名済みのイメージを作成して、 イメージを書き込んでください。