導入編

3.1. 署名環境を構築する

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

3.2. 署名環境について

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

表3.1 署名環境

ツール/パッケージ説明

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-900

開発環境・ツール

Armadillo-IoT ゲートウェイ A9E

開発環境・ツール

imx-boot-[VERSION].tar.gz

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

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

Armadillo-900

ブートローダー

Armadillo-IoT ゲートウェイ A9E

ブートローダー

baseos-[VERSION].tar.zst

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

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

Armadillo-900

製品ソフトウェア

Armadillo-IoT ゲートウェイ A9E

製品ソフトウェア


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

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

3.2.2. ATDE を準備する

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

3.2.3. mkswu を準備する

mkswu は SWUpdate に対応したアップデートファイルを生成するツールです。 開発環境である ATDE にインストールされています。

あらかじめ、mkswu を用いて生成した initial_setup.swu を Armadillo にインストールする必要があります。 詳しくは製品マニュアルをご参照ください。

[注記]

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

[重要項目]

SWU イメージの暗号化

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

initial_setup.swu を作成するときに SWU イメージを暗号化する設定を行うことができます。 詳しくは製品マニュアルをご参照ください。

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

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

図3.1 mkswu のバージョン確認


3.2.4. セキュアブートの有効化及びストレージの暗号化に必要なスクリプトの取得

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

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

[注記]

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

  • imx-boot-2023.04-at5.tar.gz

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

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

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


1

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

2

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

3.2.5. セキュアブートの有効化及びストレージ暗号化に使用するスクリプトの説明

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

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

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

オプション説明

setup

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

build

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

make_installer

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

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

3.2.6. 実行環境の生成

以下のように、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_a900/build-rootfs to /home/atmark/secureboot_a900/build-rootfs-[VERSION]
OK: Linking /home/atmark/secureboot_a900/imx-boot to /home/atmark/imx-boot-[VERSION]
Setup /home/atmark/secureboot_a900 successfully. Run './secureboot.sh build' next. 2

図3.3 secureboot.sh setup の実行


1

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

2

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

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

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

secureboot_a900
├── build-rootfs -> /home/atmark/secureboot_a900/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-[VERSION]/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_a900/secureboot.confを以下のように修正してください。

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

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

:(省略)

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

:(省略)

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


1

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

2

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

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

3.2.7. secureboot.conf の設定方法

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

CST_ECC

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

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

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

AlgorithmCST_KEYLENCST_KEYTYPE

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_DIGEST_ALG
SRK の生成時に使用するハッシュ関数を設定します。 sha256, sha384, sha512 のいずれかを設定できます。
CST_SOURCE_INDEX
SRK は最大 4 本まで持つことができます。この設定ではどの SRK を利用するのか設定します。 設定値は 0 はじまりで、0 がデフォルトです。
LINUX_IMAGE,LINUX_DTB
FIT イメージに組み込むための Linux カーネルイメージとデバイスツリーブロブ (DTB) のパスを指定します。
LINUX_DTB_OVERLAYS_PREAPPLY
DTB に直接適用するデバイスツリーオーバーレイ(DTBO)ファイルを指定します。 指定方法の例を示します。
LINUX_DTB_OVERLAYS_PREAPPLY=(
        armadillo_iotg_a9e.dtbo
        armadillo_iotg_a9e-sim7672.dtbo
)
LINUX_MODULES
必要であればインストールする Linux modules のパスを指定します。
LINUX_INITRD
必要であればインストールする initrd のパスを指定します。

3.3. セキュアブートの有効化及びルートファイルシステム(rootfs)の暗号化

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

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

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

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

表3.4 build の引数

オプション引数説明

--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 変数で指定することもできます。


例えば、Armadillo-IoT ゲートウェイ A9E の場合、at-dtweb(Device Tree をカスタマイズするツール)を利用して dtbo ファイルを作成できます。 その dtbo ファイルを使用する場合は以下のように指定してください。

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

