コンテンツにスキップ

「MQTT」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
口調の修正
セキュリティよセキュリティの課題の章を追加、内部リンクの追加と修正
(15人の利用者による、間の23版が非表示)
1行目: 1行目:
{{出典の明記|date=2015年3月30日 (月) 01:50 (UTC)}}
{{出典の明記|date=2015年3月30日 (月) 01:50 (UTC)}}
{{Infobox technology standard|title=MQTT|organization=[[OASIS (組織)|OASIS]]|committee=OASIS Message Queuing Telemetry Transport Technical Committee<ref name=tc_charter>{{cite web|url=https://www.oasis-open.org/committees/mqtt/charter.php|title=OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee Charter|publisher=OASIS|access-date=2020-12-15}}</ref>|website={{url|//mqtt.org/}}|license=|domain=|related_standards=MQTT-SN<ref name=mqttsn_sc>{{cite web|url=https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=mqtt-sn|title=MQTT SN Subcommittee|publisher=OASIS|access-date=2020-12-15}}</ref>|base_standards=|previewDate=|status=公開済み|preview=|versionDate=2019年3月7日|version=5.0<ref name=MQTTv5>[[#MQTTv5|MQTT Version 5.0]]</ref>|year_started=1999|caption=MQTTのロゴ|image=Mqtt-hor.svg|editors=Andrew Banks(IBM)、Ed Briggs(Microsoft)、Ken Borgendale(IBM)、Rahul Gupta(IBM)<ref name=MQTTv5>[[#MQTTv5|MQTT Version 5.0]]</ref>}}
'''MQ Telemetry Transport'''(Message Queue Telemetry Transport、略称 '''MQTT''')は、[[メッセージ指向ミドルウェア]]のアプリケーション層で使用される、TCP/IPによる[[出版-購読型モデル|Pub/Sub型データ配信モデル]]の軽量な[[メッセージキュー]]プロトコルである。
{{IPstack}}
'''MQTT'''(旧称:MQ Telemetry Transport、Message Queuing Telemetry Transport)は、[[メッセージ指向ミドルウェア]]の[[アプリケーション層]]で使用される、[[TCP/IP]]による[[出版-購読型モデル|Pub/Sub型データ配信モデル]]の軽量なデータ[[通信プロトコル|配信プロトコル]]である。


MQTTのMQは、歴史的には[[WebSphere MQ|MQSeries]]から来ているが、[[メッセージキュー]]の機能は持たない。
非力なデバイスやネットワークが不安定な場所でも動作しやすい様にメッセージ通信電文が軽量に設計されている事が特徴。


非力な[[デバイス]]や[[コンピュータネットワーク|ネットワーク]]が不安定な場所でも動作しやすいように、メッセージ通信電文が軽量に設計されていることが特徴である。
[[出版-購読型モデル|Pub/Sub型]]メッセージング·パターンには、メッセージブローカーが必要である。


ブローカーは、メッセージのTopic基づいてそれを必要としているライアントにメッセージ配信をしている。
[[出版-購読型モデル|Pub/Sub型]]メッセージング·パターン[[サーバ]]として{{仮リン|メッセージブローカー|en|Message_broker}}が必要である。


サーバは、メッセージのトピックに基づいて、それを必要としている[[クライアント (コンピュータ)|クライアント]]にメッセージを配布する。
{{仮リンク|アンディー·スタンフォード·クラーク|en|Andy_Stanford-Clark}}とシーラスリンクソリューションのアーレンニッパーは1999年に、プロトコルの最初のバージョンを執筆している。


仕様は[[ロイヤリティフリー]]で公開されていて、現在の仕様は5となっている。<ref>[https://mqtt.org/mqtt-specification/]MQTT Specifications</ref>


== 仕様 ==
== 歴史 ==
1999年に[[IBM]]の{{仮リンク|アンディー・スタンフォード・クラーク|en|Andy Stanford-Clark}}とArcom Control Systemsのアーレンニッパーによりプロトコルの最初のバージョンが執筆された。<ref name=HiveMQ_blog1>{{
仕様はロイヤリティフリーで公開されていて、現在の仕様は3.1となっている。<ref>[http://www.ibm.com/developerworks/jp/websphere/library/wmq/mqtt31_spec/] MQ Telemetry Transport (MQTT) V3.1 プロトコル仕様</ref>
Cite|url=https://www.hivemq.com/blog/the-history-of-mqtt-part-1-the-origin/|title=The Origin of MQTT|author=Ian Craggs|accessdate=2024年8月3日|date=2024年6月20日|publisher=HiveMQ|ref=HiveMQ_blog1
}}</ref>


その年の内にVersion 2を定義し、1999年10月22日にアップデートしたVersion 2.3でVersion3.1.1相当のパケットを備えるものとなった。<ref name=HiveMQ_blog1 /><ref>[[#MQTTv2|MQ Integrator Pervasive Device Protocol Protocol Version 2]]</ref>

2000年にはVersion 3.0がリリースされた。<ref name=HiveMQ_blog1 />

2007年に{{仮リンク|Eurotech|en|Eurotech_(company)}}に買収されたArcom Control Systemsは社名もEurotechに変更したため、MQTTの仕様はIBMとEurotechが管理するものになった。

2010年にVersion 3.1がリリースされた。<ref name=HiveMQ_blog1 />

2014年10月29日にVersion 3.1.1がリリースされ11月13日に発表された。<ref>[[#MQTTv3.1.1| MQTT Version 3.1.1]]</ref><ref>{{Cite web|url=https://www.oasis-open.org/2014/11/13/foundational-iot-messaging-protocol-mqtt-becomes-international-oasis-standard/|title=Foundational IoT Messaging Protocol, MQTT, Becomes International OASIS Standard|author=OASIS|accessdate=2024年8月3日|date=2014年11月13日|publisher=[[OASIS]]}}</ref>
このバージョンからOASISが仕様を管理している。
また、2016年6月に[[国際標準化機構|ISO]]/[[国際電気標準会議|IEC]]標準のISO/IEC 20922:2016として採用された。<ref>[[#ISO20922|ISO/IEC 20922:2016]]</ref>
<ref>{{Cite web|url=https://www.oasis-open.org/2016/07/19/oasis-mqtt-internet-of-things-standard-now-approved-by-iso-iec-jtc1/|title=OASIS MQTT Internet of Things Standard Now Approved by ISO/IEC JTC1|author=OASIS|accessdate=2024年8月3日|date=2016年7月19日|publisher=[[OASIS]]}}</ref>

2019年3月7日にVersion 5.0がリリースされ2019年3月19日に発表された。<ref name=MQTTv5>[[#MQTTv5|MQTT Version 5.0]]</ref><ref>{{Cite web|url=https://www.oasis-open.org/news/announcements/mqtt-v5-0-committee-specification-02-approved-published/|title=#MQTT V5.0 Committee Specification 02 approved & published|author=OASIS|accessdate=2024年8月3日|date=2019年3月19日|publisher=[[OASIS]]}}</ref>


== 特徴 ==
== 特徴 ==
次のな特徴を持っている。
MQTTには次のような特徴がある。


=== 軽量なプロトコル ===
=== 軽量なプロトコル ===
プロトコル電文仕様軽量で且つシンプルになっている。
プロトコル電文仕様軽量でシンプルになっていてヘッダーサイズは最小で2バイトである。<ref name=MQTTv5_3.1>[[#MQTTv3.1|MQTT Version 3.1]]</ref>

* ヘッダーサイズが最小で 2 byte
MQTTはロスレスで順序保証がされた[[双方向通信]]のプロトコル上で動作することが前提となっていて、TCP/IPと[[Transport Layer Security|TLS]]と[[WebSocket]]が仕様で言及されている。<ref name=MQTTv5_4.2>[[#MATTV5.0|MQTT Version 5.0]], 4.2</ref>ただし、これらのプロトコルを使用することに限定はしていない。
* シンプルなプロトコルシーケンス

TLSを使う場合は8883、TLSを使わない場合は1883の[[TCPポート]]が[[IANA]]に登録されている。<ref name=MQTTv5_4.2>[[#MATTV5.0|MQTT Version 5.0]], 4.2</ref>


=== 柔軟性の高いメッセージ配布(Sub:購読) ===
=== 柔軟性の高いメッセージ配布(Sub:購読) ===
配布先条件が"/"区切りの階層構造になっていて且つワイルドカードによる指定ができる。<br />
配布先条件が<code>/</code>区切りの階層構造になっておりさらに[[ワイルドカード (情報処理)|ワイルドカード]]による指定ができる。<ref name=MQTTv5_4.7>[[#MQTTv5|MQTT Version 5.0]], 4.7</ref>
配布先はそのパターンにマッチした宛先になる。
配布先はそのパターンにマッチした宛先になる。
* Topicベースでの[[出版-購読型モデル|Pub/Sub]]
* トピックベースでの[[出版-購読型モデル|Pub/Sub]]
* 1対1、1対N、N対Nのメッセージ配布
* 1対1、1対N、N対Nのメッセージ配布


=== メッセージ配布の品質 ===
=== メッセージ配布の品質 ===
アプリケーションの特性に合わせて三種類のQoS(Quality of Service)レベルの指定ができる。<br />
三種類の [[Quality of Service|QoS (Quality of Service)]] レベルの指定ができる。<ref name=MQTTv5_4.3>[[#MQTTv5|MQTT Version 5.0]], 4.3</ref>

* QoS0:最高1回
QoSレベルは単一の送信者と単一の受信者の間で適用される。<ref name=MQTTv5_4.3>[[#MQTTv5|MQTT Version 5.0]], 4.3</ref>
** メッセージが確実に届く保証はない

** メッセージ配布に失敗しても再送をしない
つまりサーバが同一のメッセージを複数のクライアントに配布を行う場合はそれぞれのクライアントで異なるQoSレベルが使用される場合がある。<ref name=MQTTv5_4.3>[[#MQTTv5|MQTT Version 5.0]], 4.3</ref>
* QoS1:最低1回

** 必ずメッセージ配布するが、重複する可能性がある
またメッセージを配布するクライアントとサーバ間、トピックに応じて配布するサーバとクライアント間でも同じことが言えるためアプリケーションメッセージの品質を定義するものではない。
* QoS2:正確に1回

** 必ずメッセージを配布して、重複も発生しない
==== QoS 0: At most once delivery ====
最高1回の送信を行う。<ref name=MQTTv5_4.3.1>[[#MQTTv5|MQTT Version 5.0]], 4.3.1</ref>
使用している[[トランスポート層]]の性能に応じたメッセージ配布を行う。<ref name=MQTTv5_4.3>[[#MQTTv5|MQTT Version 5.0]], 4.3</ref>
メッセージが確実に届く保証はない。
メッセージ配布に失敗しても再送をしない。

==== QoS 1: At least once delivery ====
最低1回の送信を行う。<ref name=MQTTv5_4.3.2>[[#MQTTv5|MQTT Version 5.0]], 4.3.2</ref>
必ずメッセージを配布するが、重複する可能性がある。

==== QoS 2: Exactly once delivery ====
正確に1回の送信を行う。<ref name=MQTTv5_4.3.3>[[#MQTTv5|MQTT Version 5.0]], 4.3.3</ref>
必ずメッセージを配布して、重複も発生しない。


=== メッセージ再配布機能 ===
=== メッセージ再配布機能 ===
クライアントが再接続をしたときに[[セッション (コンピュータ)|セッション]]が残っている場合はクライアントとサーバの両方が確認応答がないPUBLISHパケットとPUBRELパケットを再送信する。<ref name=MQTTv5_4.4>[[#MQTTv5|MQTT Version 5.0]], 4.4</ref>
メッセージ再配布機能(Durable subscribe)は、次のフローで処理がされる。
# 意図せずにSubscriber(メッセージ配布)通信が切断
# その後、当該のSubscriberが再接続
# 切断から再接続までに発生したメッセージを再送処理
# QoS1,2のメッセージを再配布する


これはメッセージが再配布される唯一の機会である。<ref name=MQTTv5_4.4>[[#MQTTv5|MQTT Version 5.0]], 4.4</ref>
=== Last Will and Testament ===

QoS 0のPUBLISHパケットの再送信は行われない。

=== Willメッセージ ===
クライアントとの接続が正常にクローズされなかったときにサーバによって配布されるメッセージのこと。
<ref name=MQTTv5_1.2>[[#MQTTv5|MQTT Version 5.0]], 1.2</ref>

クライアントがサーバに接続する際にCONNECTパケットにWillフラグとWillメッセージを含める。サーバはCONNECTパケットを受け入れた場合はWillメッセージをセッションに関連付けて保存する。<ref name=MQTTv5_3.1.2.5>[[#MQTTv5|MQTT Version 5.0]], 3.1.2.5</ref>

サーバはクライアントとのネットワーク接続が正常ではない方法でクローズされたとき保存しているWillメッセージを購読している別のクライアントに配布する。<ref name=MQTTv5_3.1.2.5>[[#MQTTv5|MQTT Version 5.0]], 3.1.2.5</ref>

MQTT Version 3.1までの仕様にはLast Will and Testamentと書かれていた。<ref name=MQTTv5_3.1>[[#MQTTv3.1|MQTT Version 3.1]]</ref>
そのためLWTと言う略称で説明される場合がある。<ref>[https://aws.amazon.com/jp/blogs/news/monitor-aws-iot-connections-in-near-real-time-using-mqtt-lwt/ MQTTのLWTを利用してリアルタイムにAWS IoTに接続するデバイスの切断を検出する] Amazon Web Services ブログ 2022年8月18日 2024年7月21日閲覧</ref>


=== Retain ===
=== Retain ===
* ブローカー最後に配布したメッセージは必ず保存
クライアントRetainフラグを有効して配布したメッセージはサーバでトピックごとに上書き保存され。<ref name=MQTTv5_3.3.1.3>[[#MQTTv5|MQTT Version 5.0]], 3.3.1.3</ref>

クライアントがトピックの購読を行った際に保存されたメッセージがある場合はサーバにより購読したクライアントに配布される。

これによりクライアントはトピック購読前の最後のメッセージを受け取ることができる。

=== セキュリティ ===
MQTTは仕様として具体的な[[情報セキュリティ|セキュリティ]]の規定はない。
基本的に実装依存と下位層が持つ既存のセキュリティ技術を利用することとなっている。
ただし以下の言及がある。

CONNECTパケットにユーザネームと[[パスワード]]を含めることができる。<ref name=MQTTv5_3.1.3.5>[[#MQTTv5|MQTT Version 5.0]], 3.1.3.5</ref><ref name=MQTTv5_3.1.3.6>[[#MQTTv5|MQTT Version 5.0]], 3.1.3.6</ref>
これらを使って[[Basic認証]]を行うことができる。<ref name=MQTTv5_4.12>[[#MQTTv5|MQTT Version 5.0]], 4.12</ref>
ただし、これらのフィールドをBasic認証のみに使うことに限定しておらず、パスワードフィールドを[[Bearerトークン|ベアラ認証]]の[[セキュリティトークン|トークン]]を渡すために使うことなども言及している。<ref name=MQTTv5_3.1.3.6>[[#MQTTv5|MQTT Version 5.0]], 3.1.3.6</ref><ref name=MQTTv5_4.12>[[#MQTTv5|MQTT Version 5.0]], 4.12</ref><ref name=MQTTv5_5.4.1>[[#MQTTv5|MQTT Version 5.0]], 5.4.1</ref>
MQTT Version 5.0からユーザネームを省略してパスワードのみクライアントからサーバに通知することができるようになった。<ref group="注釈">[[#MQTTv3.1.1|MQTT Version 3.1.1]]ではUser Name Flagが0の場合Password Flagも0にする必要があった。</ref><ref name=MQTTv3.1.1_3.1.2.9>[[#MQTTv3.1.1|MQTT Version 3.1.1]], 3.1.2.9</ref>

[[認可 (セキュリティ)|認可]]のために先述のユーザネームとパスワード以外にCONNECTパケットに含まれるクライアント識別子や下位層のプロトコルから得られる[[ホスト名]]や[[IPアドレス]]が利用できることも言及している。<ref name=MQTTv5_5.4.2>[[#MQTTv5|MQTT Version 5.0]], 5.4.2</ref>

MQTT Version 5.0からAUTHパケットが追加され、2往復以上の[[ハンドシェイク]]が必要な認証[[アルゴリズム]]にも対応できるようになった。<ref name=MQTTv5_4.12>[[#MQTTv5|MQTT Version 5.0]], 4.12</ref>

[[暗号|暗号化]]はTLSまたは[[VPN]]が利用できることに言及している。<ref name=MQTTv5_5.4.5>[[#MQTTv5|MQTT Version 5.0]], 5.4.5</ref>

OASISに管理が移管されたMQTT Version 3.1.1より、[[アメリカ国立標準技術研究所|NIST]]の[[サイバーセキュリティ#サイバーセキュリティフレームワーク|サイバーセキュリティフレームワーク]]のMQTTを使用する際のガイドラインが用意された。<ref>[[#MQTT NIST|MQTT and the NIST Cybersecurity Framework Version 1.0]]</ref>

== パケットタイプ ==
[[File:MQTT_protocol_example_without_QoS.svg|右|サムネイル|326x326ピクセル|MQTT connection(QoS 0)の例。connect、publish/subscribe、disconnetを行っている。Client Bの最初のメッセージは、retainフラグが付いているため保存されている。]]

=== CONNECT/CONNACK ===
クライアントがサーバーとの接続が確立されるのを待機し、ノード間でセッションを作成する。

MQTT Version 5.0でサーバのオプション機能をクライアントに通知するために多くのパラメータが追加された。<ref name=MQTTv5_AppendixC>[[#MQTTv5|MQTT Version 5.0]], Appendix C</ref>

=== SUBSCRIBE ===
クライアントがサーバにトピックを登録する。<ref name=MQTTv5_3.8>[[#MQTTv5|MQTT Version 5.0]], 3.8</ref>

=== PUBLISH ===
アプリケーションメッセージを配布するためにクライアントからサーバ、またはサーバからクライアントに送信される。<ref name=MQTTv5_3.3>[[#MQTTv5|MQTT Version 5.0]], 3.3</ref>

クライアントからPUBLISHパケットを受信したサーバはトピックを購読しているクライアントにPUBLISHパケットでメッセージの転送を行う。

=== DISCONNECT ===
MQTTクライアントが必要な処理を完了し、[[TCP/IP]]セッションが切断されるのを待機する。

MQTT Version 5.0よりサーバからもDISCONNECTパケットを送信する場合がある。<ref name=MQTTv5_AppendixC>[[#MQTTv5|MQTT Version 5.0]], Appendix C</ref>


== ブローカー ==
== ブローカー ==
{{see also|[[:en:Comparison of MQTT implementations]]}}
MQTTをサポートするブローカー(MQサーバ)は数多くある。
MQTTをサポートするブローカー(MQサーバ)は数多くある。それぞれのサーバがサポートする機能には、基本機能の他、サーバ特有の機能がある<ref>[https://github.com/mqtt/mqtt.github.io/wiki/server-support MQTT Broker Feature Comparison] Feature comparison of the most popular MQTT brokers.</ref>。


主なMQTTブローカーには以下のようなものがある。
それぞれのサーバがサポートする機能には、基本機能の他,サーバ特有の機能を持っている。<ref>[https://github.com/mqtt/mqtt.github.io/wiki/server-support MQTT Broker Feature Comparison] Feature comparison of the most popular MQTT brokers.</ref>


=== OSS ===
主なMQTTブローカーは以下の通り。
* Mosquitto
* IBM MessageSight (商用、ハードウェア)
* [[RabbitMQ]](Pluginが必要)
* IBM WebSphere MQ Telemetry (商用)
* [[Apache_ActiveMQ]]
* 時雨堂 Akane (商用)
* [https://github.com/dotnet/MQTTnet MQTTnet] - .NETによる実装。[[ライブラリ]]であるが、短いコードで拡張可能な独自のブローカーを実装できる。
* Mosquitto (OSS)
* [[RabbitMQ]] (OSS) <sub>※Pluginが必要</sub>
* [[Apache_ActiveMQ]] (OSS)


== 使しているプロジェクト ==
=== ===
* IBM MessageSight([[ハードウェア]])
現実の世界では、MQTTを実装するプロジェクトの数がある。
* IBM WebSphere MQ Telemetry
* MqttDesk MQTT Client - <ref> {{cite web |url=https://ja.ioctrl.com/ |title=Cross-Platform MQTT Client |work=ioctrl.com |accessdate=2021-09-04 |archive-date=2021-09-04 |archive-url=https://web.archive.org/web/20210904195627/https://www.ioctrl.com/ |dead-url=no}}</ref>


== 使用しているプロジェクト ==
=== Facebook Messenger ===
=== Facebook Messenger ===
FacebookのメッセンジャーにMQTTを使用している。
[[Facebook]]のメッセンジャーにMQTTを使用している。


=== IECC Scalable ===
=== IECC Scalable ===
IECCシグナリング制御システムのDeltaRailの最新バージョンではシステムとシグナリングシステムの他の構成要素のさまざまな部分内の通信のためのMQTTを使用している。
DeltaRail Group (現:{{仮リンク|Resonate Group|en|Resonate Group}})の{{仮リンク|IECC|en|Integrated Electronic Control Centre}}シグナリング制御システムの最新バージョンでは[[システム]]とシグナリングシステムの他の構成要素の通信MQTTを使用している。


== 外部ンク ==
== セキュティの課題 ==
2018年8月16日に[[Avast Software]]は[[スマートホーム]]システムの制御で使われるMQTTサーバの多くがパスワードで保護されていないと言うレポートを発表した。<ref>{{Cite web|url=https://blog.avast.com/mqtt-vulnerabilities-hacking-smart-homes|title=Are smart homes vulnerable to hacking?|accessdate=2024年8月24日|date=2018年8月16日|publisher=[[Avast Software]]|author=Martin Hron|language=en}}</ref>
レポートによると全世界で49,000台以上MQTTサーバが公開されており、そのうち32,000台以上がパスワードで保護されておらず通信内容を容易に確認できる。
レポートではMQTTの仕様および実装されたソフトウェアやライブラリにはセキュリティの問題はなくシステム構成時の問題であるとしている。

2018年12月4日に[[トレンドマイクロ]]は[[マシンツーマシン|M2M]]通信プロトコルの[[脆弱性]]に関するレポートを発表した。<ref>{{Cite web|url=https://blog.trendmicro.co.jp/archives/19933?_gl=1*1pn90cv*_ga*MTQ0NzY1OTM4OC4xNzIyNzczODUx*_ga_3DYRMQRSBC*MTcyNDQ2MzMwMS4zLjEuMTcyNDQ2MzM2Ni4wLjAuMA..*_ga_8HHH4Y3BQE*MTcyNDQ2MzMwMS4zLjEuMTcyNDQ2MzM2Ni4wLjAuMA..*_gcl_au*OTQyMTUxMjczLjE3MjI3NzM4NTE.*_ga_JLVFK4B4F6*MTcyNDQ2MzMwMS4zLjEuMTcyNDQ2MzM2Ni4wLjAuMA..*_ga_4H9BVML80W*MTcyNDQ2MzMwMS4zLjEuMTcyNDQ2MzM2Ni42MC4wLjA.|title=マシン・ツー・マシン(M2M)技術における設計および実装上の脆弱性|accessdate=2024年8月24日|date=2018年12月4日|publisher=[[トレンドマイクロ]]|author=Federico Maggi|language=ja}}</ref>
その中でMQTTのトピックに不正な[[UTF-8]]文字列を設定することによる[[DoS攻撃]]と、残り文字数フィールドを利用した[[バッファオーバーフロー]]攻撃が紹介されている。<ref>{{Cite web|url=https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17614|title=CVE-2018-17614|accessdate=2024年8月24日|date=2018年9月28日|publisher=The MITRE Corporation|language=en}}</ref>

2024年3月1日に[[トレンドマイクロ]]はMQTTプロトコルの[[盗聴#通信システムと盗聴|盗聴]]や[[改竄#ITと改竄|改竄]]のリスクについてレポートを発表した。<ref>{{Cite web|url=https://www.trendmicro.com/ja_jp/research/24/c/mqtt-and-m2m-do-you-know-who-owns-your-machines-data.html|title=第三者によるデータの盗聴や改ざんの可能性も:MQTTプロトコルやM2M通信におけるリスク|accessdate=2024年8月24日|date=2024年3月1日|publisher=[[トレンドマイクロ]]|author=Ryan Flores, Charles Perine|language=ja}}</ref>
レポートによるとTLSで保護しているものの認証を必要としないMQTTサーバが数万台ありそのうち9000台程度が実際に稼働している。
レポートは顧客が[[ベンダー]]にセキュリティの確保を求めていない、もしくは認識していないことが原因であると分析している。

== 脚注 ==
=== 注釈 ===
<references group="注釈" />

=== 出典 ===
{{Reflist|colwidth=30em}}
{{Reflist|colwidth=30em}}


== 参考文献 ==
{{Software-stub}}
=== MQTT仕様 ===
* {{Cite web|url=https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html|title=MQTT Version 5.0|accessdate=2024年7月27日|date=2019年3月7日|year=2019|author=[[OASIS_(組織)|OASIS]]|publisher=[[OASIS_(組織)|OASIS]]|language=en|ref=MQTTv5}}
* {{Cite web|url=https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html|title=MQTT Version 3.1.1|accessdate=2024年8月3日|date=2014年10月29日|year=2014|author=[[OASIS_(組織)|OASIS]]|publisher=[[OASIS_(組織)|OASIS]]|language=en|ref=MQTTv3.1.1}}
** {{Cite web|url=https://www.iso.org/standard/69466.html|title=ISO/IEC 20922:2016|accessdate=2024年8月3日|date=2016年6月|publisher=[[国際標準化機構|ISO]]|ref=ISO20922}}
* {{Cite web|url=https://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html|title=MQTT V3.1 Protocol Specification|accessdate=2024年7月27日|year=2010| author=[[IBM]], Eurotech|language=en|ref=MQTTv3.1}}
* {{Cite web|url=https://stanford-clark.com/MQTT/|title=MQTT V3 Protocol Specification|accessdate=2024年8月3日|year=2000|author=[[IBM]], Arcom Control Systems|language=en|ref=MQTTv3}}
* {{Cite web|url=https://stanford-clark.com/MQIpdp/|title="MQ Integrator Pervasive Device Protocol" Specification "MQ/SCADA Protocol" Protocol Version Number: 2|accessdate=2024年8月3日|date=1999年10月22日|year=1999|author=Andy Stanford-Clark, Arlen Nipper|language=en|ref=MQTTv2}}
=== その他関連文献 ===
* {{Cite web|url=https://docs.oasis-open.org/mqtt/mqtt-nist-cybersecurity/v1.0/mqtt-nist-cybersecurity-v1.0.html|title=MQTT and the NIST Cybersecurity Framework Version 1.0|accessdate=2024年8月24日|year=2014| author=[[OASIS_(組織)|OASIS]]|language=en|ref=MQTT NIST}}

== 外部リンク ==
* [https://mqtt.org/ Official site]
* [https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=mqtt Official website of Technical Committee]


{{OSI}}
[[Category:通信プロトコル]]
[[Category:通信プロトコル]]
[[Category:アプリケーション層プロトコル]]
[[Category:アプリケーション層プロトコル]]


{{Software-stub}}
{{Normdaten}}

2024年8月24日 (土) 03:49時点における版

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.org

MQTT(旧称:MQ Telemetry Transport、Message Queuing Telemetry Transport)は、メッセージ指向ミドルウェアアプリケーション層で使用される、TCP/IPによるPub/Sub型データ配信モデルの軽量なデータ配信プロトコルである。

MQTTのMQは、歴史的にはMQSeriesから来ているが、メッセージキューの機能は持たない。

非力なデバイスネットワークが不安定な場所でも動作しやすいように、メッセージ通信電文が軽量に設計されていることが特徴である。

Pub/Sub型メッセージング·パターンには、サーバとしてメッセージブローカー英語版が必要である。

サーバは、メッセージのトピックに基づいて、それを必要としているクライアントにメッセージを配布する。

仕様はロイヤリティフリーで公開されていて、現在の仕様は5となっている。[4]

歴史

1999年にIBMアンディー・スタンフォード・クラーク英語版とArcom Control Systemsのアーレンニッパーによりプロトコルの最初のバージョンが執筆された。[5]

その年の内にVersion 2を定義し、1999年10月22日にアップデートしたVersion 2.3でVersion3.1.1相当のパケットを備えるものとなった。[5][6]

2000年にはVersion 3.0がリリースされた。[5]

2007年にEurotech英語版に買収されたArcom Control Systemsは社名もEurotechに変更したため、MQTTの仕様はIBMとEurotechが管理するものになった。

2010年にVersion 3.1がリリースされた。[5]

2014年10月29日にVersion 3.1.1がリリースされ11月13日に発表された。[7][8] このバージョンからOASISが仕様を管理している。 また、2016年6月にISO/IEC標準のISO/IEC 20922:2016として採用された。[9] [10]

2019年3月7日にVersion 5.0がリリースされ2019年3月19日に発表された。[1][11]

特徴

MQTTには次のような特徴がある。

軽量なプロトコル

プロトコル電文仕様は軽量でシンプルになっていてヘッダーサイズは最小で2バイトである。[12]

MQTTはロスレスで順序保証がされた双方向通信のプロトコル上で動作することが前提となっていて、TCP/IPとTLSWebSocketが仕様で言及されている。[13]ただし、これらのプロトコルを使用することに限定はしていない。

TLSを使う場合は8883、TLSを使わない場合は1883のTCPポートIANAに登録されている。[13]

柔軟性の高いメッセージ配布(Sub:購読)

配布先条件が/区切りの階層構造になっており、さらにワイルドカードによる指定ができる。[14] 配布先はそのパターンにマッチした宛先になる。

  • トピックベースでのPub/Sub
  • 1対1、1対N、N対Nのメッセージ配布

メッセージ配布の品質

三種類の QoS (Quality of Service) レベルの指定ができる。[15]

QoSレベルは単一の送信者と単一の受信者の間で適用される。[15]

つまりサーバが同一のメッセージを複数のクライアントに配布を行う場合はそれぞれのクライアントで異なるQoSレベルが使用される場合がある。[15]

またメッセージを配布するクライアントとサーバ間、トピックに応じて配布するサーバとクライアント間でも同じことが言えるためアプリケーションメッセージの品質を定義するものではない。

QoS 0: At most once delivery

最高1回の送信を行う。[16] 使用しているトランスポート層の性能に応じたメッセージ配布を行う。[15] メッセージが確実に届く保証はない。 メッセージ配布に失敗しても再送をしない。

QoS 1: At least once delivery

最低1回の送信を行う。[17] 必ずメッセージを配布するが、重複する可能性がある。

QoS 2: Exactly once delivery

正確に1回の送信を行う。[18] 必ずメッセージを配布して、重複も発生しない。

メッセージ再配布機能

クライアントが再接続をしたときにセッションが残っている場合はクライアントとサーバの両方が確認応答がないPUBLISHパケットとPUBRELパケットを再送信する。[19]

これはメッセージが再配布される唯一の機会である。[19]

QoS 0のPUBLISHパケットの再送信は行われない。

Willメッセージ

クライアントとの接続が正常にクローズされなかったときにサーバによって配布されるメッセージのこと。 [20]

クライアントがサーバに接続する際にCONNECTパケットにWillフラグとWillメッセージを含める。サーバはCONNECTパケットを受け入れた場合はWillメッセージをセッションに関連付けて保存する。[21]

サーバはクライアントとのネットワーク接続が正常ではない方法でクローズされたとき保存しているWillメッセージを購読している別のクライアントに配布する。[21]

MQTT Version 3.1までの仕様にはLast Will and Testamentと書かれていた。[12] そのためLWTと言う略称で説明される場合がある。[22]

Retain

クライアントがRetainフラグを有効にして配布したメッセージはサーバでトピックごとに上書き保存される。[23]

クライアントがトピックの購読を行った際に保存されたメッセージがある場合はサーバにより購読したクライアントに配布される。

これによりクライアントはトピック購読前の最後のメッセージを受け取ることができる。

セキュリティ

MQTTは仕様として具体的なセキュリティの規定はない。 基本的に実装依存と下位層が持つ既存のセキュリティ技術を利用することとなっている。 ただし以下の言及がある。

CONNECTパケットにユーザネームとパスワードを含めることができる。[24][25] これらを使ってBasic認証を行うことができる。[26] ただし、これらのフィールドをBasic認証のみに使うことに限定しておらず、パスワードフィールドをベアラ認証トークンを渡すために使うことなども言及している。[25][26][27] MQTT Version 5.0からユーザネームを省略してパスワードのみクライアントからサーバに通知することができるようになった。[注釈 1][28]

認可のために先述のユーザネームとパスワード以外にCONNECTパケットに含まれるクライアント識別子や下位層のプロトコルから得られるホスト名IPアドレスが利用できることも言及している。[29]

MQTT Version 5.0からAUTHパケットが追加され、2往復以上のハンドシェイクが必要な認証アルゴリズムにも対応できるようになった。[26]

暗号化はTLSまたはVPNが利用できることに言及している。[30]

OASISに管理が移管されたMQTT Version 3.1.1より、NISTサイバーセキュリティフレームワークのMQTTを使用する際のガイドラインが用意された。[31]

パケットタイプ

MQTT connection(QoS 0)の例。connect、publish/subscribe、disconnetを行っている。Client Bの最初のメッセージは、retainフラグが付いているため保存されている。

CONNECT/CONNACK

クライアントがサーバーとの接続が確立されるのを待機し、ノード間でセッションを作成する。

MQTT Version 5.0でサーバのオプション機能をクライアントに通知するために多くのパラメータが追加された。[32]

SUBSCRIBE

クライアントがサーバにトピックを登録する。[33]

PUBLISH

アプリケーションメッセージを配布するためにクライアントからサーバ、またはサーバからクライアントに送信される。[34]

クライアントからPUBLISHパケットを受信したサーバはトピックを購読しているクライアントにPUBLISHパケットでメッセージの転送を行う。

DISCONNECT

MQTTクライアントが必要な処理を完了し、TCP/IPセッションが切断されるのを待機する。

MQTT Version 5.0よりサーバからもDISCONNECTパケットを送信する場合がある。[32]

ブローカー

MQTTをサポートするブローカー(MQサーバ)は数多くある。それぞれのサーバがサポートする機能には、基本機能の他、サーバ特有の機能がある[35]

主なMQTTブローカーには以下のようなものがある。

OSS

商用

使用しているプロジェクト

Facebook Messenger

FacebookのメッセンジャーにMQTTを使用している。

IECC Scalable

DeltaRail Group (現:Resonate Group英語版)のIECC英語版シグナリング制御システムの最新バージョンではシステムとシグナリングシステムの他の構成要素との通信にMQTTを使用している。

セキュリティの課題

2018年8月16日にAvast Softwareスマートホームシステムの制御で使われるMQTTサーバの多くがパスワードで保護されていないと言うレポートを発表した。[37] レポートによると全世界で49,000台以上MQTTサーバが公開されており、そのうち32,000台以上がパスワードで保護されておらず通信内容を容易に確認できる。 レポートではMQTTの仕様および実装されたソフトウェアやライブラリにはセキュリティの問題はなくシステム構成時の問題であるとしている。

2018年12月4日にトレンドマイクロM2M通信プロトコルの脆弱性に関するレポートを発表した。[38] その中でMQTTのトピックに不正なUTF-8文字列を設定することによるDoS攻撃と、残り文字数フィールドを利用したバッファオーバーフロー攻撃が紹介されている。[39]

2024年3月1日にトレンドマイクロはMQTTプロトコルの盗聴改竄のリスクについてレポートを発表した。[40] レポートによるとTLSで保護しているものの認証を必要としないMQTTサーバが数万台ありそのうち9000台程度が実際に稼働している。 レポートは顧客がベンダーにセキュリティの確保を求めていない、もしくは認識していないことが原因であると分析している。

脚注

注釈

  1. ^ MQTT Version 3.1.1ではUser Name Flagが0の場合Password Flagも0にする必要があった。

出典

  1. ^ a b c MQTT Version 5.0
  2. ^ OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee Charter”. OASIS. 2020年12月15日閲覧。
  3. ^ MQTT SN Subcommittee”. OASIS. 2020年12月15日閲覧。
  4. ^ [1]MQTT Specifications
  5. ^ a b c d Ian Craggs (2024年6月20日), The Origin of MQTT, HiveMQ, https://www.hivemq.com/blog/the-history-of-mqtt-part-1-the-origin/ 2024年8月3日閲覧。 
  6. ^ MQ Integrator Pervasive Device Protocol Protocol Version 2
  7. ^ MQTT Version 3.1.1
  8. ^ OASIS (2014年11月13日). “Foundational IoT Messaging Protocol, MQTT, Becomes International OASIS Standard”. OASIS. 2024年8月3日閲覧。
  9. ^ ISO/IEC 20922:2016
  10. ^ OASIS (2016年7月19日). “OASIS MQTT Internet of Things Standard Now Approved by ISO/IEC JTC1”. OASIS. 2024年8月3日閲覧。
  11. ^ OASIS (2019年3月19日). “#MQTT V5.0 Committee Specification 02 approved & published”. OASIS. 2024年8月3日閲覧。
  12. ^ a b MQTT Version 3.1
  13. ^ a b MQTT Version 5.0, 4.2
  14. ^ MQTT Version 5.0, 4.7
  15. ^ a b c d MQTT Version 5.0, 4.3
  16. ^ MQTT Version 5.0, 4.3.1
  17. ^ MQTT Version 5.0, 4.3.2
  18. ^ MQTT Version 5.0, 4.3.3
  19. ^ a b MQTT Version 5.0, 4.4
  20. ^ MQTT Version 5.0, 1.2
  21. ^ a b MQTT Version 5.0, 3.1.2.5
  22. ^ MQTTのLWTを利用してリアルタイムにAWS IoTに接続するデバイスの切断を検出する Amazon Web Services ブログ 2022年8月18日 2024年7月21日閲覧
  23. ^ MQTT Version 5.0, 3.3.1.3
  24. ^ MQTT Version 5.0, 3.1.3.5
  25. ^ a b MQTT Version 5.0, 3.1.3.6
  26. ^ a b c MQTT Version 5.0, 4.12
  27. ^ MQTT Version 5.0, 5.4.1
  28. ^ MQTT Version 3.1.1, 3.1.2.9
  29. ^ MQTT Version 5.0, 5.4.2
  30. ^ MQTT Version 5.0, 5.4.5
  31. ^ MQTT and the NIST Cybersecurity Framework Version 1.0
  32. ^ a b MQTT Version 5.0, Appendix C
  33. ^ MQTT Version 5.0, 3.8
  34. ^ MQTT Version 5.0, 3.3
  35. ^ MQTT Broker Feature Comparison Feature comparison of the most popular MQTT brokers.
  36. ^ Cross-Platform MQTT Client”. ioctrl.com. 2021年9月4日時点のオリジナルよりアーカイブ。2021年9月4日閲覧。
  37. ^ Martin Hron (2018年8月16日). “Are smart homes vulnerable to hacking?” (英語). Avast Software. 2024年8月24日閲覧。
  38. ^ Federico Maggi (2018年12月4日). “マシン・ツー・マシン(M2M)技術における設計および実装上の脆弱性”. トレンドマイクロ. 2024年8月24日閲覧。
  39. ^ CVE-2018-17614” (英語). The MITRE Corporation (2018年9月28日). 2024年8月24日閲覧。
  40. ^ Ryan Flores, Charles Perine (2024年3月1日). “第三者によるデータの盗聴や改ざんの可能性も:MQTTプロトコルやM2M通信におけるリスク”. トレンドマイクロ. 2024年8月24日閲覧。

参考文献

MQTT仕様

その他関連文献

外部リンク