Ubuntu 18.04にMosquitto MQTT Messaging Brokerをインストールして保護する方法

前書き

MQTTは、「モノのインターネット」デバイスへの軽量なパブリッシュ/サブスクライブ通信を提供するために設計されたマシンツーマシンメッセージングプロトコルです。 一般的には、車両のジオトラッキング車両、ホームオートメーション、環境センサーネットワーク、ユーティリティスケールのデータ収集に使用されます。

Mosquittoは人気のあるMQTTサーバー(またはMQTT用語では_broker_)であり、優れたコミュニティサポートがあり、インストールと構成が簡単です。

このチュートリアルでは、Mosquittoをインストールし、SSLを使用してパスワードで保護されたMQTT通信を保護するようにブローカーを設定します。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

ステップ1-Mosquittoのインストール

Ubuntu 18.04には、デフォルトのソフトウェアリポジトリにかなり新しいバージョンのMosquittoが含まれているため、そこからインストールできます。

最初に、非rootユーザーを使用してログインし、 `+ apt update +`を使用してパッケージリストを更新します。

sudo apt update

次に、 `+ apt install`を使用してMosquittoをインストールします。

sudo apt install mosquitto mosquitto-clients

デフォルトでは、Ubuntuはインストール後にMosquittoサービスを開始します。 デフォルトの構成をテストしましょう。 インストールしたMosquittoクライアントの1つを使用して、ブローカーのトピックをサブスクライブします。

_Topics_は、メッセージを発行および購読するラベルです。 これらは階層として配置されているため、たとえば、「+ sensors / outside / temp 」および「 sensors / outside / humidity +」を使用できます。 トピックの配置方法は、あなたとあなたのニーズ次第です。 このチュートリアルでは、簡単なテストトピックを使用して構成の変更をテストします。

サーバーに2回ログインすると、2つの端末が並んでいます。 新しいターミナルで、 `+ mosquitto_sub +`を使用してテストトピックにサブスクライブします。

mosquitto_sub -h localhost -t test

`+ -h `はMQTTサーバーのホスト名を指定するために使用され、 ` -t `はトピック名です。 「 mosquitto_sub 」はメッセージの到着を待機しているため、「 ENTER +」を押しても出力は表示されません。 他の端末に切り替えて、メッセージを公開します。

mosquitto_pub -h localhost -t test -m "hello world"

`+ mosquitto_pub `のオプションは ` mosquitto_sub `と同じですが、今回は追加の ` -m `オプションを使用してメッセージを指定します。 ` ENTER +`を押すと、他のターミナルに* hello world *ポップアップが表示されます。 最初のMQTTメッセージを送信しました!

2番目のターミナルで「+ CTRL + C 」と入力して「 mosquitto_sub +」を終了しますが、サーバーへの接続は開いたままにします。 手順5の別のテストで再び使用します。

次に、パスワードベースの認証を使用してインストールを保護します。

ステップ2-MQTTパスワードの構成

パスワードを使用するようにMosquittoを設定しましょう。 Mosquittoには、 `+ mosquitto_passwd `という特別なパスワードファイルを生成するユーティリティが含まれています。 このコマンドは、指定されたユーザー名のパスワードを入力するように促し、結果を ` / etc / mosquitto / passwd +`に配置します。

sudo mosquitto_passwd -c /etc/mosquitto/passwd

次に、Mosquittoの新しい構成ファイルを開き、このパスワードファイルを使用してすべての接続にログインを要求するように指示します。

sudo nano /etc/mosquitto/conf.d/default.conf

これにより、空のファイルが開きます。 以下に貼り付けます。

/etc/mosquitto/conf.d/default.conf

allow_anonymous false
password_file /etc/mosquitto/passwd

ファイルの最後に必ず末尾の改行を残してください。

`+ allow_anonymous false `は認証されていない接続をすべて無効にし、 ` password_file +`行はMosquittoにユーザーとパスワードの情報を探す場所を伝えます。 ファイルを保存して終了します。

次に、Mosquittoを再起動して、変更をテストする必要があります。

sudo systemctl restart mosquitto

