

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS IoT over-the-air (OTA) 更新ライブラリの移植
<a name="afr-porting-ota"></a>

FreeRTOS 無線通信経由 (OTA) 更新を使用すると、次の操作を実行できます。
+ 新しいファームウェアイメージを単一のデバイス、デバイスのグループ、またはフリート全体に展開します。
+ グループに追加、リセット、または再プロビジョニングされると、デバイスにファームウェアを展開します。
+ 新しいファームウェアがデバイスに導入された後、そのファームウェアの信頼性と完全性を検証します。
+ デプロイの進行状況をモニタリングします。
+ 失敗したデプロイをデバッグします。
+ Code Signing for を使用してファームウェアにデジタル署名します AWS IoT。

詳細については、「FreeRTOS ユーザーガイド」の「[FreeRTOS 無線通信経由更新](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-ota-dev.html)」と [AWS IoT 無線通信経由更新に関するドキュメント](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html)を参照してください。

OTA 更新ライブラリを使用して、OTA の機能を FreeRTOS アプリケーションに統合できます。詳細については、[FreeRTOS ユーザーガイド](https://docs.aws.amazon.com/freertos/latest/userguide/ota-update-library.html)の *FreeRTOS OTA 更新ライブラリ*を参照してください。

FreeRTOS デバイスは、受信した OTA ファームウェアイメージに対して暗号化コード署名検証を実行する必要があります。以下のアルゴリズムを推奨します。
+ 楕円曲線デジタル署名アルゴリズム (ECDSA)
+ NIST P256 曲線
+ SHA-256 ハッシュ

## 前提条件
<a name="porting-prereqs-ota"></a>
+ [移植のためのワークスペースとプロジェクトの設定](porting-set-up-project.md) の手順を完了させます。
+ ネットワークトランスポートインターフェイスポートを作成します。

  詳細については、「[ネットワークトランスポートインターフェイスの移植](afr-porting-network-transport-interface.md)」を参照してください。
+ coreMQTT ライブラリを統合します。詳細については、「FreeRTOS ユーザーガイド」の「[coreMQTT ライブラリ](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)」を参照してください。
+ OTA 更新をサポートするブートローダーを作成します。

## プラットフォームの移植
<a name="porting-steps-ota"></a>

OTA ライブラリを新しいデバイスに移植するには、OTA ポータブル抽象化レイヤー (PAL) を実装する必要があります。PAL API は、実装固有の詳細を指定する必要がある [ota\$1platform\$1interface.h](https://github.com/aws/ota-for-aws-iot-embedded-sdk/blob/main/source/include/ota_platform_interface.h) ファイルで定義されています。


| 関数名 | 説明 | 
| --- | --- | 
| `otaPal_Abort` | OTA 更新を停止させます。 | 
| `otaPal_CreateFileForRx` | 受信したデータチャンクを保存するファイルを作成します。 | 
| `otaPal_CloseFile` | 指定されたファイルを閉じます。暗号保護を実装するストレージを使用している場合、これによってファイルが認証される可能性があります。 | 
| `otaPal_WriteBlock` | 指定されたファイルに、指定されたオフセットでデータブロックを書き込みます。成功すると、関数によって書き込まれたバイト数が返されます。その他の場合は、関数によって負のエラーコードが返されます。ブロックのサイズは常に 2 の累乗でアラインされます。詳細については、[OTA ライブラリの「Configurations」](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_config.html)を参照してください。 | 
| `otaPal_ActivateNewImage` | 新しいファームウェアイメージをアクティブ化または起動します。一部のポートでは、デバイスがプログラム的に同期的にリセットされると、この関数は戻りません。 | 
| `otaPal_SetPlatformImageState` | 最新の OTA ファームウェアイメージ (またはバンドル) を受け入れるか拒否するためにプラットフォームで必要なものを行います。この関数を実装するには、ボード (プラットフォーム) の詳細とアーキテクチャについてのドキュメントを参照してください。 | 
| `otaPal_GetPlatformImageState` | OTA 更新イメージの状態を取得します。 | 

デバイスがそれらをサポートしている場合は、この表の関数を実装してください。


| 関数名 | 説明 | 
| --- | --- | 
| `otaPal_CheckFileSignature` | 指定したファイルの署名を確認します。 | 
| `otaPal_ReadAndAssumeCertificate` | 指定された署名者証明書をファイルシステムから読み込み、発信者に返します。 | 
| `otaPal_ResetDevice` | デバイスをリセットします。 | 

**注記**  
OTA 更新をサポートできるブートローダーがあることを確認してください。 AWS IoT デバイスブートローダーの作成方法については、「[IoT デバイスブートローダー](#afr-bootloader)」を参照してください。

## E2E テストと PAL テスト
<a name="porting-steps-testing"></a>

 OTA PAL テストと E2E テストを実行します。

### E2E テスト
<a name="porting-ota-e2e"></a>

OTA エンドツーエンド (E2E) テストは、デバイスの OTA 機能を検証し、実際のシナリオをシミュレートするために使用されます。このテストにはエラー処理が含まれます。

#### 前提条件
<a name="e2e-prereqs"></a>

このテストを移植するには、以下のことが必要です。
+ OTA AWS ライブラリが統合されたプロジェクト。追加情報については、[OTA ライブラリの「移植ガイド」](https://www.freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_porting.html)を参照してください。
+ OTA ライブラリを使用してデモアプリケーションを移植し、 AWS IoT Core とやり取りして OTA 更新を行います。「[OTA デモアプリケーションの移植](#e2e-porting-demo-application)」を参照してください。
+ IDT ツールをセットアップします。これにより、OTA E2E ホストアプリケーションが実行され、さまざまな構成でデバイスをビルド、フラッシュ、監視し、OTA ライブラリの統合が検証されます。

#### OTA デモアプリケーションの移植
<a name="e2e-porting-demo-application"></a>

OTA E2E テストには、OTA ライブラリの統合を検証するための OTA デモアプリケーションが必要です。デモアプリケーションには、OTA ファームウェアの更新を実行できる能力が必要です。FreeRTOS OTA デモアプリケーションは [FreeRTOS GitHub](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator) リポジトリにあります。デモアプリケーションをリファレンスとして使用し、仕様に従って変更することをお勧めします。

##### 移植手順
<a name="e2e-port-demo"></a>

1. OTA エージェントを初期化します。

1. OTA アプリケーションコールバック関数を実装します。

1. OTA エージェントイベント処理タスクを作成します。

1. OTA エージェントを開始します。

1. OTA エージェントの統計を監視します。

1. OTA エージェントをシャットダウンします。

詳細な手順については、「[FreeRTOS OTA over MQTT - Entry point of the demo](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OtaMqttAgentEntryPoint)」を参照してください。

##### 設定
<a name="e2e-port-config"></a>

を操作するには、次の設定が必要です AWS IoT Core。
+ AWS IoT Core クライアント認証情報
  + Amazon 信頼サービスエンドポイントを使用して、`Ota_Over_Mqtt_Demo/demo_config.h` の **democonfigROOT\$1CA\$1PEM** をセットアップします。詳細については、[AWS サーバー認証](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html)を参照してください。
  +  AWS IoT クライアント認証情報`Ota_Over_Mqtt_Demo/demo_config.h`を使用して、 で **democonfigCLIENT\$1CERTIFICATE\$1PEM** と **democonfigCLIENT\$1PRIVATE\$1KEY\$1PEM** を設定します。クライアント証明書とプライベートキーについては、[AWS クライアント認証の詳細](https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html)を参照してください。
+ アプリケーションバージョン
+ OTA コントロールプロトコル
+ OTA データプロトコル
+ コード署名の認証情報
+ その他の OTA ライブラリ設定

前述の情報は、FreeRTOS OTA デモアプリケーションの `demo_config.h` および `ota_config.h` にあります。詳細については、「[FreeRTOS OTA over MQTT - Setting up the device](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OTABasicDemoClient)」を参照してください。

##### ビルド検証
<a name="e2e-port-validation"></a>

デモアプリケーションを実行して OTA ジョブを実行します。テストが正常に完了したら、引き続き OTA E2E テストを実行できます。

FreeRTOS [OTA デモ](https://www.freertos.org/ota/ota-mqtt-agent-demo.html)では、FreeRTOS Windows Simulator での OTA クライアントと AWS IoT Core OTA ジョブの設定に関する詳細情報を提供します。 AWS OTA は MQTT プロトコルと HTTP プロトコルの両方をサポートしています。詳細については、次の例を参照してください。
+ [Windows Simulator での MQTT 経由の OTA デモ](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Mqtt_Demo)
+ [Windows Simulator での HTTP 経由の OTA デモ](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Http_Demo)

#### IDT ツールによるテストの実行
<a name="e2e-idt"></a>

OTA E2E テストを実行するには、 AWS IoT Device Tester (IDT) を使用して実行を自動化する必要があります。詳細については、「FreeRTOS ユーザーガイド」の「[AWS IoT Device Tester for FreeRTOS](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)」を参照してください。

##### E2E テストケース
<a name="e2e-test-cases"></a>


| テストケース | 説明 | 
| --- | --- | 
| `OTAE2EGreaterVersion` | 定期的な OTA 更新のハッピーパステスト。これにより、新しいバージョンで更新が作成され、デバイスが正常に更新されます。 | 
| `OTAE2EBackToBackDownloads` | このテストでは、3 回連続で OTA 更新を作成します。デバイスは 3 回連続して更新される見込みです。 | 
| `OTAE2ERollbackIfUnableToConnectAfterUpdate` | このテストでは、デバイスが新しいファームウェアでネットワークに接続できない場合に、以前のファームウェアにロールバックすることを確認します。 | 
| `OTAE2ESameVersion` | このテストでは、バージョンが変わらない場合に、受信したファームウェアをデバイスが拒否することを確認します。 | 
| `OTAE2EUnsignedImage` | このテストでは、イメージが署名されていない場合に、デバイスが更新を拒否することを確認します。 | 
| `OTAE2EUntrustedCertificate` | このテストでは、ファームウェアが信頼できない証明書で署名されている場合に、デバイスが更新を拒否することを確認します。 | 
| `OTAE2EPreviousVersion` | このテストでは、デバイスが古い更新のバージョンを拒否することを確認します。 | 
| `OTAE2EIncorrectSigningAlgorithm` | デバイスによって、サポートされる署名アルゴリズムとハッシュアルゴリズムは異なります。このテストでは、サポートされていないアルゴリズムで作成されている場合に、デバイスが OTA 更新に失敗することを確認します。 | 
| `OTAE2EDisconnectResume` | これは一時停止/再開機能のハッピーパステストです。このテストでは、OTA 更新を作成して、更新を開始します。次に、同じクライアント ID (モノの名前) と認証情報 AWS IoT Core を使用して に接続します。 AWS IoT Core その後、 はデバイスを切断します。デバイスは、切断されていることを検出し AWS IoT Core、一定期間後に自身を停止状態に移行して、 に再接続してダウンロード AWS IoT Core を再開しようとします。 | 
| `OTAE2EDisconnectCancelUpdate` | このテストでは、一時停止状態のときに OTA ジョブがキャンセルされた場合に、デバイスが自動的に復旧できるかどうかを確認します。これは`OTAE2EDisconnectResume`テストと同じことを行いますが、デバイスを切断 AWS IoT Coreする に接続した後、OTA 更新をキャンセルします。新しい更新が作成されます。デバイスは に再接続し AWS IoT Core、現在の更新を中止して待機状態に戻して、次の更新を受け入れて完了することが期待されます。 | 
| `OTAE2EPresignedUrlExpired` | OTA 更新が作成されたら、S3 の署名付き URL の有効期間を設定できます。このテストでは、URL の有効期限が切れてダウンロードを完了できなくても、デバイスが OTA を実行できることを確認します。デバイスは、新しいジョブドキュメントを要求することが期待されます。このドキュメントには、ダウンロードを再開するための新しい URL が含まれています。 | 
| `OTAE2E2UpdatesCancel1st` | このテストでは、2 回続けて OTA 更新を作成します。デバイスが最初の更新をダウンロードしていると報告すると、テストは最初の更新を強制的にキャンセルします。デバイスは、現在の更新を中止して 2 回目の更新を取得し、更新を完了することが期待されます。 | 
| `OTAE2ECancelThenUpdate` | このテストでは、2 回続けて OTA 更新を作成します。デバイスが最初の更新をダウンロードしていると報告すると、テストは最初の更新を強制的にキャンセルします。デバイスは、現在の更新を中止して 2 回目の更新を取得し、更新を完了することが期待されます。 | 
| `OTAE2EImageCrashed` | このテストでは、イメージがクラッシュしたときに、デバイスが更新を拒否できることを確認します。 | 

### PAL テスト
<a name="porting-ota-pal"></a>

#### 前提条件
<a name="pal-prereqs"></a>

ネットワークトランスポートインターフェイスのテストを移植するには、次のものが必要です。
+ 有効な FreeRTOS カーネルポートを使用して FreeRTOS をビルドできるプロジェクト。
+ OTA PAL の実用的な実装。

#### 移植
<a name="pal-porting"></a>
+ [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests) をサブモジュールとしてプロジェクトに追加します。プロジェクト内のサブモジュールの場所は、そのサブモジュールをビルドできる場所でなければなりません。
+ `config_template/test_execution_config_template.h` と `config_template/test_param_config_template.h` をビルドパス内の場所にコピーし、名前を `test_execution_config.h` と `test_param_config.h` に変更します。
+ 関連ファイルをビルドシステムに含めます。`CMake` を使用している場合は、`qualification_test.cmake` と `src/ota_pal_tests.cmake` を使用して関連ファイルを含めることができます。
+ 次の関数を実装して、テストを設定します。
  + `SetupOtaPalTestParam()`: `src/ota/ota_pal_test.h` で定義されています。実装には、`ota_pal_test.h` で定義されているものと同じ名前と署名が必要です。現在のところ、この機能を設定する必要はありません。
+ テスト出力ログがデバイスログとインターリーブしないように、**UNITY\$1OUTPUT\$1CHAR** を実装します。
+ アプリケーションから `RunQualificationTest()` を呼び出します。呼び出す前に、デバイスのハードウェアが正しく初期化され、ネットワークが接続されている必要があります。

#### テスト
<a name="ota-testing"></a>

このセクションでは、OTA PAL 認定テストのローカルテストについて説明します。

##### テストの有効化
<a name="ota-testing-enabling"></a>

`test_execution_config.h` を開いて、**OTA\$1PAL\$1TEST\$1ENABLED** を 1 に定義します。

`test_param_config.h` で、以下のオプションを更新します。
+ **OTA\$1PAL\$1TEST\$1CERT\$1TYPE**: 使用する証明書タイプを選択します。
+ **OTA\$1PAL\$1CERTIFICATE\$1FILE**: デバイス証明書へのパス (該当する場合)。
+ **OTA\$1PAL\$1FIRMWARE\$1FILE**: ファームウェアファイルの名前 (該当する場合)。
+ **OTA\$1PAL\$1USE\$1FILE\$1SYSTEM**: OTA PAL がファイルシステム抽象化を使用している場合は、1 に設定します。

任意のツールチェーンを使用して、アプリケーションのビルドとフラッシュを行います。`RunQualificationTest()` が呼び出されると、OTA PAL テストが実行されます。テスト結果はシリアルポートに出力されます。

### OTA タスクの統合
<a name="integrating-ota"></a>
+ 現在の MQTT デモに OTA エージェントを追加します。
+ で OTA End to End (E2E) テストを実行します AWS IoT。これにより、統合が期待どおりに機能しているかどうかが検証されます。

**注記**  
FreeRTOS のデバイスを正式に認定するには、デバイスの移植されたソースコードを OTA PAL および OTA E2E テストグループに対して検証する必要があります AWS IoT Device Tester。[FreeRTOS ユーザーガイドの「Using AWS IoT Device Tester for](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) FreeRTOS」の手順に従って、ポート検証 AWS IoT Device Tester をセットアップします。 *FreeRTOS * 特定のライブラリのポートをテストするには、 フォルダの `device.json` ファイル AWS IoT Device Tester `configs`で正しいテストグループを有効にする必要があります。

## IoT デバイスブートローダー
<a name="afr-bootloader"></a>

独自のセキュアなブートローダーアプリケーションを提供する必要があります。設計と実装がセキュリティの脅威を適切に緩和するようにしてください。参考までに、脅威モデリングを以下に示します。

### IoT デバイスブートローダーの脅威モデリング
<a name="afr-threat-model-for-bootloader"></a>

#### 背景
<a name="afr-threat-model-for-bootloader-background"></a>

作業定義として、この脅威モデルによって参照される組み込み AWS IoT デバイスは、クラウドサービスとやり取りするマイクロコントローラーベースの製品です。コンシューマー、商用、または産業用にデプロイできます。IoT デバイスは、ユーザー、患者、マシン、環境に関するデータを収集し、電球やドアロックから工場の機械に至るまで、あらゆるものを制御できます。

脅威モデリングは、仮定の敵対者の観点からのセキュリティへのアプローチです。敵対者の目標と方法を検討することで、脅威のリストが作成されます。脅威とは、敵によって実行されるリソースまたはアセットに対する攻撃です。リストは優先順位付けされ、緩和策を識別および作成するために使用されます。緩和策を選択する場合、実装と保守のコストは、それらが提供する実際のセキュリティ価値とのバランスを取る必要があります。複数の [脅威モデルの方法論](https://en.wikipedia.org/wiki/Threat_model)があります。各 は、安全で成功した AWS IoT 製品の開発をサポートできます。

FreeRTOS は、 AWS IoT デバイスに OTA (over-the-airソフトウェア更新を提供します。更新機能は、クラウドサービスとオンデバイスソフトウェアライブラリとパートナー提供のブートローダーを組み合わせます。この脅威モデルは、特にブートローダーに対する脅威に焦点を当てています。

**ブートローダーのユースケース**
+ 展開する前に、ファームウェアにデジタル署名し、暗号化します。
+ 新しいファームウェアイメージを単一のデバイス、デバイスのグループ、またはフリート全体にデプロイします。
+ 新しいファームウェアがデバイスに導入された後、そのファームウェアの信頼性と完全性を検証します。
+ デバイスは、信頼できるソースから変更されていないソフトウェアのみを実行します。
+ デバイスは、OTA を介して受け取ったソフトウェアに障害耐性があります。

**データフロー図**

![\[埋め込みデバイスセキュリティのデータフロー図で、物理アクセス、埋め込みデバイス、インターネット境界、およびその他のコンポーネントが含まれます。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/portingguide/images/bootloader-dataflow-diagram.png)


#### 脅威
<a name="afr-threat-model-for-bootloader-threats"></a>

攻撃によっては、複数の緩和モデルがあります。例えば、悪意のあるファームウェアイメージを配信することを意図したネットワーク中間者は、TLS サーバーによって提供される証明書と新しいファームウェアイメージのコード署名者証明書の両方の信頼を検証することで軽減されます。ブートローダーのセキュリティを最大化するために、ブートローダー以外の緩和策は信頼できないと見なされます。ブートローダーには、攻撃ごとに組み込み緩和策が必要です。多層化された緩和策は、多重防御と呼ばれます。

**脅威:**
+ 攻撃者は、悪意のあるファームウェアイメージを配信するために、デバイスからサーバーへの接続をハイジャックします。

**緩和の例**
  + ブートローダーは、起動時に、既知の証明書を使用してイメージの暗号化署名を検証します。検証に失敗した場合、ブートローダーは前のイメージにロールバックします。
+ 攻撃者は、バッファオーバーフローを悪用して、フラッシュに保存されている既存のファームウェアイメージに悪意のある動作を導入します。

**緩和の例**
  + ブート時に、前に説明したように、ブートローダーが検証します。以前のイメージが使用できない状態で検証に失敗すると、ブートローダーは停止します。
  + ブート時に、前に説明したように、ブートローダーが検証します。以前のイメージが使用できない状態で検証に失敗すると、ブートローダーはフェイルセーフ OTA 専用モードに入ります。
+ 攻撃者は、以前に保存されたイメージからデバイスを起動します。このイメージは悪用可能です。

**緩和の例**
  + 最後のイメージを保存する Flash セクターは、新しいイメージのインストールとテストに成功すると消去されます。
  + ヒューズはアップグレードが成功するたびに焼き付けられ、正しい数のヒューズが焼き付けられていない限り、各イメージの実行は拒否されます。
+ OTA 更新は、デバイスをブロックする障害のあるイメージや悪意のあるイメージを配信します。

**緩和の例**
  + ブートローダーは、前のイメージへのロールバックをトリガーするハードウェアウォッチドッグタイマーを開始します。
+ 攻撃者はブートローダーにパッチを適用してイメージの検証をバイパスし、デバイスが署名されていないイメージを受け入れるようにします。

**緩和の例**
  + ブートローダーは ROM (読み取り専用メモリ) にあり、変更することはできません。
  + ブートローダーは OTP (ワンタイムプログラム可能なメモリ) にあり、変更することはできません。
  + ブートローダーは ARM TrustZone のセキュアゾーンにあり、変更することはできません。
+ デバイスが悪意のあるイメージを受け入れるように、攻撃者は検証証明書を置き換えます。

**緩和の例**
  + 証明書は暗号コプロセッサにあり、変更することはできません。
  + 証明書は ROM (または OTP、またはセキュアゾーン) にあり、変更することはできません。

#### 脅威のさらなるモデル化
<a name="afr-threat-model-for-bootloader-further"></a>

この脅威モデルでは、ブートローダーのみを考慮します。さらに脅威モデリングを行うことで、全体的なセキュリティを向上させることができます。推奨される方法は、敵対者の目標、それらの目標の対象となるアセット、およびアセットへの参入ポイントをリストすることです。脅威のリストは、エントリポイントに対する攻撃を考慮してアセットをコントロールすることで作成できます。以下は、IoT デバイスの目標、アセット、エントリポイントの例です。これらのリストはすべてを網羅したものではなく、さらなる検討を促進することを目的としています。

**敵対者の目標**
+ 資金の強要 
+ 評判を落とす 
+ データの改ざん 
+ リソースの転送 
+ ターゲットをリモートでスパイ 
+ サイトへの物理的なアクセスを獲得する 
+ 大惨事
+ 恐怖を与える 

**主要なアセット**
+ プライベートキー 
+ クライアント証明書 
+ CA ルート証明書 
+ セキュリティ認証情報とトークン 
+ お客様の個人識別情報 
+ 企業シークレットの実装 
+ センサーデータ 
+ クラウド分析データストア 
+ クラウドインフラストラクチャ 

**エントリポイント**
+ DHCP レスポンス 
+ DNS レスポンス 
+ MQTT over TLS 
+ HTTPS レスポンス 
+ OTA ソフトウェアイメージ 
+ その他 (アプリケーションによって指示される USB など) 
+ バスへの物理的なアクセス 
+ デキャップされた IC 