LoginSignup
4
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-04

はじめに

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

経緯

ESP32のセキュアなプロトタイピング環境を作成した(概要編)の内容をユーザーにトライアルしてもらうためドキュメントの整備を進めた。

今回のプロジェクトのゴールは下記の通りとなる。

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

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

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

プロジェクト名をrainbowtypeとした。
image.png

ランディングページの作成

プロジェクトを知ってもらい、試してもらう目的、また体系的なドキュメント化にランディングページを作ってみた。

rainbowtype
image.png

ベースはReactで作成し、Material-UIのチュートリアルを参考にした。
独自ドメインをValue-domain で取得し、ページはgithub pagesへデプロイした。

まず英語で書いてみたが、追って日本語との切り替えを実装してみたい。

デモの作成

コンセプトの提示にデモが有効と考え、以下のシナリオでデモを作成し、ランディングページに組み込んだ。

1, 通信経路の暗号化が必須なリモートシリアルコンソールのデモ
2, プライバシー保護が必要なWEB監視カメラデモ
3, 接続に証明書認証が必要なAWS接続

1, 通信経路の暗号化が必須なリモートシリアルコンソールのデモ

リモートシリアル制御では、リモートターゲットデバイスを完全に制御するために、通信パスを保護することが重要となる。
ユーザーが入力するログインパスワードなどのさまざまな認証情報がやり取りされることを想定する。

このようなアプリケーションでは、デバイスからサーバー、およびWebサイトへのすべてのルートで相互認証が必要であろう。

このシナリオでは、ブラウザコンソールから操作できるように、ターゲットデバイスとのシリアル通信をWebSocket経由でサーバーに転送するように構成されたESP32ファームウェアを作成する。

デバイスからWebSocketを受信して​​ルーティングする機能と、ブラウザー側に表示する機能の両方を提供するボイラープレートを作成した。
これはDockerfileに設定されているため、デバイスが指すことができる静的IPを備えたサーバーを用意するだけである。
GCEなど、無料で使える環境で試しやすい。

image.png

サーバー側にXterm.jsを使い、見た目も整ったリモートシリアルコンソールを実現した。

2, プライバシー保護が必要なWEB監視カメラデモ

監視カメラのアプリケーションでは、プライバシーを保護するために通信パスを保護することが重要である。

このようなアプリケーションでも、デバイスからサーバー、およびWebサイトへのすべてのルートで相互認証が必要であろう。

このシナリオでは、ターゲットデバイスのカメラ画像をWebSocket経由でサーバーに転送するように構成されたrainbowtypeのESP32を使用して、ブラウザーに複数のカメラ画像を表示させる。

この目的のために、デバイスからWebSocketを受信して​​ルーティングする機能と、ブラウザー側に表示する機能の両方を提供するボイラープレートを作成した。
これはDockerfileで設定されているため、デバイスが指すことができる静的IP持ったサーバーを用意するだけで実現可能。
上記同様簡単な例はGCEだが、画像転送は多くの帯域幅を使用するため、請求状況に注意する必要がある。できれば安いVPSなどを使った方がよいだろう。

image.png

Reactでページを構成し、Websocketで着信があったカメラを順番にIDを振り、複数表示させている。

3, 接続に証明書認証が必要なAWS接続

多くのデバイスを使用するIoTアプリケーションの場合、セキュリティ上の理由から、AWSへのデバイス登録は自動的に行う必要があるだろう。

rainbowtypeは、AWS IoTとの接続を安全に保つために、信頼のハードウェアルートとしてATECC608Aを使用できる。
このシナリオでは、AWS IoTジャストインタイム登録(JITR)を使用して、デバイスに署名した証明書を使用してデバイスをAWSIoTに自動的に接続を行う。

rainbowtypeで作成し、デバイスに署名を行ったSigner CA証明書を、AWSへ登録する手順の紹介、デバイス側でAWSへ接続するボイラープレートを作成した。

今後

rainbowtype向けに開発ボードをelecrowで作成したので、その紹介を予定。
詳細はぜひrainbowtypeを参照いただければと思う。

少しでも開発者のセキュリティ検討の参考になれれば幸いである。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6