GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu20.04にMosquittoMQTTメッセージングブローカーをインストールして保護する方法

Mosquittoは、メッセージキューテレメトリトランスポート( MQTT )を使用するオープンソースのメッセージブローカーです。 )プロトコル。このプロトコルは、モノのインターネット( IoT )に軽量の通信を提供するように設計されています )デバイス。これは、車両のGPS追跡、ホームオートメーション、環境センサー、および大規模なデータ収集に一般的に使用されます。

MQTTプロトコルは、TCP/IPモデル上で実行されます。軽量であるため、コードフットプリントが小さいため、最小限のリソースでデバイス用のアプリケーションを作成できます。パブリッシュ/サブスクライブモデルに依存しています。このモデルでは、クライアントはMosquittoサーバーに接続します。このサーバーは、チャネルにサブスクライブしている他のクライアントに情報を送信するブローカーとして機能します。

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

前提条件
  • sudo権限を持つroot以外のユーザーがいるUbuntu20.04サーバー。
  • ドメイン名(myqtt.example.com )サーバーを指さしました。

ステップ1-Mosquittoサーバーとクライアントをインストールします

Ubuntuには古い1.6バージョンのMosquittoが同梱されています。最新バージョンをインストールするには、公式のMosquittoリポジトリを追加します。

$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

Mosquittoサーバーとクライアントをインストールします。

$ sudo apt install mosquitto mosquitto-clients

サーバーのステータスを確認してください。

$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
     Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
       Docs: man:mosquitto.conf(5)
             man:mosquitto(8)
   Main PID: 119694 (mosquitto)
      Tasks: 1 (limit: 2274)
     Memory: 1.0M
     CGroup: /system.slice/mosquitto.service
             ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.

ステップ2-MQTTパスワード認証を構成する

Mosquittoには、mosquitto_passwdというパスワードファイルを生成するユーティリティが付属しています。 。 Mosquittoは、すべての構成を/etc/mosquittoに保存します ディレクトリ。

次のコマンドを実行して、/etc/mosquitto/passwdに暗号化されたパスワードファイルを生成します。 ユーザー名username 。選択したパスワードを入力してください。

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:

次に、default.confを作成します /etc/mosquitto/conf.dの下のファイル ディレクトリを開いて編集します。

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

次の行を貼り付けて、パスワードファイルの場所を指定します。リスナーフィールドを省略すると、構成に関係なく、常に匿名で接続されます。

listener 1883
password_file /etc/mosquitto/passwd

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。

Mosquittoサーバーを再起動して、変更を実装します。

$ sudo systemctl restart mosquitto

ステップ3-Mosquittoクライアントをテストする

ユースケースに応じて、Mosquittoクライアントを使用して、さまざまなトピックに関するメッセージを送受信できます。クライアントはサブスクライバーまたはパブリッシャーのいずれかです。

次のステップは、トピックをサブスクライブすることです。 MQTTプロトコルでは、トピックとは、サーバー/ブローカーが接続されたクライアントのメッセージをフィルタリングするために使用する文字列を指します。ホームオートメーションアプリケーションで使用できるサンプルトピックを次に示します。

  • home / lights / sitting_room
  • 家/照明/キッチン
  • home / lights / master_bedroom
  • home / lights / kids_bedroom

トピックをサブスクライブするには、mosquitto_sub -tを実行します コマンドの後にトピックが続きます。たとえば、home/lights/kitchenに登録するには トピックについては、次のコマンドを実行してください。

$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"

既存のウィンドウを閉じないでください。新しいターミナルウィンドウを開いて、home/lights/kitchenにメッセージを公開します 次のコマンドを使用してトピックを作成します。

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"

最初のターミナルウィンドウに戻ると、ONが表示されます ペイロード。

ON

次に、OFFを送信します 2番目の端末からの同じトピックに関するメッセージ。

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"

最初の端末には、新しく公開されたメッセージが表示されます。