パスワードなしでメッセージを公開してみてください:

mosquitto_pub -h localhost -t "test" -m "hello world"

メッセージは拒否されるべきです:

OutputConnection Refused: not authorised.
Error: The connection was refused.

パスワードを再試行する前に、2番目のターミナルウィンドウに再度切り替えて、今回はユーザー名とパスワードを使用して「テスト」トピックにサブスクライブします。

mosquitto_sub -h localhost -t test -u "" -P ""

接続して座って、メッセージを待つ必要があります。 定期的にテストメッセージを送信するため、このターミナルを開いたままにしてチュートリアルの残りの部分で接続しておくことができます。

ユーザー名とパスワードを使用して、もう一方の端末でメッセージを公開します。

mosquitto_pub -h localhost -t "test" -m "hello world" -u "" -P ""

メッセージはステップ1のように通過するはずです。 Mosquittoにパスワード保護を追加しました。 残念ながら、暗号化されていないパスワードをインターネット経由で送信しています。 次に、MosquittoにSSL暗号化を追加して、これを修正します。

ステップ3-MQTT SSLの構成

SSL暗号化を有効にするには、Let’s Encrypt証明書の保存場所をMosquittoに伝える必要があります。 以前に開始した構成ファイルを開きます。

sudo nano /etc/mosquitto/conf.d/default.conf

ファイルの最後に以下を貼り付けて、追加した2行を残します。

/etc/mosquitto/conf.d/default.conf

. . .
listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

繰り返しになりますが、ファイルの最後に必ず末尾の改行を残してください。

2つの個別の「+ listener 」ブロックを設定に追加しています。 最初の ` listener 1883 localhost `は、ポート ` 1883 `上のデフォルトのMQTTリスナーを更新します。これはこれまで接続してきたものです。 ` 1883 `は標準の暗号化されていないMQTTポートです。 行の「 localhost +」部分は、Mosquittoにこのポートをローカルホストインターフェースにのみバインドするように指示するため、外部からはアクセスできません。 いずれにせよ、外部リクエストはファイアウォールによってブロックされていたはずですが、明示するのは良いことです。

`+ listener 8883 `はポート ` 8883 `に暗号化されたリスナーを設定します。 これは、MQTT + SSLの標準ポートであり、MQTTSとも呼ばれます。 次の3行、「 certfile 」、「 cafile 」、および「 keyfile +」はすべて、Mosquittoが適切なLet’s Encryptファイルを指し、暗号化された接続をセットアップします。

ファイルを保存して終了し、Mosquittoを再起動して設定を更新します。

sudo systemctl restart mosquitto

ファイアウォールを更新して、ポート「8883」への接続を許可します。

sudo ufw allow 8883
OutputRule added
Rule added (v6)

次に、SSLのいくつかの異なるオプションを使用して、 `+ mosquitto_pub +`を使用して再度テストします。

mosquitto_pub -h  -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "" -P ""

`+ localhost `の代わりに完全なホスト名を使用していることに注意してください。 SSL証明書は「+」に対して発行されるため、「+ localhost +」への安全な接続を試みると、ホスト名が証明書のホスト名と一致しないというエラーが表示されます(どちらも同じMosquittoサーバーを指している場合でも) 。

`-capath / etc / ssl / certs / +`は ` mosquitto_pub `のSSLを有効にし、ルート証明書を探す場所を指示します。 これらは通常、オペレーティングシステムによってインストールされるため、Mac OS、Windowsなどではパスが異なります。 ` mosquitto_pub`は、ルート証明書を使用して、Mosquitoサーバーの証明書がLet’s Encrypt認証局によって適切に署名されたことを確認します。 `+ mosquitto_pub `と ` mosquitto_sub `は、このオプション(または同様の `-cafile +`オプション)なしでは、標準のセキュアポート `+に接続している場合でもSSL接続を試行しないことに注意することが重要です。 8883 + `。

すべてがテストで問題なければ、もう1つの「+ mosquitto_sub +」ターミナルに* helloが再び表示されます。 これは、サーバーが完全にセットアップされたことを意味します! MQTTプロトコルを拡張してWebソケットで動作するようにしたい場合は、最後の手順に従ってください。

