MQTT
MQTTのロゴ | |
ステータス | 公開済み |
---|---|
開始年 | 1999 |
最新版 |
5.0[1] 2019年3月7日 |
組織 | OASIS |
委員会 | OASIS Message Queuing Telemetry Transport Technical Committee[2] |
編集者 | Andrew Banks(IBM)、Ed Briggs(Microsoft)、Ken Borgendale(IBM)、Rahul Gupta(IBM)[1] |
関連する標準 | MQTT-SN[3] |
ウェブサイト |
mqtt |
TCP/IP群 |
---|
アプリケーション層 |
|
トランスポート層 |
カテゴリ |
インターネット層 |
カテゴリ |
リンク層 |
カテゴリ |
MQTT(旧称:MQ Telemetry Transport、Message Queuing Telemetry Transport)は、メッセージ指向ミドルウェアのアプリケーション層で使用される、TCP/IPによるPub/Sub型データ配信モデルの軽量なデータ配信プロトコルである。
MQTTのMQは、歴史的にはMQSeriesから来ているが、メッセージキューの機能は持たない[4]。
非力なデバイスやネットワークが不安定な場所でも動作しやすいように、メッセージ通信電文が軽量に設計されていることが特徴である。
Pub/Sub型メッセージング·パターンには、サーバとしてメッセージブローカーが必要である。
サーバは、メッセージのトピックに基づいて、それを必要としているクライアントにメッセージを配布する。
仕様はロイヤリティフリーで公開されていて、現在の仕様は5となっている[5]。
歴史
[編集]1999年にIBMのアンディー・スタンフォード・クラークとArcom Control Systemsのアーレンニッパーによりプロトコルの最初のバージョンが執筆された[6]。
その年の内にVersion 2を定義し、1999年10月22日にアップデートしたVersion 2.3でVersion3.1.1相当のパケットを備えるものとなった[6][7]。
2000年にはVersion 3.0がリリースされた[6]。
2007年にEurotechに買収されたArcom Control Systemsは社名もEurotechに変更したため、MQTTの仕様はIBMとEurotechが管理するものになった。
2010年にVersion 3.1がリリースされた[6]。 このバージョンからロイヤリティフリーで公開されている[4]。
2011年にEclipse Foundationが設立したPahoプロジェクトにIBMからMQTTクライアントの実装が提供された[4]。
2014年10月29日にVersion 3.1.1がリリースされ11月13日に発表された[8][9]。 このバージョンからOASISが仕様を管理している。 また、2016年6月にISO/IEC標準のISO/IEC 20922:2016として採用された。[10] [11]。
2019年3月7日にVersion 5.0がリリースされ2019年3月19日に発表された[1][12]。
特徴
[編集]MQTTには次のような特徴がある。
軽量なプロトコル
[編集]プロトコル電文仕様は軽量でシンプルになっていてヘッダーサイズは最小で2バイトである[13]。
MQTTはロスレスで順序保証がされた双方向通信のプロトコル上で動作することが前提となっていて、TCP/IPとTLSとWebSocketが仕様で言及されている[14]。ただし、これらのプロトコルを使用することに限定はしていない。
TLSを使う場合は8883、TLSを使わない場合は1883のTCPポートがIANAに登録されている[14]。
柔軟性の高いメッセージ配布(Sub:購読)
[編集]配布先条件が/
区切りの階層構造になっており、さらにワイルドカードによる指定ができる[15]。
配布先はそのパターンにマッチした宛先になる。
- トピックベースでのPub/Sub
- 1対1、1対N、N対Nのメッセージ配布
メッセージ配布の品質
[編集]三種類の QoS (Quality of Service) レベルの指定ができる[16]。
QoSレベルは単一の送信者と単一の受信者の間で適用される[16]。
つまりサーバが同一のメッセージを複数のクライアントに配布を行う場合はそれぞれのクライアントで異なるQoSレベルが使用される場合がある[16]。
またメッセージを配布するクライアントとサーバ間、トピックに応じて配布するサーバとクライアント間でも同じことが言えるためアプリケーションメッセージの品質を定義するものではない。
QoS 0: At most once delivery
[編集]最高1回の送信を行う[17]。 使用しているトランスポート層の性能に応じたメッセージ配布を行う[16]。 メッセージが確実に届く保証はない。 メッセージ配布に失敗しても再送をしない。
QoS 1: At least once delivery
[編集]最低1回の送信を行う[18]。 必ずメッセージを配布するが、重複する可能性がある。
QoS 2: Exactly once delivery
[編集]正確に1回の送信を行う[19]。 必ずメッセージを配布して、重複も発生しない。
メッセージ再配布機能
[編集]クライアントが再接続をしたときにセッションが残っている場合はクライアントとサーバの両方が確認応答がないPUBLISHパケットとPUBRELパケットを再送信する[20]。
これはメッセージが再配布される唯一の機会である[20]。
QoS 0のPUBLISHパケットの再送信は行われない。
Willメッセージ
[編集]クライアントとの接続が正常にクローズされなかったときにサーバによって配布されるメッセージのこと[21]。
クライアントがサーバに接続する際にCONNECTパケットにWillフラグとWillメッセージを含める。サーバはCONNECTパケットを受け入れた場合はWillメッセージをセッションに関連付けて保存する[22]。
サーバはクライアントとのネットワーク接続が正常ではない方法でクローズされたとき保存しているWillメッセージを購読している別のクライアントに配布する[22]。
MQTT Version 3.1までの仕様にはLast Will and Testamentと書かれていた[13]。 そのためLWTと言う略称で説明される場合がある[23]。
Retain
[編集]クライアントがRetainフラグを有効にして配布したメッセージはサーバでトピックごとに上書き保存される[24]。
クライアントがトピックの購読を行った際に保存されたメッセージがある場合はサーバにより購読したクライアントに配布される。
これによりクライアントはトピック購読前の最後のメッセージを受け取ることができる。
セキュリティ
[編集]MQTTは仕様として具体的なセキュリティの規定はない。 基本的に実装依存と下位層が持つ既存のセキュリティ技術を利用することとなっている。 ただし以下の言及がある。
CONNECTパケットにユーザネームとパスワードを含めることができる[25][26]。 これらを使ってBasic認証を行うことができる[27]。 ただし、これらのフィールドをBasic認証のみに使うことに限定しておらず、パスワードフィールドをBearerトークンを渡すために使うことなども言及している[26][27][28]。 MQTT Version 5.0からユーザネームを省略してパスワードのみクライアントからサーバに通知することができるようになった[注釈 1][29]。
認可のために先述のユーザネームとパスワード以外にCONNECTパケットに含まれるクライアント識別子や下位層のプロトコルから得られるホスト名やIPアドレスが利用できることも言及している[30]。
暗号化はTLSまたはVPNが利用できることに言及している[31]。
OASISに管理が移管されたMQTT Version 3.1.1より、NISTのサイバーセキュリティフレームワークのMQTTを使用する際のガイドラインが用意された[32][33]。
パケットタイプ
[編集]MQTT Version 5.0では15種類のパケットタイプが定義されている[34]。 パケットは固定ヘッダ、可変ヘッダ、ペイロードの3つの部分で構成される[35][36]。
MQTTのパケットタイプは以下の3種類に分類される[36]。
コネクションの接続・切断
[編集]CONNECT、CONNACK、DISCONNECT、AUTH[注釈 2]、PINGREQ、PINGRESPが分類される[36]。
クライアントが自身の能力を示すパラメータを含むCONNECTを送信し、サーバがCONNACKで結果を返すことで通信が開始される[36]。 MQTT Version 5.0でサーバのオプション機能をクライアントに通知するためにCONNACKに多くのパラメータが追加された[37]。
クライアントのシャットダウンやエラーなどの要因によりクライアントがDISCONNECTを送信することで通信が終了する[36]。 MQTT Version 5.0よりサーバからもDISCONNECTを送信する場合がある[37]。
接続を維持するためにPINGREQとPINGRESPが使用される[36]。 Keep Aliveが目的なのでこのタイマーの満了前にクライアントからPINGREQが送信され、サーバがPINGRESPで応答することで接続が維持される[36]。
認証を強化するためにMQTT Version 5.0でAUTHが追加された[36]。 2往復以上のハンドシェイクが必要な認証アルゴリズム行う場合や、通信中の再認証が必要になった場合に使用される[27]。 クライアント・サーバの双方から手順が開始される可能性がある。
メッセージの配布
[編集]PUBLISH、PUBACK、PUBREC、PUBREL、PUBCOMPが分類される[36]。
メッセージ配布はPUBLISHで開始される[36]。 PUBLISHはクライアントによるメッセージの配布とサーバによるメッセージの転送の2パターンで使用される。 そのためここに分類されるパケットタイプはクライアント・サーバともに送信・受信のいずれの場合もありうる。
QoS 1の場合はメッセージ配布が完了したことを示すためにPUBACKがPUBLISHの受信側から送信される[18]。
QoS 2の場合はメッセージ配布が完了したことを示すPUBREC、メッセージ配布に関するリソースが不要になったことを示すPUBREL、PUBCOMPが追加で使われる[19]。
トピックの購読・キャンセル
[編集]SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACKが分類される[36]。
クライアントは購読したいトピックをフィルタリングするための文字列をUTF-8エンコードしてSUBSCRIBEで送信し、サーバがSUBACKで結果を返す[36]。
購読をキャンセルするときはクライアントがUNSUBSCRIBEを送信し、サーバがUNSUBACKで結果を返す[36]。
ブローカー
[編集]MQTTをサポートするブローカー(MQサーバ)は数多くある。それぞれのサーバがサポートする機能には、基本機能の他、サーバ特有の機能がある[38]。
主なMQTTブローカーには以下のようなものがある。
OSS
[編集]- Mosquitto
- RabbitMQ(Pluginが必要)
- Apache_ActiveMQ
- MQTTnet - .NETによる実装。ライブラリであるが、短いコードで拡張可能な独自のブローカーを実装できる。
商用
[編集]使用しているプロジェクト
[編集]Facebook Messenger
[編集]FacebookのメッセンジャーにMQTTを使用している。
IECC Scalable
[編集]DeltaRail Group (現:Resonate Group)のIECCシグナリング制御システムの最新バージョンではシステムとシグナリングシステムの他の構成要素との通信にMQTTを使用している。
セキュリティの課題
[編集]2018年8月16日にAvast Softwareはスマートホームシステムの制御で使われるMQTTサーバの多くがパスワードで保護されていないと言うレポートを発表した[40]。 レポートによると全世界で49,000台以上MQTTサーバが公開されており、そのうち32,000台以上がパスワードで保護されておらず通信内容を容易に確認できる。 レポートではMQTTの仕様および実装されたソフトウェアやライブラリにはセキュリティの問題はなくシステム構成時の問題であるとしている。
2018年12月4日にトレンドマイクロはM2M通信プロトコルの脆弱性に関するレポートを発表した[41]。 その中でMQTTのトピックに不正なUTF-8文字列を設定することによるDoS攻撃と、残り文字数フィールドを利用したバッファオーバーフロー攻撃が紹介されている[42]。
2024年3月1日にトレンドマイクロはMQTTプロトコルの盗聴や改竄のリスクについてレポートを発表した[43]。 レポートによるとTLSで保護しているものの認証を必要としないMQTTサーバが数万台ありそのうち9000台程度が実際に稼働している。 レポートは顧客がベンダーにセキュリティの確保を求めていない、もしくは認識していないことが原因であると分析している。
脚注
[編集]注釈
[編集]- ^ MQTT Version 3.1.1ではUser Name Flagが0の場合Password Flagも0にする必要があった。
- ^ MQTT Version 3.1.1より前の仕様では定義されていない
出典
[編集]- ^ a b c MQTT Version 5.0
- ^ “OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee Charter”. OASIS. 2020年12月15日閲覧。
- ^ “MQTT SN Subcommittee”. OASIS. 2020年12月15日閲覧。
- ^ a b c HiveMQ Team (2024年2月14日), Introducing the MQTT Protocol – MQTT Essentials: Part 1T, HiveMQ 2024年10月27日閲覧。
- ^ [1]MQTT Specifications
- ^ a b c d Ian Craggs (2024年6月20日), The Origin of MQTT, HiveMQ 2024年8月3日閲覧。
- ^ MQ Integrator Pervasive Device Protocol Protocol Version 2
- ^ MQTT Version 3.1.1
- ^ OASIS (2014年11月13日). “Foundational IoT Messaging Protocol, MQTT, Becomes International OASIS Standard”. OASIS. 2024年8月3日閲覧。
- ^ ISO/IEC 20922:2016
- ^ OASIS (2016年7月19日). “OASIS MQTT Internet of Things Standard Now Approved by ISO/IEC JTC1”. OASIS. 2024年8月3日閲覧。
- ^ OASIS (2019年3月19日). “#MQTT V5.0 Committee Specification 02 approved & published”. OASIS. 2024年8月3日閲覧。
- ^ a b MQTT Version 3.1
- ^ a b MQTT Version 5.0, 4.2
- ^ MQTT Version 5.0, 4.7
- ^ a b c d MQTT Version 5.0, 4.3
- ^ MQTT Version 5.0, 4.3.1
- ^ a b MQTT Version 5.0, 4.3.2
- ^ a b MQTT Version 5.0, 4.3.3
- ^ a b MQTT Version 5.0, 4.4
- ^ MQTT Version 5.0, 1.2
- ^ a b MQTT Version 5.0, 3.1.2.5
- ^ MQTTのLWTを利用してリアルタイムにAWS IoTに接続するデバイスの切断を検出する Amazon Web Services ブログ 2022年8月18日 2024年7月21日閲覧
- ^ MQTT Version 5.0, 3.3.1.3
- ^ MQTT Version 5.0, 3.1.3.5
- ^ a b MQTT Version 5.0, 3.1.3.6
- ^ a b c MQTT Version 5.0, 4.12
- ^ MQTT Version 5.0, 5.4.1
- ^ MQTT Version 3.1.1, 3.1.2.9
- ^ MQTT Version 5.0, 5.4.2
- ^ MQTT Version 5.0, 5.4.5
- ^ MQTT and the NIST Cybersecurity Framework Version 1.0
- ^ Ian Craggs (2024年7月17日), How MQTT 3.1.1 Was Standardized, HiveMQ 2024年10月27日閲覧。
- ^ MQTT Version 5.0, 2.1.2
- ^ MQTT Version 5.0, 2.1
- ^ a b c d e f g h i j k l m HiveMQ Team (2024年7月22日), MQTT Packets: A Comprehensive Guide, HiveMQ 2024年10月27日閲覧。
- ^ a b MQTT Version 5.0, Appendix C
- ^ MQTT Broker Feature Comparison Feature comparison of the most popular MQTT brokers.
- ^ “Cross-Platform MQTT Client”. ioctrl.com. 2021年9月4日時点のオリジナルよりアーカイブ。2021年9月4日閲覧。
- ^ Martin Hron (2018年8月16日). “Are smart homes vulnerable to hacking?” (英語). Avast Software. 2024年8月24日閲覧。
- ^ Federico Maggi (2018年12月4日). “マシン・ツー・マシン(M2M)技術における設計および実装上の脆弱性”. トレンドマイクロ. 2024年8月24日閲覧。
- ^ “CVE-2018-17614” (英語). The MITRE Corporation (2018年9月28日). 2024年8月24日閲覧。
- ^ Ryan Flores, Charles Perine (2024年3月1日). “第三者によるデータの盗聴や改ざんの可能性も:MQTTプロトコルやM2M通信におけるリスク”. トレンドマイクロ. 2024年8月24日閲覧。
参考文献
[編集]MQTT仕様
[編集]- OASIS (2019年3月7日). “MQTT Version 5.0” (英語). OASIS. 2024年7月27日閲覧。
- OASIS (2014年10月29日). “MQTT Version 3.1.1” (英語). OASIS. 2024年8月3日閲覧。
- “ISO/IEC 20922:2016”. ISO (2016年6月). 2024年8月3日閲覧。
- IBM, Eurotech (2010年). “MQTT V3.1 Protocol Specification” (英語). 2024年7月27日閲覧。
- IBM, Arcom Control Systems (2000年). “MQTT V3 Protocol Specification” (英語). 2024年8月3日閲覧。
- Andy Stanford-Clark, Arlen Nipper (1999年10月22日). “"MQ Integrator Pervasive Device Protocol" Specification "MQ/SCADA Protocol" Protocol Version Number: 2” (英語). 2024年8月3日閲覧。
その他関連文献
[編集]- OASIS (2014年). “MQTT and the NIST Cybersecurity Framework Version 1.0” (英語). 2024年8月24日閲覧。
外部リンク
[編集]