AI/IoTを活用した業務自動化の鍵はMQTTにあり!セキュアなMQTT環境の構築法

データ活用が進む今、センサーや機器からリアルタイムで情報をやり取りできるMQTTのような通信技術が、さまざまな業務で活用されはじめています。特に、IoTの導入や業務の自動化を検討している企業では、こうした仕組みが欠かせない存在になりつつあります。一方で、「通信の安全性が心配」「外部からの不正アクセスを防ぎたい」といった声も多く聞かれます。
そこで本記事では、オープンソースのツール「Mosquitto」を使って、「クライアント証明書」を活用した安全な通信の仕組み(TLS)を導入する方法を、やさしく・具体的な手順でご紹介します。
セキュリティに配慮したMQTTの活用を検討中の方に、ぜひ読んでいただきたい内容です。
概要
〜ステップバイステップで学ぶ、MQTT Mosquitto ブローカーのセキュアな構築法〜
このチュートリアルでは、オープンソースソフトウェア「Mosquitto」を使って、Linuxマシン上にMQTTブローカーをセットアップし、安全に運用する方法をご紹介します。今回は、AWSEC2上のUbuntu 20.04サーバーを使う想定ですが、他のLinuxディストリビューションやクラウドプロバイダーでも応用可能です。
⚠️作業を進める前に、Linuxサーバーへの管理者(root)アクセス権があることを確認してください。
ステップ1:サーバーに接続する
まずは、サーバーにSSHで接続します。AWS EC2を使っている場合、以下のコマンドで接続できます(your-key.pemやyour-server-ipは各自の環境に置き換えてください):
ssh -i your-key.pem ubuntu@your-server-ip
ステップ2:パッケージの更新
作業前に、システムのパッケージを最新の状態にしておきましょう。
sudo apt-get update -y
sudo apt-get upgrade -y
ステップ3:Mosquittoのインストール
MosquittoはUbuntuの標準リポジトリに含まれているので、次のコマンドでインストール可能です。
sudo apt-get install mosquitto mosquitto-clients -y
ステップ4:Mosquittoの設定
Mosquittoの設定ファイルは /etc/mosquitto/mosquitto.conf にあります。エディタで開きます:
sudo nano /etc/mosquitto/mosquitto.conf
デフォルトではポート1883を使用しています。ポートを変更したい場合は以下の行を編集します:
listener 1883
WebSocket経由のMQTT通信を有効にするには、以下を追記します:
listener 9001
protocol websockets
編集後は CTRL+X → Y → ENTER で保存して終了します。
ステップ5:Mosquitto を起動し自動起動を設定
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
ステップ6:クラウド側のポートを開放
クライアントが接続できるように、クラウド側のセキュリティグループでポート1883と9001を開放します(AWSの場合、EC2のセキュリティグループ設定でインバウンドルールを追加)。
ステップ7:ブローカーの動作確認
次のコマンドで、test トピックに対して購読・公開して動作確認ができます。
購読
mosquitto_sub -h localhost -t test
別ターミナルからメッセージを送信
mosquitto_pub -h localhost -t test -m "hello world"
ステップ8:ユーザー認証の設定
パスワードファイルを作成します(username は任意):
sudo mosquitto_passwd -c /etc/mosquitto/passwd username
設定ファイルに以下を追記:
allow_anonymous false
password_file /etc/mosquitto/passwd
Mosquittoを再起動:
sudo systemctl restart mosquitto
ユーザー認証つきでの接続例:
mosquitto_sub -h localhost -t test -u "username" -P "password"
mosquitto_pub -h localhost -t test -m "hello world" -u "username" -P "password"
TLS証明書でセキュアに通信するには
TLS(TransportLayer Security)を使用することで、MQTT通信の盗聴や改ざんを防止できます。
このステップでは以下の3種類の証明書を作成・使用します:
- 認証局(CA)証明書
- サーバー証明書
- クライアント証明書
ステップ1:OpenSSLのインストール
sudo apt-get install openssl -y
ステップ2:認証局(CA)の作成
mkdir ~/certs
cd ~/certs
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
ステップ3:サーバー証明書の作成
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
ステップ4:クライアント証明書の作成
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650
ステップ5:Mosquitto の TLS 設定
設定ファイルに以下を追記:
listener 8883
cafile /home/ubuntu/certs/ca.crt
certfile /home/ubuntu/certs/server.crt
keyfile /home/ubuntu/certs/server.key
require_certificate true
再起動:
sudo systemctl restart mosquito
ステップ6:TLS設定の動作確認
mosquitto_pub -h localhost -p 8883 --cafile ~/certs/ca.crt --cert ~/certs/client.crt --key ~/certs/client.key -t test -m "hello tls" -d
mosquitto_sub -h localhost -p 8883 --cafile ~/certs/ca.crt --cert ~/certs/client.crt --key ~/certs/client.key -t test -d
トラブルシューティング
Mosquittoが起動に失敗した場合:
systemctl status mosquitto.service
journalctl -xeu mosquitto.service
エラー原因がファイルのパーミッションである場合、ca.crt などを /etc/mosquitto/certs/ に移動し、設定ファイルのパスも修正してください。
Gravioへの接続
Gravioは、MQTTプロトコルの可能性を活用しています。新しくセットアップしたMQTTブローカーをGravioのPubSub機能に接続し、あらゆる種類のソフトウェアプロセスに接続してトリガーを開始できます。MQTTは以下に接続できます。
- ダッシュボード(Databox, Thinger, RRD, Thingsboardなど)
- SMS
- LINEメッセージング
- GPS
- Google Chromecast
- Google Analytics
- HTTPリクエストの作成
- Microsoft Teams
- Slack
- …その他多数!
この記事は、Mediumブログにも掲載されています:
オンラインセミナーのご案内
Gravioの活用方法をご紹介する「オンラインセミナー」や「イベント出展」を定期的に開催しています。
👉最新の開催情報は、こちらからご覧いただけます。
お問い合わせのご案内
製品に関するご質問やご説明をご希望の方には、オンラインで対応いたします。
ぜひお気軽にお問い合わせください。👉お申し込みはこちら