AWS IoT 無線通信経由 (OTA) 更新ライブラリの移植 - FreeRTOS

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

AWS IoT 無線通信経由 (OTA) 更新ライブラリの移植

FreeRTOS 無線通信経由 (OTA) 更新を使用すると、次の操作を実行できます。

  • 新しいファームウェアイメージを単一のデバイス、デバイスのグループ、またはフリート全体に展開します。

  • グループに追加、リセット、または再プロビジョニングされると、デバイスにファームウェアを展開します。

  • 新しいファームウェアがデバイスに導入された後、そのファームウェアの信頼性と完全性を検証します。

  • デプロイの進行状況をモニタリングします。

  • 失敗したデプロイをデバッグします。

  • AWS IoT のコード署名を使用してファームウェアにデジタル署名します。

詳細については、「FreeRTOS ユーザーガイド」の「FreeRTOS 無線通信経由更新」と AWS IoT 無線通信経由更新に関するドキュメントを参照してください。

OTA 更新ライブラリを使用して、OTA の機能を FreeRTOS アプリケーションに統合できます。詳細については、FreeRTOS ユーザーガイドFreeRTOS OTA 更新ライブラリを参照してください。

FreeRTOS デバイスは、受信した OTA ファームウェアイメージに対して暗号化コード署名検証を実行する必要があります。以下のアルゴリズムを推奨します。

  • 楕円曲線デジタル署名アルゴリズム (ECDSA)

  • NIST P256 曲線

  • SHA-256 ハッシュ

前提条件

プラットフォームの移植

OTA ライブラリを新しいデバイスに移植するには、OTA ポータブル抽象化レイヤー (PAL) を実装する必要があります。PAL API は、実装固有の詳細を指定する必要がある ota_platform_interface.h ファイルで定義されています。

関数名

説明

otaPal_Abort

OTA 更新を停止させます。

otaPal_CreateFileForRx

受信したデータチャンクを保存するファイルを作成します。

otaPal_CloseFile

指定されたファイルを閉じます。暗号保護を実装するストレージを使用している場合、これによってファイルが認証される可能性があります。

otaPal_WriteBlock

指定されたファイルに、指定されたオフセットでデータブロックを書き込みます。成功すると、関数によって書き込まれたバイト数が返されます。その他の場合は、関数によって負のエラーコードが返されます。ブロックのサイズは常に 2 の累乗でアラインされます。詳細については、OTA ライブラリの「Configurations」を参照してください。

otaPal_ActivateNewImage

新しいファームウェアイメージをアクティブ化または起動します。一部のポートでは、デバイスがプログラム的に同期的にリセットされると、この関数は戻りません。

otaPal_SetPlatformImageState

最新の OTA ファームウェアイメージ (またはバンドル) を受け入れるか拒否するためにプラットフォームで必要なものを行います。この関数を実装するには、ボード (プラットフォーム) の詳細とアーキテクチャについてのドキュメントを参照してください。

otaPal_GetPlatformImageState

OTA 更新イメージの状態を取得します。

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

関数名

説明

otaPal_CheckFileSignature

指定したファイルの署名を確認します。

otaPal_ReadAndAssumeCertificate

指定された署名者証明書をファイルシステムから読み込み、発信者に返します。

otaPal_ResetDevice

デバイスをリセットします。

注記

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

E2E テストと PAL テスト

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

E2E テスト

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

前提条件

このテストを移植するには、以下のことが必要です。

  • AWS OTA ライブラリが統合されたプロジェクト。追加情報については、OTA ライブラリの「移植ガイド」を参照してください。

  • OTA ライブラリを使用してデモアプリケーションを移植し、AWS IoT Core とやり取りして OTA 更新を行います。「OTA デモアプリケーションの移植」を参照してください。

  • IDT ツールをセットアップします。これにより、OTA E2E ホストアプリケーションが実行され、さまざまな構成でデバイスをビルド、フラッシュ、監視し、OTA ライブラリの統合が検証されます。

OTA デモアプリケーションの移植

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

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

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

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

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

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

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

詳細な手順については、「FreeRTOS OTA over MQTT - Entry point of the demo」を参照してください。

