ここで利用する署名環境の構成は以下のとおりです。
表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 のガイドに準拠しています。
詳しい仕様は以下を参照してください。
取得したソースツリー内にドキュメントがあります。
mkswu は SWUpdate に対応したアップデートファイルを生成するツールです。
開発環境である ATDE にインストールされています。
あらかじめ、mkswu を用いて生成した initial_setup.swu を Armadillo にインストールする必要があります。
詳しくは製品マニュアルをご参照ください。
![[注記]](images/note.png) | |
---|
セキュアブート有効化に対応する mkswu は 4.0-1 以上になります。 |
![[重要項目]](images/important.png) | |
---|
SWU イメージの暗号化 SWU イメージはデフォルト設定では暗号化されません。
通信路は TLS で守られても、ファイルで保管されているときには平文なので
SWU イメージ内にある機密情報が漏洩する可能性があります。
SWU イメージに漏洩すると問題のある情報資産を含めるときには必ず暗号化するべきです。 initial_setup.swu を作成するときに SWU イメージを暗号化する設定を行うことができます。
詳しくは製品マニュアルをご参照ください。 |
バージョンの確認方法は以下のとおりです。
3.2.4. セキュアブートの有効化及びストレージの暗号化に必要なスクリプトの取得
以下のURLから「ブートローダー ソース(u-boot等)」を取得してください。
取得したアーカイブ内にセキュアブートの有効化およびストレージ暗号化に必要なスクリプトが含まれています。
![[注記]](images/note.png) | |
---|
本書作成時点で利用したパッケージは以下のとおりです。 -
imx-boot-2020.04-at26.tar.gz
|
ブートローダーのソースコードのアーカイブを展開します。
以降、このアーカイブをホームディレクトリに展開した想定で説明します。
|
[VERSION] はバージョンによって変化します
|
|
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 の環境の複製
|
以下のように、imx-boot-[VERSION] 上で secureboot.sh の setup オプションを実行してください。
|
Enterを押すと、CST の Linux パッケージをインストールします。
|
|
secureboot_x2 ディレクトリが作成されます。
|
imx-boot-[VERSION] ディレクトリと同じ階層に secureboot_x2 ディレクトリが作成されます。
デフォルトでは、secureboot_x2 ディレクトリ内は以下の構成になっています。
secureboot_x2
├── build-rootfs -> /home/atmark/secureboot_x2/build-rootfs-[VERSION]
├── build-rootfs-[VERSION]
├── cst
├── imx-boot -> /home/atmark/imx-boot-[VERSION]
├── out
├── secureboot.conf
├── secureboot.sh -> /home/atmark/imx-boot-[VERSION]/secureboot.sh
└── swu
└── tmp 
|
シンボリックリンク元が使用する build-rootfs ディレクトリになります。
|
|
build-rootfs-[VERSION] が imx-boot-[VERSION] と同じ階層になければダウンロードします。
|
|
CSTによって生成された鍵などが配置されます。
|
|
シンボリックリンク元が使用する imx-boot ディレクトリになります。
|
|
Linuxカーネルおよびブートローダーのイメージが配置されます。
|
|
secureboot.sh の設定ファイルです。imx-boot-[VERSION]/secureboot.conf.example からコピーされます。
|
|
シンボリックリンク元が使用する secureboot.sh になります。
|
|
セキュアブートの有効化およびストレージ暗号化を行うための SWU イメージが配置されます。
|
|
secureboot.sh を実行した時に生成される一時ファイルが配置されます。
|
![[注記]](images/note.png) | |
---|
CST(Code Signing Tool)はNXPからソースコードをダウンロードしたものを使用することも可能です。 https://www.nxp.com/search?keyword=IMX_CST_TOOL_NEW 既にダウンロードしたCSTを使用している場合は、secureboot_x2/secureboot.confを以下のように修正してください。 以下では、ダウンロードしてきた CST( cst-[VERSION] )をホームディレクトリに配置していることを想定しています。
|
ダウンロードしたCSTのアーカイブを展開します。
|
|
展開したCSTディレクトリを絶対パスでCST変数に指定してください。
|
|
以上で環境構築は完了です。
3.2.7. secureboot.conf の設定方法
secureboot.conf はセキュアブートイメージ生成スクリプト secureboot.sh
の設定ファイルです。以下はコンフィグの一部です。
-
CST_ECC
既存の CA 証明書を利用するかどうかを設定します。
-
CST_KEYLEN, CST_KEYTYPE
-
鍵長を設定する
表3.3 セキュアブート用の鍵の種類
Algorithm | CST_KEYLEN | CST_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 )をホームディレクトリに配置したとします。
![[注記]](images/note.png) | |
---|
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.
::(省略)
Do you accept the EULA you just read? (y/N) y
::(省略)
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:
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
- /home/atmark/secureboot_x2/swu/2_secureboot_close.swu
- /home/atmark/secureboot_x2/swu/3_disk_encryption.swu
|
NXP の EULA の承諾を求められる場合は、下矢印キーを押し続けてください。
|
|
下矢印キーが入力された場合は消した後、y を入力してください。
|
|
SWU イメージを3つ作成するので、パスワードの入力を3回求められます。
|
|
SWU イメージが3つ作成されます。
|
ビルド後に以下の SWU イメージが作られていることをご確認ください。
これらの SWU イメージを Armadillo にインストールすることでセキュアブートの有効化および Armadillo Base OS が保存されている rootfs パーティションの暗号化を実現できます。
![[重要項目]](images/important.png) | |
---|
secureboot.sh build を実行して生成された鍵(cst/keys)は今後も利用するものです。
壊れにくい、セキュアなストレージにコピーしておくことをお勧めします。 |
![[重要項目]](images/important.png) | |
---|
鍵の更新は計画性を持って行ってください。
たとえば開発時のみ利用する鍵、運用時に利用する鍵を使い分ける。
また、鍵は定期的に更新が必要です。以下を参考にしてください。 |
参考までに上記の3つの 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 に正常にインストールされた場合の起動ログを以下に示します。
|
Armadillo を再起動します。
|
|
この時点ではまだセキュアブートは有効ではありません。
|
|
「No HAB Events Found!」が表示されていることをご確認ください。
|
SRK のハッシュが書き込まれていることを以下のコマンドで確認できます。
|
SRK のハッシュは書き込まれていますが、セキュアブートはまだ有効ではないことを示しています。
|
3.3.2.2. 2_secureboot_close.swu のインストール
2_secureboot_close.swu を Armadillo にインストールすることで、close 処理が行われてセキュアブートが有効になります。
SRK ハッシュが書き込まれていない、もしくは /boot/Image が存在する場合はこの SWU イメージはインストール時にエラーになります。
以下、2_secureboot_close.swu が Armadillo に正常にインストールされた場合の起動ログを以下に示します。
|
セキュアブートが有効であることをご確認ください。
|
|
「No HAB Events Found!」が表示されていることをご確認ください。
|
以下のコマンドでもセキュアブートが有効であることを確認できます。
3.3.2.3. 3_disk_encryption.swu のインストール
3_disk_encryption.swu を Armadillo にインストールすることで、Armadillo Base OS が保存されている rootfs パーティションが暗号化されます。
![[重要項目]](images/important.png) | |
---|
他のパーティション(log やコンテナやアプリケーションが保存されている appfs)は SWU によって暗号化できませんので、そちらも暗号化したい場合は 4章量産編 の手順が完了した後にインストールして有効化してください。 |
以下、3_disk_encryption.swu が Armadillo に正常にインストールされた場合の確認方法を以下に示します。
|
root にログインします。
|
|
lsblk コマンドを実行します。
|
|
/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
HAB Configuration: 0xcc, HAB State: 0x99
No HAB Events Found!
## Flattened Device Tree blob at 45000000
Booting using the fdt blob at 0x45000000
Using Device Tree in place at 0000000045000000, end 0000000045010111
Starting kernel ...
: (省略)
|
セキュアブートが有効な場合に表示されます
|
|
問題がない場合はイベントが表示されません
|
ブートローダーに問題がある場合の起動ログの例
: (省略)
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
: (省略)
|
認証に失敗しています
|
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)