Menderで始める組み込みOTA 第1回 : Menderのご紹介
MenderはオープンソースベースのLinux向けOTA(Over the Air Update)ソリューションです。
筆者の会社コードギアではこのたびご縁あってMenderの技術サポートを提供する機会を得ました。
この一連の記事ではMender OTAソリューションの技術的な側面を紹介します。
「Menderで始める組み込みOTA」記事インデックス
- 第0回 : 組み込み製品、IoTシステムに適したOTAとは?
- 第1回 : Menderのご紹介 (本記事)
- 第2回 : Quickstart Part1 : mender.ioの試用アカウントを取得
- 第3回 : Quickstart Part2 : Raspberry Pi 3/4を接続
- 第4回 : Quickstart Part3 : アプリケーションを更新(その1)
- 第5回 : Quickstart Part4 : アプリケーションを更新(その2)
- 第6回 : Quickstart Part5 : OSアップデートを実行
- 第7回 : Quickstart Part6 : コンテナアップデートを実行
- 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介
- 第9回 : 接続編1 : QEMUエミュレータを接続
- 第10回 : 接続編2 : Armadillo IoT G3を接続
- 第11回 : 接続編3 : Jetson AGX Orinを接続
Mender OTA ソリューション
Mender はノルウェー発のOSSであり、LinuxベースのIoTデバイスにOTAアップデート機能を追加する、クライアントサーバー型のアップデートソリューションです。サーバー側はdockerベースで実装されオンプレミスやクラウドで実行可能です。クライアント側は様々なLinuxプラットフォーム向けの移植例がコミュニティベースで公開されています。開発元はMenderのサーバーサイドをSaaSサービスとしても運営しており、ユーザーは月額使用料を支払うことで面倒なサーバー運営から解放されるオプションを選択可能です。
本記事ではMenderの技術的な内容を掘り下げます。
ターゲット環境
OTA対象になるターゲットデバイスの環境として以下が想定されています。
https://docs.mender.io/overview/device-support
具体的には、Debian/Ubuntu系Linuxと Buildroot/Yoctoのような組み込み系Linuxです。
mender-client モジュールはgo言語で記述されており、goコンパイラの利用可能なLinux環境であれば比較的簡単に移植可能です。
Debian/Ubuntu系で有名なターゲットとしては
- Raspberry Pi3/4
- Nvidia Jetson
- アットマークテクノ社のArmadilloシリーズ (IoT G3等)
- Beagle Bone Brack/Green
などが挙げられます。これらの環境では .deb 形式のパッケージ管理システムが利用されており、条件が合えば .debをターゲットに展開するだけで使用可能になります。(もちろん設定ファイルの作成が必要ですが...)
.deb ではないパッケージシステムを利用している Fedra/RedHat/CentOSのようなシステムの場合、goソースコードからビルドして運用している例があります。
サーバー環境
サーバー側もLinuxベースのシステムが想定されています。
システム要件を簡略化するために docker環境の利用が推奨されています。
https://docs.mender.io/3.2/server-installation/demo-installation#requirements
- Docker Engine
- Docker Compose
- Install the following utilities, example for Ubuntu:
sudo apt install gawk curl bsdmainutils jq git
kubernetes環境にインストールするための情報も提供されています。
https://docs.mender.io/3.2/server-installation/production-installation-with-kubernetes
IoTデバイスの場合、やはりインターネットに接続できる環境での運用がメインですが、インターネットに接続していないクローズドクラウドやオンプレミス環境での利用も可能なように考慮されています。
SaaSサービス(mender.io)
上記のように、サーバーサイドは自前でdockerイメージをパブリッククラウドやプライベートクラウド、オンプレミスに展開して運用することが可能ですが、インターネット接続されている通常のIoT機器の場合はNorthern.tech社が運用しているSaaSサービスも利用可能です。
Basic/Professional/Enterpriseの3つの有償プランが用意されています。Basic/Professionalプランではadd-onと呼ばれる追加機能を(これも有償で)利用する事が可能です。
Enterpriseの価格はここでは明らかにされていませんが、tESCC Japan社問い合わせ に問い合わせると教えてくれます。
利用開始するには、まずアカウントをとる必要があります。
最長12か月、最大10台までEnterpriseプランを無料で試用可能なトライアル用アカウントもここから取得します。
Enterpriseプランを契約すると、Enterpriseプランでのみ利用可能なdockerイメージをダウンロードするためのアカウントをもらうことができます。このアカウントを利用してオンプレミス環境へのEnterpriseプラン機能のdockerを利用した展開が可能になります。
サーバー構成とAPI
Menderで展開されるサーバーシステムは以下の構成です。
ユニークな点として、アップデートファイル(artifactと呼びます)のリポジトリとしてAmazon S3互換のストレージシステムを採用している点があります。AWSに展開する場合はもちろん標準のS3を利用可能ですが、提供されているdockerイメージでは MinIO を利用しています。
サーバー側には主にクライアントが利用するDevice Side APIとサーバー側で(artifact登録などで)利用するManagement APIが実装されており、いずれもWebAPIになっています。
Device Side APIの概要
Management APIの呼び出し例
WebUI
サーバー側を自前で展開する場合やSaaSを利用する場合、いずれの場合も共通のWebUIでサーバー側操作を行います。
Enterpriseプランの場合にはテナントがサポートされており、一つのテナントに複数のログインユーザーが所属しロールベースのセキュリティ運用を行う、のようなことが可能になっています。
OTAファイル(artifact)
MenderではOTAでダウンロードされるコンテンツ形式をartifactと呼びます。これは複数のコンテンツ(payloadとよぶ)を束ねた一種のアーカイブ形式です。このartifact形式のファイルを生成するためにmender-artifactというコマンドラインツールが利用されます。
artifact内のそれぞれのpayloadにはpayload typeが設定されており、このpayload typeごとのハンドラをクライアントデバイス内に実装することで、payloadの種類に応じたOTA処理が実装可能です。mender-artifactツールでは -T オプションでこれを指定します。
payload typeの例としては以下が考えられますが、用途に応じて簡単に拡張することができます。
- rootfs-image
- single-file (single-file-artifact-genを利用して生成)
- directory (実際にはtarファイル、directory-artifact-genを利用して生成)
- docker (docker-artifact-genを利用して生成)
- bootloader
- firmware
等々。
OTAセキュリティ
OTAでは以下のようなセキュリティ要件を考慮する必要があります。
pull型のソリューション
device pull型のOTAソリューションなので、(あたりまえですが)デバイス側に待ち受け用のopen portは不要です。
サーバー接続時のセキュリティ
サーバー接続する各デバイスはopensslを利用して生成したキーペアにより一意に区別され、サーバー接続後の最初のデバイス認証に利用されます。
認証済デバイスはその後1週間有効なJWT(JSON Web Token)を取得することができ、サーバーAPI呼び出し時にはこれをhttpヘッダーに入れてサーバーとTLS通信を行います。JWTが無効になると、通常のリトライシーケンスで再度1週間有効なJWTを取得します。
クライアント側で実行されるサーバー認証は、Linuxに搭載されるWebブラウザが行っているのと同じ通常のhttpsサーバー認証を利用します。これはサーバー側のみ認証する片方向認証ですが、Enterpriseプランではサーバー側で接続してくる個別のデバイスを認証する両方向認証も利用可能です。この時、すべてのクライアントにはTLS接続用の証明書を追加でインストールする必要があります。
ダウンロードコンテンツのセキュリティ
artifactにはチェックサムが付加されており標準ではこれを利用して正当性を検証しますが、オプションでPKIを利用したartifactの署名も利用可能です。この場合すべてのクライアント側デバイスに公開鍵を入れるなど、追加のクライアント側実装が必要になります。
artifact自体は暗号化されませんが、artifactに含まれるそれぞれのpayloadを暗号化しデバイス側で復号するような実装も可能と考えられます。
HSMの利用
Menderでは複数の鍵ペアや証明書を利用します。これらのセキュアアイテムは標準ではLinuxのファイルシステムにファイルとして保存されています。
これが問題になるときは HSM(Hardware Security Module) が利用可能です。NXP社のSE050 HSMを利用した実装例が提供されています。
オープンソース
「オープンソースのOTAソリューション」ということで、サーバー側/クライアント側ソースコードの主要な部分がGitHubで公開されています。
クライアント側
クライアント側コードは以下のGitHubがメインです。
ライセンスはApache 2.0です。
標準でクライアント側実装が提供されているいつくかのデバイス以外は、基本ユーザー側で要件に合わせて実装することになります。
(参考)標準で提供されているクライアント側実装例
- Raspberry Pi 3/4
- QEMUエミュレータ
クライアント側機器の認証プログラムのようなものは現状ありません。
サーバー側
サーバー構成とAPI でご紹介した複数のサーバーモジュールのソースコードもそれぞれGitHubに公開されています。しかし、Enterpriseプランでのみ利用可能なモジュール、およびBasic/Professionalプランでadd-onとして提供されているモジュールのソースコードは公開されていません。
これらを束ねる仕組みがこちら
これらのライセンスもApache 2.0です。
コミュニティ(Mender Hub)
Northern.tech社が主にサーバー側に注力している事情もあり、クライアント側の実装ノウハウは Mender Hub というコミュニティサイトに集積されています。
以下のフォーラムでは(標準で実装が提供されている以外の)多数のクライアント側実装例が掲載されています。
あたりまえのような気はしますが、Mender Hubのアカウントは SaaSのmender.ioのアカウントとは別なのでご注意ください。
この記事のまとめ
MenderはLinuxをベースに構想されたサーバー側/クライアント側のOTAソリューションです。シンプルかつ拡張可能なように設計されており、技術者である筆者はなかなかイジりがいの有るユニークなソリューションだと思っています。
今後の予定
コードギアでは 「Menderで始める組み込みOTA」 のタイトルで以下のZenn記事を公開しています。
- 第0回 : 組み込み製品、IoTシステムに適したOTAとは?
- 第1回 : Menderのご紹介 (本記事)
- 第2回 : Quickstart Part1 : mender.ioの試用アカウントを取得
- 第3回 : Quickstart Part2 : Raspberry Pi 3/4を接続
- 第4回 : Quickstart Part3 : アプリケーションを更新(その1)
- 第5回 : Quickstart Part4 : アプリケーションを更新(その2)
- 第6回 : Quickstart Part5 : OSアップデートを実行
- 第7回 : Quickstart Part6 : コンテナアップデートを実行
- 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介
- 第9回 : 接続編1 : QEMUエミュレータを接続
- 第10回 : 接続編2 : Armadillo IoT G3を接続
これ以降の記事も準備中です。ご期待ください。
Discussion