構成

AWS IoT Core とやり取りするには、以下の設定が必要です。

  • AWS IoT Core クライアント認証情報

    • Amazon 信頼サービスエンドポイントを使用して、Ota_Over_Mqtt_Demo/demo_config.hdemoconfigROOT_CA_PEM をセットアップします。詳細については、AWS サーバー認証を参照してください。

    • AWS IoT クライアント認証情報を使用して、Ota_Over_Mqtt_Demo/demo_config.hdemoconfigCLIENT_CERTIFICATE_PEMdemoconfigCLIENT_PRIVATE_KEY_PEM をセットアップします。クライアント証明書とプライベートキーについては、AWS クライアント認証の詳細を参照してください。

  • アプリケーションバージョン

  • OTA コントロールプロトコル

  • OTA データプロトコル

  • コード署名の認証情報

  • その他の OTA ライブラリ設定

前述の情報は、FreeRTOS OTA デモアプリケーションの demo_config.h および ota_config.h にあります。詳細については、「FreeRTOS OTA over MQTT - Setting up the device」を参照してください。

ビルド検証

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

FreeRTOS OTA デモでは、FreeRTOS Windows Simulator での OTA クライアントと AWS IoT Core OTA ジョブのセットアップに関する詳細情報を提供します。AWSOTA は、MQTT プロトコルと HTTP プロトコルの両方をサポートしています。詳細については、次の例を参照してください。

IDT ツールによるテストの実行

OTA E2E テストを実行するには、AWS IoT Device Tester (IDT) を使用して実行を自動化する必要があります。詳細については、「FreeRTOS ユーザーガイド」の「AWS IoT Device Tester for FreeRTOS」を参照してください。

E2E テストケース

テストケース

説明

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 テスト

前提条件

ネットワークトランスポートインターフェイスのテストを移植するには、次のものが必要です。

  • 有効な FreeRTOS カーネルポートを使用して FreeRTOS をビルドできるプロジェクト。

  • OTA PAL の実用的な実装。

移植

  • FreeRTOS-Libraries-Integration-Tests をサブモジュールとしてプロジェクトに追加します。プロジェクト内のサブモジュールの場所は、そのサブモジュールをビルドできる場所でなければなりません。

  • config_template/test_execution_config_template.hconfig_template/test_param_config_template.h をビルドパス内の場所にコピーし、名前を test_execution_config.htest_param_config.h に変更します。

  • 関連ファイルをビルドシステムに含めます。CMake を使用している場合は、qualification_test.cmakesrc/ota_pal_tests.cmake を使用して関連ファイルを含めることができます。

  • 次の関数を実装して、テストを設定します。

    • SetupOtaPalTestParam(): src/ota/ota_pal_test.h で定義されています。実装には、ota_pal_test.h で定義されているものと同じ名前と署名が必要です。現在のところ、この機能を設定する必要はありません。

  • テスト出力ログがデバイスログとインターリーブしないように、UNITY_OUTPUT_CHAR を実装します。

  • アプリケーションから RunQualificationTest() を呼び出します。呼び出す前に、デバイスのハードウェアが正しく初期化され、ネットワークが接続されている必要があります。

テスト

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

テストの有効化

test_execution_config.h を開いて、OTA_PAL_TEST_ENABLED を 1 に定義します。

test_param_config.h で、以下のオプションを更新します。

  • OTA_PAL_TEST_CERT_TYPE: 使用する証明書タイプを選択します。

  • OTA_PAL_CERTIFICATE_FILE: デバイス証明書へのパス (該当する場合)。

  • OTA_PAL_FIRMWARE_FILE: ファームウェアファイルの名前 (該当する場合)。

  • OTA_PAL_USE_FILE_SYSTEM: OTA PAL がファイルシステム抽象化を使用している場合は、1 に設定します。

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

OTA タスクの統合

  • 現在の MQTT デモに OTA エージェントを追加します。

  • AWS IoT を使用して、OTA エンドツーエンド (E2E) テストを実行します。これにより、統合が期待どおりに機能しているかどうかが検証されます。

注記