ON
OFF

認証されていないコメントを送信しようとすると、失敗します。たとえば、次のコマンドを試してください。

$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.

推奨されていませんが、次の行を/etc/mosquitto/conf.d/default.confに追加する必要があります。 認証なしでコマンドを実行する場合はファイル。

allow_anonymous true
ステップ4-SSLをインストールする

Let's Encryptを使用してSSL証明書をインストールするには、Certbotツールをダウンロードする必要があります。そのためにSnapdパッケージインストーラーを使用します。

Snapインストーラーをインストールします。

$ sudo apt install snapd

Snapdのバージョンが最新であることを確認してください。

$ sudo snap install core 
$ sudo snap refresh core

Certbotをインストールします。

$ sudo snap install --classic certbot

次のコマンドを使用して、/usr/binへのシンボリックリンクを作成することにより、Certbotコマンドが実行されるようにします。 ディレクトリ。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL証明書を生成します。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com

上記のコマンドは、証明書を/etc/letsencrypt/live/mqtt.example.comにダウンロードします。 サーバー上のディレクトリ。

Diffie-Hellmanグループを生成します 証明書。

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Let'sEncryptの自動更新用のチャレンジWebルートディレクトリを作成します。

$ sudo mkdir -p /var/lib/letsencrypt

Cronジョブを作成してSSLを更新します。証明書を確認し、必要に応じて更新するために毎日実行されます。そのためには、まず、ファイル/etc/cron.daily/certbot-renewを作成します。 開いて編集します。

$ sudo nano /etc/cron.daily/certbot-renew

次のコードを貼り付けます。

#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。

タスクファイルの権限を変更して実行可能にします。

$ sudo chmod +x /etc/cron.daily/certbot-renew
ステップ5-MQTTSSLを構成する

SSL証明書の準備ができたので、MosquittoにSSL証明書へのアクセスを提供する必要があります。このためには、Mosquittoが証明書にアクセスできる場所に証明書をコピーする必要があります。

$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key

/etc/mosquitto/certsの所有権を変更します mosquittoへのディレクトリ インストール中に作成されたユーザー。

$ sudo chown mosquitto: /etc/mosquitto/certs

MosquittoのSSL暗号化を有効にする次のステップは、SSL証明書の場所を指定することです。編集のために構成ファイルを開きます。

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

次のコードをファイルの最後に貼り付けます。

. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。ファイルの最後に必ず末尾の改行を残してください。

listener 8883 部分は暗号化されたリスナーを設定します。これは、MQTTSと呼ばれるMQTT+SSLの標準ポートです。次の4行は、SSLファイルの場所を指定します。

Mosquittoを再起動して、設定を更新します。

$ sudo systemctl restart mosquitto

ポート8883への接続を許可するには、ファイアウォールを更新する必要があります。

$ sudo ufw allow 8883

次に、mosquitto_pubを使用して機能をテストする必要があります コマンド。

$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD

ご覧のとおり、ポート番号やSSL証明書へのパスなど、特定の追加パラメーターが含まれています。 SSLを使用する必要がある場合は常に、完全なホスト名、つまりmqtt.example.comを指定する必要があります。 localhostの代わりに そうしないと、エラーが発生します。

--capathも追加する必要があります 毎回ディレクティブ。これは、Mosquittoクライアントに、オペレーティングシステムによってインストールされたルート証明書を探すように指示します。

ステップ6-SSL更新を構成する

Certbotは、有効期限が切れる前に証明書を自動的に更新します。ただし、更新された証明書を/etc/mosquitto/certsにコピーするように指示する必要があります。 ディレクトリを作成し、Mosquittoサービスを再起動します。

これを行うには、シェルスクリプトを作成します。ファイルmosquitto-copy.shを作成します /etc/letsencrypt/renewal-hooks/deployにあります ディレクトリ。

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

