📚

Menderで始める組み込みOTA 第1回 : Menderのご紹介

2022/04/28に公開

MenderはオープンソースベースのLinux向けOTA(Over the Air Update)ソリューションです。

Mender is a secure, risk tolerant and efficient over-the-air update manager. Remotely manage and deploy software updates to your IoT devices at scale, worldwide.

https://mender.io/

筆者の会社コードギアではこのたびご縁あってMenderの技術サポートを提供する機会を得ました。
この一連の記事ではMender OTAソリューションの技術的な側面を紹介します。


Menderで始める組み込みOTA」記事インデックス


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サービスも利用可能です。

https://mender.io/

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の概要

https://docs.mender.io/device-side-api

Management APIの呼び出し例

https://docs.mender.io/server-integration/using-the-apis

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を利用した実装例が提供されています。

https://hub.mender.io/t/secure-iot-with-mender-and-nxp-edgelock-se050/2744

オープンソース

「オープンソースのOTAソリューション」ということで、サーバー側/クライアント側ソースコードの主要な部分がGitHubで公開されています。

クライアント側

クライアント側コードは以下のGitHubがメインです。

https://github.com/mendersoftware/mender

ライセンスはApache 2.0です。

標準でクライアント側実装が提供されているいつくかのデバイス以外は、基本ユーザー側で要件に合わせて実装することになります。

(参考)標準で提供されているクライアント側実装例

  • Raspberry Pi 3/4
  • QEMUエミュレータ

クライアント側機器の認証プログラムのようなものは現状ありません。

サーバー側

サーバー構成とAPI でご紹介した複数のサーバーモジュールのソースコードもそれぞれGitHubに公開されています。しかし、Enterpriseプランでのみ利用可能なモジュール、およびBasic/Professionalプランでadd-onとして提供されているモジュールのソースコードは公開されていません。

https://github.com/mendersoftware/deviceauth

https://github.com/mendersoftware/inventory

https://github.com/mendersoftware/useradm

https://github.com/mendersoftware/deviceconfig

https://github.com/mendersoftware/deployments

これらを束ねる仕組みがこちら

https://github.com/mendersoftware/integration

これらのライセンスもApache 2.0です。

コミュニティ(Mender Hub)

Northern.tech社が主にサーバー側に注力している事情もあり、クライアント側の実装ノウハウは Mender Hub というコミュニティサイトに集積されています。

Mender Hub

以下のフォーラムでは(標準で実装が提供されている以外の)多数のクライアント側実装例が掲載されています。

Board Integration forum

あたりまえのような気はしますが、Mender Hubのアカウントは SaaSのmender.ioのアカウントとは別なのでご注意ください。

この記事のまとめ

MenderはLinuxをベースに構想されたサーバー側/クライアント側のOTAソリューションです。シンプルかつ拡張可能なように設計されており、技術者である筆者はなかなかイジりがいの有るユニークなソリューションだと思っています。

今後の予定

コードギアでは Menderで始める組み込みOTA のタイトルで以下のZenn記事を公開しています。

これ以降の記事も準備中です。ご期待ください。

Discussion