はじめに
3分で読める記事です。
IoTデバイスのセキュリティの勉強してます。
その一環でIoTネットワークに使われているプロトコルの勉強してみました。
4行で説明
・アプリケーション層プロトコル
・省電力/軽量(IoTデバイスに向いてる)
・Publish/Subscribe型
・ちゃんとパスワード設定しよう!!!
もうちょっと詳しく
IoTデバイスによく使われるデータ伝送プロトコルの代表です。
昔はHTTPが主流だったのですが、IoTデバイスの小型化・増加に伴いこっちが使われるようになりました。
(他にも、MQTTを高機能化したAMQPや産業向けのCoAPとかもあります。)
HTTPとMQTTの比較
HTTPとMQTTの比較をおおまかに表にしてみます。
短いヘッダ長によって、HTTP通信の10分の1程度の消費電力を実現しています。[1]
(状況によって大幅に変わります)
そのヘッダ長は驚きの2バイトです。(後で詳しくみます)
また、Publish/Subscribe型というネットワーク構成によって一対多・双方向・非同期通信を実現してます(これも後で詳しくみます)
Publish/Subscribe型って?
Publisher(データを送るデバイス)、Broker(データを中継するサーバ)、Subscriber(データを受け取るデバイス)の3つから構成されるネットワークです。
Brokerさんがデータを中継してくれるお陰で、Subscriberはすぐにデータを受け取らなくていいし(非同期通信)、色んなデバイスが同じ情報を受け取ることができます(1対多の通信)。また、PublisherとSubscriberの関係は入れ替わることもできます(双方向通信)。
もう少し正確に
ヘッダの中身
2バイトって逆に何が入ってるねんって感じなんですけど、基本的に上の3つです。
メッセージタイプ
Connect、Subscribeなどメッセージの形式の指定
固有フラグ
メッセージタイプがPublishの時以外あまり関係ないです。
Publishのときは、以下のようにフラグが設定されます。
bit3 | bit2 | bit1 | bit0 |
---|---|---|---|
DUP | QoS | QoS | RETAIN |
DUP:パケットが重複しているか否かのフラグ。何らかの要因でパケットを再配信するときはDUPフラグが1になる
QoS:送信の品質を3段階で指定します。[3]
QoS0:パケットを一度だけ送信する(到達保障なし)
QoS1:パケットが到達したことを確認する(重複して到達する可能性あり)
QoS2:パケットを正確に1度だけ送信する(到達の確認の確認を行う)
RETAIN:フラグが1になっているものでtopicごとに最新のものだけ、Brokerで保持されます。新たなSubscriberが登録されたとき、要求されたtopicごとに最新のものが自動的に送信されます。
残りの長さ
読んで字のごとく、固定ヘッダを除いたパケットの長さです。
MQTTの課題(セキュリティ面)
MQTTはTLSで暗号化することができるので、通信面で脆弱性は持っていません。(その分伝送効率悪くなるけど…)
ただし、Brokerサーバがパスワードがかけられずに放置されている例が非常に多いです。(『Shodan』というサイトで確認可能)
Brokerサーバは中継地点であるため、行き来するすべての情報が読めてしまいます。
パスワード設定しよう!!!
最近の研究
セキュリティに関する研究はあんまなかったです。。
ほとんどHTTPやWebsocketとの性能比較の研究ばっかりのイメージ
軽量暗号に関する研究くらい?
あれば教えてくださいm(_ _)m
おわりに
読んでいただきありがとうございました。
おおまかにしか書きませんでしたので、間違っていましたら指摘いただけると嬉しいです。
正確な情報が知りたい方は参考文献[2]をご参照ください。
参考文献
[1]かもめエンジニアリング『MQTTとは』
[2]MQTT Version 3.1.1
[3]さきブログ『QoSとは?MQTTにおける通信の種類!』