次のコードを貼り付けます。 MY_DOMAINの値を置き換えます ドメインによって異なります。 ${RENEWED_LINEAGE} 変数は/etc/letsencrypt/live/mqtt.example.comを指します 更新中のディレクトリ。

# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs

if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
	# Copy new certificate to Mosquitto directory
	cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
	cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key

	# Set ownership to Mosquitto
	chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Ensure permissions are restrictive
	chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Tell Mosquitto to reload certificates and configuration
	pkill -HUP -x mosquitto
fi

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。

ファイルを実行可能にします。

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

このスクリプトは、証明書が正常に更新されるたびに自動的に実行されます。

MosquittoとNginxなどのWebサーバーを実行している場合は、更新前にサーバーを停止し、終了したらサーバーを再起動するようにCertbotに指示する必要があります。これを行うには、ファイルetc/letsencrypt/renewal/mqtt.example.com.confを開きます 。

$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

ファイルの最後に次の行を追加します。使用しているWebサーバーに応じてコマンドを変更してください。

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。

Certbotドライランを実行して確認します。

$ sudo certbot renew --dry-run

エラーが表示されない場合は、すべてが設定されていることを意味します。

ステップ7-WebSocketを構成する

Websocket機能を使用してJavascriptを使用し、ブラウザー内からMQTTプロトコルを使用するようにMosquittoを構成できます。有効にするには、構成ファイルを開きます。

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

ファイルの最後に次の行を貼り付けます。

. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。

お気づきの方もいらっしゃると思いますが、ポート番号とプロトコルフィールドを除いて、SSLを有効にするために使用したブロックと同じです。 8083は、MQTTがWebSocketを使用して通信するために使用する最も一般的なポートです。

Mosquittoサービスを再起動します。

$ sudo systemctl restart mosquitto

ポート8083を開きます。

$ sudo ufw allow 8083

WebSocketの機能をテストするには、ブラウザーベースのMQTTクライアントを使用する必要があります。利用可能なクライアントはたくさんありますが、目的のためにHiveMQWebsocketクライアントを使用します。ブラウザでクライアントを起動すると、次のように表示されます。

上のスクリーンショットに示されているように、示されているようにフィールドに入力します。

  • ホストは、Mosquittoサーバーのドメインmqtt.example.comである必要があります。
  • ポートは8083である必要があります。
  • ClientIDフィールドはそのままにしておくことができます。
  • ユーザー名はMosquittoのユーザー名である必要があります。
  • パスワードは、上記で作成したパスワードである必要があります。
  • SSLを確認してください ボックス。

接続を押します ボタンをクリックすると、HiveMQクライアントがMosquittoサーバーに接続されます。

接続したら、home/lights/kitchenと入力します トピックとして、メッセージを入力し、公開を押します 。

メッセージはmosquitto_subに表示されます 接続が成功したことを確認するターミナルウィンドウ。

これは、Websocketの実装が成功していることを示しています。

結論

これで、Ubuntu 20.04ベースのマシンで、パスワードで保護され、SSLで暗号化された安全なMQTTサーバーのセットアップが完了しました。ご不明な点がございましたら、下のコメント欄に投稿してください。


Ubuntu
  1. UbuntuにphpMyAdminをインストールして保護する方法

  2. Ubuntu20.04にRedisをインストールして保護する方法

  3. Ubuntu18.04にRedisをインストールして保護する方法

  1. Ubuntu18.04および20.04にNode.jsとNPMをインストールする方法

  2. Ubuntu18.04または20.04にPHP7.4および8.0をインストールする方法

  3. Ubuntu18.04および20.04にAnacondaをインストールする方法

  1. Ubuntu18.04でApacheを使用してphpMyAdminをインストールして保護する方法

  2. Ubuntu18.04LTSにRedisをインストールして保護する方法

  3. Ubuntu18.04LTSにphpMyAdminをインストールして保護する方法