[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh build \
    --dtbo /home/atmark/armadillo_iotg_a9e-at-dtweb.dtbo

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


[注記]

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

もしくは、secureboot_a900/secureboot.conf でも使用する dtbo ファイルを指定できます。 例えば、以下のように設定します。

[ATDE ~/imx-boot-[VERSION]]$ code ~/secureboot_a900/secureboot.conf

::(省略)
LINUX_DTB_OVERLAYS_PREAPPLY=(
    armadillo_iotg_a9e.dtbo
    armadillo_iotg_a9e-sim7672.dtbo
)
::(省略)

図3.6 secureboot.conf で dtbo ファイルを設定する場合


secureboot.conf で dtbo ファイルを指定した場合は、imx-boot-[VERSION] ディレクトリで以下のように build を実行してください。

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

::(省略)

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

::(省略)

Created /home/atmark/secureboot_a900/out/imx-boot_armadillo-900.signed

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

Building initrd for mmc (first time is slow)
Signing linux image (mmc)...
Created /home/atmark/secureboot_a900/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_a900/swu/1_write_srk_install_kernel.swu 4
 - /home/atmark/secureboot_a900/swu/2_secureboot_close.swu
 - /home/atmark/secureboot_a900/swu/3_disk_encryption.swu

1

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

2

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

3

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

4

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

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

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

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


これらの SWU イメージを Armadillo にインストールすることでセキュアブートの有効化および Armadillo Base OS が保存されている rootfs パーティションの暗号化を実現できます。

[重要項目]

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

参考までに上記の3つの SWU イメージが生成されるまでの流れを以降に示します。

images/common-images/introduction/1_write_srk_install_kernel_swu.png

図3.8 1_write_srk_install_kernel.swu を生成するまでの流れ


images/common-images/introduction/2_secureboot_close_swu.png

図3.9 2_secureboot_close.swu を生成するまでの流れ


images/common-images/introduction/3_disk_encryption_swu.png

図3.10 3_disk_encryption.swu を生成するまでの流れ


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

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

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

SWU イメージ名説明

1_write_srk_install_kernel.swu

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

2_secureboot_close.swu

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

3_disk_encryption.swu

ルートファイルシステム(rootfs)を暗号化します。暗号化に対応した Linux カーネルイメージもインストールします。


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

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

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

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

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

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

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

1_write_srk_install_kernel.swu が Armadillo に正常にインストールされた場合、SRK のハッシュが書き込まれていることを以下のコマンドで確認できます。

[armadillo ~]# device-info -f secureboot
secureboot configured (not enforced) 1

図3.11 SRK ハッシュが書き込まれていることを確認する


1

SRK のハッシュは書き込まれていますが、セキュアブートはまだ有効ではないことを示しています。

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

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

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

U-Boot SPL [VERSION]
Normal Boot
: (省略)

Authenticate OS container at 0x80400000 1
Booting from mmc ...
Can't set block device
## Loading kernel from FIT Image at 98000000 ...
   Using 'armadillo' configuration
   Trying 'kernel' kernel subimage
     Description:  linux kernel
     Created:      2025-06-10   5:25:20 UTC
     Type:         Kernel Image
     Compression:  zstd compressed
     Data Start:   0x980000cc
     Data Size:    10421516 Bytes = 9.9 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x85800000
     Entry Point:  0x85800000
   Verifying Hash Integrity ... OK
:(省略)

Starting kernel ... 2

:(省略)

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


1

セキュアブートが有効である場合に表示されます。

2

カーネルが起動することをご確認ください。

以下のコマンドでもセキュアブートが有効であることを確認できます。

[armadillo ~]# device-info -f secureboot
secureboot configured

図3.13 セキュアブートが有効であることを確認する


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

3_disk_encryption.swu を Armadillo にインストールすることで、Armadillo Base OS が保存されている rootfs パーティションが暗号化されます。

[重要項目]

他のパーティション(log やコンテナやアプリケーションが保存されている appfs)は SWU によって暗号化できませんので、そちらも暗号化したい場合は 4章量産編 の手順が完了した後にインストールして有効化してください。

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

:(省略)

Starting kernel ...

:(省略)

Welcome to Alpine Linux 3.21
Kernel 5.10.237-0-at on an aarch64 (/dev/ttyLP0)

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
mmcblk0       179:0    0   3.6G  0 disk
├─mmcblk0p1   179:1    0   301M  0 part
│ └─rootfs_0  252:0    0   300M  0 crypt /live/rootfs 3

:(省略)

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


1

root にログインします。

2

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

3

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

3.4. セキュアブートが有効になっているかの確認

Linux カーネルが起動することを確認してください。

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

U-Boot SPL [VERSION]
Normal Boot
: (省略)

Authenticate OS container at 0x80400000
Booting from mmc ...
Can't set block device
## Loading kernel from FIT Image at 98000000 ...
   Using 'armadillo' configuration
   Trying 'kernel' kernel subimage
     Description:  linux kernel
     Created:      2025-06-10   5:25:20 UTC
     Type:         Kernel Image
     Compression:  zstd compressed
     Data Start:   0x980000cc
     Data Size:    10421516 Bytes = 9.9 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x85800000
     Entry Point:  0x85800000
   Verifying Hash Integrity ... OK
## Loading ramdisk from FIT Image at 98000000 ...
   Using 'armadillo' configuration
   Trying 'ramdisk' ramdisk subimage
     Description:  initrd
     Created:      2025-06-10   5:25:20 UTC
     Type:         RAMDisk Image
     Compression:  uncompressed
     Data Start:   0x989f32a4
     Data Size:    3771738 Bytes = 3.6 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: unavailable
     Entry Point:  unavailable
   Verifying Hash Integrity ... OK
## Loading fdt from FIT Image at 98000000 ...
   Using 'armadillo' configuration
   Trying 'fdt' fdt subimage
     Description:  fdt
     Created:      2025-06-10   5:25:20 UTC
     Type:         Flat Device Tree
     Compression:  zstd compressed
     Data Start:   0x989f0670
     Data Size:    11190 Bytes = 10.9 KiB
     Architecture: AArch64
     Load Address: 0x83000000
   Verifying Hash Integrity ... OK
   Loading fdt from 0x989f0670 to 0x83000000
   Uncompressing Flat Device Tree
   Booting using the fdt blob at 0x83000000
Working FDT set to 83000000
   Uncompressing Kernel Image
   Loading Ramdisk to 8fc67000, end 8ffffd5a ... OK
   Using Device Tree in place at 0000000083000000, end 000000008300de97
Working FDT set to 83000000
Delete node /soc@0/bus@2d800000/epdc@2db30000
Delete node /soc@0/bus@2d800000/epxp@2db40000

Starting kernel ...
:(省略)

ブートローダーに問題がある場合

署名が正しくない場合は起動ログを出力しません。

Linux カーネルイメージに問題がある場合

署名が正しくない場合の起動ログの例

: (省略)
Authenticate OS container at 0x80400000
Error: ahab_auth_oem_ctnr: ret -5, cntr_addr 0x22010000, response 0x7aa4ff29 1

1

認証に失敗しています