はじめに#
独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。
前回、このプロジェクトにrainbowtypeと名前を付けました。
構成は上記となり、今回はサーバー側の実装を検討してみます。
rainbowtype serverの実装#
rainbowtype bootloaderとの接続はwebsocketを採用した。
デバイスとの通信でMQTTは使ったことがあったが、websocketではどのようにするのか検討してみる。
MQTTの場合の構成イメージ:
今回の要件をMQTTで実現する場合、下記のイメージとなりそうだ。
MQTTブローカーに対して、複数のrainbowtype bootloader、およびrainbowtype clientがサブスクライブする。
それぞれがステータスをパブリッシュし共有する。
ブローカーはメッセージのルーティングなどは行わず、そのままを流すので、接続端末側でメッセージの中で自身に関係ないものはドロップするような処理が必要になる。
一方websocketはもっと低レイヤーな実装になる。
MQTT over websocketという実装もあったり、よくあるチャットアプリの実装例のように、ブラウザとサーバー間のリアルタイム通信に使う例が多い。
websocketは1対1の通信のみを取り扱うため、ルーティングは別途実装する必要がある。
そこでwebsocket serverに提示されるデバイス証明書のコモンネームを使って接続元識別を行い、インスタンス(接続毎の実体)の配列を作成し、メッセージ内に書かれた宛先情報と配列内に保存しておいたコモンネームが一致するインスタンスを見つけ、そのインスタンスのsendメソッドを使ってメッセージ送信を行う方法を構築した。
余計な相手に情報を送らなくてもいい点はセキュリティ強化によいだろう。
調査しきれていないが、Socket.io、Crossbar.ioなどがルーティングを合わせて提供する
Web Application Messaging Protocol(WAMP)という実装を実現しているようだ。
マイコンレベルまで対応クライアントが出てくれば使いやすいかもしれない。