ESP32のセキュアなプロトタイピング環境を作成した(概要編)

#はじめに#
独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。

#なぜESP32、きっかけ#
Wifi,Bluetoothを使える安価なチップというのが大きい。
数多くの作例、Arduinoのサポートによる多くのコード資産、情報量の多さ、メーカードキュメントのわかりやすさ、M5StackなどをはじめとするESP32関連キットの人気もあり、趣味と実用を兼ねて選択した。
多くの個人事例がある中で、ESP32を使ったセキュアな通信を検証してGithubにアップしていくと、世界各国から、製品として採用を検討しており、ネットワークセキュリティについて取り組んでいる開発者から相談を受けることがしばしばあった。

そういう開発者がセキュリティについてゼロから考えて実装していくのは本当にやりたいことから時間を削ることになり、理想的ではないなと思うようになった。
また、デバイスが安全に通信できると適用できる現場がもっと増やせて、デバイスを使った省力化や、ひいては世の中にもっと役に立つ場面が増えるのではないか、そういう思いに支えられながら取り組んだ。

#コンセプト#
開発者（自分ももちろん）が「やってみよう」と思うプロトタイピングをセキュアにすぐ行えて、トライアンドエラーのファームウェアの更新もしやすいこと。

#目指したゴール#
プロトタイプ段階から開発クライアント、サーバー、およびデバイス全体を保護
ESP32プラットフォームに対応し、以下の機能を有効にする

	デバイスの起動制御
	セキュアブート、フラッシュ暗号化
	ハードウェアルートオブトラストによるTLS通信暗号化
	OTA機能
	Wifi接続管理

Arduino, ESP-IDFに対応し、ファームウェアをTLS通信で安全に更新可能
AWSおよびAzureへの安全なデバイス接続をサポート

プロジェクト名を決めてみようということで、以下の通りとした。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/bd90259a-79c8-45f8-e9bd-b118258fef8b.png)


#アーキテクチャの検討#

デバイスにOTAを提供するためには、デバイスが決まったサーバーへアクセスし、OTAの要求をもとにファームウェアをダウンロードする仕掛けを考えた。
ファームウェアにはセキュアブートのコード署名を行ってデバイスに配信するので、サーバー上で署名することも考えたが、秘密鍵の所在がサーバー上というのはまずいだろうと考え、開発者PCで署名を行ってサーバーへ転送、それをデバイスがダウンロードする3階層構造で構築した。
デバイス側を rainbowtype bootloader
サーバーをrainbowtype server
PCアプリをrainbowtype clientと名付けた。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/df816a29-5f82-91c6-b179-dc916a88dacb.png)


#要求環境#

rainbowtype bootloaderは、ESP32(ESP32-WROOM-32,もしくはESP32-WROVER)に対応、
最近流通が始まったECO V3にも対応とし、セキュリティのエラッタを回避できるようにした。
ハードウェアルートオブトラストによるTLS通信暗号化についてはATECC608Aを利用する。

rainbowtype server はインターネット上で固定グローバルIPを持つサーバーで、Dockerで構成して
展開しやすくした。

rainbowtype clientはWindows10対応のアプリケーションで、証明書、秘密鍵の生成、署名、デバイス状態設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/2f7933f6-873d-bceb-40ab-b6d66d359e93.png)

 

#各要素の説明#

■rainbowtype serverの設定
rainbowtype clientでルート証明書、中間証明書、サーバー証明書を作成して、用意したサーバー上へ転送、Dockerインスタンスとして起動させる。
無料で取得できるGCE(Google Compute Engine)上でも作成することができた。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/99d98f4d-3847-640a-d9f7-b2a119bbb3a8.png)


■プロビジョニング
1つ1つのESP32にrainbowtype bootloaderを組み込むためにATECC608Aの秘密鍵でデバイス証明書を作成して書き戻し、rainbowtype clientと信頼関係を作る。これをプロビジョニングという。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/037c89f8-050c-f73c-2159-0b20b4ba864b.png)

 

■デバイス管理

rainbowtype client から、デバイスの制御を行う。
rainbowtype serverへの疎通がないと起動しないモード、起動を禁止するモードなどが選択できる。
OTAのファームウェアも送り込めるようにする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/f53208c1-d1fd-c523-4862-5e75419ce0e2.png)



■デバイス側機能
rainbowtype bootloaderは、rainbowtype serverへ通信し、
アクションとステータスを更新する。
アクションでは　OTA指示、デバイス証明書の更新指示などができる。
ステータスでは、
１，	オフライン起動モード（rainbowtype serverと通信がなくても起動を許可）
２，	オンライン起動モード（rainbowtype serverと通信できれば起動を許可）
３，	OTA必須モード（rainbowtype serverと通信し、毎度ファームウェアをダウンロードさせる）
４，	ブート禁止モード（起動を許可しない）
以上の制御を行う。

また、Wifi設定はアプリケーション領域に平文で書く必要はなく、rainbowtype bootloader が一時的にアクセスポイントモードになりwifi設定画面を提供する機能を実装。
SSIDとパスワードはATECC608Aに暗号化して保存される。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/91ea2818-a9a3-498a-94db-8787a7253119.png)


■PC側クライアントアプリ

１，証明書管理
２，デバイス証明書管理
（OTA,デバイス証明書ローリング）
３，rainbowtype bootloaderの展開
（セキュアブート、フラッシュ暗号化も実施）
ESP32 ECO3から採用された、RSA鍵による強化されたコード署名に対応。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/1a48e22f-8204-d302-8ed0-4be1ef767520.png)


■クラウド接続
作成したルート証明書、中間証明書をAWS IoT Core,　Azure IoT Hubに登録することで、それぞれにスムーズにデバイス接続することが可能。

■アプリケーションテンプレートも作成中。
Arduinoで専用のMbedtlsのライブラリを用意し、わずかなコードでサーバー接続と、保存されたWifi 設定情報を利用可能。
アプリケーション作成のためのWEBテンプレートも準備。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/9367e4a7-175c-2e3e-d35a-51b5a519676a.png)


次回以降、それぞれの実装を整理していく。