FreeRTOS 用にデバイスを正式に認定するには、AWS IoT Device Tester を使用して、デバイスの移植されたソースコードと OTA PAL および OTA E2E のテストグループを照合しながら検証する必要があります。「FreeRTOS ユーザーガイド」の「Using AWS IoT Device Tester for FreeRTOS」に記載されている手順に従って、移植の検証に使う AWS IoT Device Tester を設定します。特定のライブラリのポートをテストするには、AWS IoT Device Tester configs フォルダの device.json ファイルで正しいテストグループを有効にする必要があります。

IoT デバイスブートローダー

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

IoT デバイスブートローダーの脅威モデリング

背景

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

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

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

ブートローダーのユースケース
  • 展開する前に、ファームウェアにデジタル署名し、暗号化します。

  • 新しいファームウェアイメージを単一のデバイス、デバイスのグループ、またはフリート全体にデプロイします。

  • 新しいファームウェアがデバイスに導入された後、そのファームウェアの信頼性と完全性を検証します。

  • デバイスは、信頼できるソースから変更されていないソフトウェアのみを実行します。

  • デバイスは、OTA を介して受け取ったソフトウェアに障害耐性があります。

データフロー図

脅威

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

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

    緩和の例
    • ブートローダーは、起動時に、既知の証明書を使用してイメージの暗号化署名を検証します。検証に失敗した場合、ブートローダーは前のイメージにロールバックします。

  • 攻撃者は、バッファオーバーフローを悪用して、フラッシュに保存されている既存のファームウェアイメージに悪意のある動作を導入します。

    緩和の例
    • ブート時に、前に説明したように、ブートローダーが検証します。以前のイメージが使用できない状態で検証に失敗すると、ブートローダーは停止します。

    • ブート時に、前に説明したように、ブートローダーが検証します。以前のイメージが使用できない状態で検証に失敗すると、ブートローダーはフェイルセーフ OTA 専用モードに入ります。

  • 攻撃者は、以前に保存されたイメージからデバイスを起動します。このイメージは悪用可能です。

    緩和の例
    • 最後のイメージを保存する Flash セクターは、新しいイメージのインストールとテストに成功すると消去されます。

    • ヒューズはアップグレードが成功するたびに焼き付けられ、正しい数のヒューズが焼き付けられていない限り、各イメージの実行は拒否されます。

  • OTA 更新は、デバイスをブロックする障害のあるイメージや悪意のあるイメージを配信します。

    緩和の例
    • ブートローダーは、前のイメージへのロールバックをトリガーするハードウェアウォッチドッグタイマーを開始します。

  • 攻撃者はブートローダーにパッチを適用してイメージの検証をバイパスし、デバイスが署名されていないイメージを受け入れるようにします。

    緩和の例
    • ブートローダーは ROM (読み取り専用メモリ) にあり、変更することはできません。

    • ブートローダーは OTP (ワンタイムプログラム可能なメモリ) にあり、変更することはできません。

    • ブートローダーは ARM TrustZone のセキュアゾーンにあり、変更することはできません。

  • デバイスが悪意のあるイメージを受け入れるように、攻撃者は検証証明書を置き換えます。

    緩和の例
    • 証明書は暗号コプロセッサにあり、変更することはできません。

    • 証明書は ROM (または OTP、またはセキュアゾーン) にあり、変更することはできません。

脅威のさらなるモデル化

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

敵対者の目標
  • 資金の強要

  • 評判を落とす

  • データの改ざん

  • リソースの転送

  • ターゲットをリモートでスパイ

  • サイトへの物理的なアクセスを獲得する

  • 大惨事

  • 恐怖を与える

主要なアセット
  • プライベートキー

  • クライアント証明書

  • CA ルート証明書

  • セキュリティ認証情報とトークン

  • お客様の個人識別情報

  • 企業シークレットの実装

  • センサーデータ

  • クラウド分析データストア

  • クラウドインフラストラクチャ

エントリポイント
  • DHCP レスポンス

  • DNS レスポンス

  • MQTT over TLS

  • HTTPS レスポンス

  • OTA ソフトウェアイメージ

  • その他 (アプリケーションによって指示される USB など)

  • バスへの物理的なアクセス

  • デキャップされた IC