ステップ4-Websocket上のMQTTの構成(オプション)

Webブラウザ内からJavaScriptを使用してMQTTを話すために、プロトコルは標準のWebソケット上で動作するように適合されました。 この機能が必要ない場合は、この手順をスキップできます。

Mosquittoの設定にもう1つの `+ listener +`ブロックを追加する必要があります。

sudo nano /etc/mosquitto/conf.d/default.conf

ファイルの最後に、次を追加します。

/etc/mosquitto/conf.d/default.conf

. . .
listener 8083
protocol websockets
certfile /etc/letsencrypt/live//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

繰り返しになりますが、ファイルの最後に必ず末尾の改行を残してください。

これは、ポート番号と `+ protocol websockets `行を除いて、前のブロックとほとんど同じです。 Websocketを介したMQTTの公式の標準化されたポートはありませんが、「 8083+」が最も一般的です。

ファイルを保存して終了し、Mosquittoを再起動します。

sudo systemctl restart mosquitto

ここで、ファイアウォールのポート「8083」を開きます。

sudo ufw allow 8083

この機能をテストするには、ブラウザベースの公開MQTTクライアントを使用します。 いくつかありますが、https://www.eclipse.org/paho/clients/js/utility/ [Eclipse Paho JavaScript Client]はシンプルで簡単に使用できます。 https://www.eclipse.org/paho/clients/js/utility/ [ブラウザでPahoクライアントを開きます]。 以下が表示されます。

image:http://assets.digitalocean.com/articles/mosquitto/paho.png [Pahoクライアント画面]

接続情報を次のように入力します。

  • * Host *は、Mosquittoサーバーのドメイン「++」である必要があります。

  • *ポート*は `+ 8083 +`でなければなりません。

  • * ClientId は、デフォルト値 js-utility-DI1m6 *のままにすることができます。

  • * Path はデフォルト値 / ws *のままにすることができます。

  • ユーザー名*はMosquittoユーザー名でなければなりません。ここでは、 sammy *を使用しました。

  • * Password *は、選択したパスワードです。

残りのフィールドはデフォルト値のままにすることができます。

*接続*を押すと、PahoブラウザーベースのクライアントがMosquittoサーバーに接続します。

メッセージを公開するには、* Publish Message ペインに移動し、 Topic test として記入し、 Message *セクションにメッセージを入力します。 次に、*公開*を押します。 メッセージは `+ mosquitto_sub`ターミナルに表示されます。

結論

これで、セキュリティで保護され、パスワードで保護され、SSLで保護されたMQTTサーバーをセットアップしました。 これは、どんなプロジェクトを考えても、堅牢で安全なメッセージングプラットフォームとして機能します。 MQTTプロトコルで適切に機能する一般的なソフトウェアとハ​​ードウェアには次のものがあります。

  • OwnTracks、携帯電話にインストールできるオープンソースの地理追跡アプリ。 OwnTracksは定期的に位置情報をMQTTサーバーに報告します。MQTTサーバーは、マップに保存して表示したり、位置に基づいてアラートを作成してIoTハードウェアをアクティブにしたりできます。

  • Node-REDは、モノのインターネットを「配線」するためのブラウザベースのグラフィカルインターフェイスです。 あるノードの出力を別のノードの入力にドラッグすると、フィルターを介して、さまざまなプロトコル間で、データベースなどに情報をルーティングできます。 MQTTはNode-REDで非常によくサポートされています。

  • ESP8266は、MQTT機能を備えた安価なwifiマイクロコントローラーです。 温度データをトピックに公開するために配線するか、気圧のトピックにサブスクライブして、嵐が来ているときにブザーを鳴らすことができます!

これらは、MQTTエコシステムの一般的な例のほんの一部です。 プロトコルを話すハードウェアとソフトウェアがはるかに多くあります。 お気に入りのハードウェアプラットフォームまたはソフトウェア言語を既にお持ちの場合は、MQTT機能を備えている可能性があります。 あなたの「もの」が互いに話し合うのを楽しんでください!