導入編

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

開発環境・ツール

Armadillo-IoT ゲートウェイ G4

開発環境・ツール

imx-boot-[VERSION].tar.gz

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

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

Armadillo-X2

ブートローダー

Armadillo-IoT ゲートウェイ G4

ブートローダー

baseos-[VERSION].tar.zst

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

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

Armadillo-X2

製品ソフトウェア

Armadillo-IoT ゲートウェイ G4

製品ソフトウェア


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-2020.04-at26.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_x2 ディレクトリを作成します。

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_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 build' next. 2

図3.3 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-[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_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

:(省略)

図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 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 カーネルイメージとデバイスツリーブロブ (DTB) のパスを指定します。
LINUX_DTB_OVERLAYS_PREAPPLY
DTB に直接適用するデバイスツリーオーバーレイ(DTBO)ファイルを指定します。 指定方法の例を示します。
LINUX_DTB_OVERLAYS_PREAPPLY=(
        armadillo_iotg_g4-aw-xm458.dtbo
        armadillo_iotg_g4-lte-ext-board.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 変数で指定することもできます。


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

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

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

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


[注記]

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

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

[ATDE ~/imx-boot-[VERSION]]$ ./secureboot.sh build
Logging build outputs to /home/atmark/secureboot_x2/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_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

図3.6 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.7 1_write_srk_install_kernel.swu を生成するまでの流れ


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

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


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

図3.9 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 に正常にインストールされた場合の起動ログを以下に示します。

:(省略)

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

:(省略)

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


1

Armadillo を再起動します。

2

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

3

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

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 に正常にインストールされた場合の起動ログを以下に示します。

:(省略)

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

:(省略)

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


1

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

2

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

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

[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.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

:(省略)

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


1

root にログインします。

2

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

3

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

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

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)