CentOS 7上安裝和保護 MQTT 的 mosquito

CentOS 7上安裝和保護 MQTT 的 mosquito

引言

Mqtt 是一種機對機的消息傳遞協議,旨在爲物聯網設備提供輕量級的發佈/訂閱通信。 它通常用於車輛的地理跟蹤車隊,家庭自動化,環境傳感器網絡,和公用事業規模的數據收集。

Mosquito 是一個流行的 MQTT 服務器(或者用 MQTT 的說法是代理) ,它有很好的社區支持,並且易於安裝和配置。

在本教程中,我們將安裝 mosquito,從 Let’s Encrypt 檢索 SSL 證書,並將代理設置爲使用 SSL 來保護受密碼保護的 MQTT 通信。

先決條件

在開始本教程之前,你需要:

設置了一個 CentOS 7服務器,該服務器具有一個非 root、支持 sudo 的用戶和一個基本的防火牆。 新 CentOS 7服務器檢查列表中包含了所有這些(以及更多)。
一個域名指向你的服務器,就像如何用 DigitalOcean 設置主機名一樣。 本教程將在整個過程中使用 mqtt.example.com。
還可以選擇使用納米文本編輯器。 本教程將使用 nano 貫穿始終,你可以在任何時候用 sudo yum-y 安裝 nano 安裝它,或者替換你喜歡的文本編輯器。

第一步ー安裝

缺省情況下 CentOS 7沒有一個需要打包的蚊子。 爲了安裝它,我們將首先安裝一個額外的 Linux 軟件資源庫,稱爲企業 Linux 的額外軟件包,或者稱爲 EPEL。 這個存儲庫充滿了可以很好地安裝在 CentOS、 Red Hat 和其他面向企業的 Linux 發行版上的附加軟件。

使用非 root 用戶登錄並使用 yum 包管理器安裝 epel-release 包。

sudo yum -y install epel-release

這將向我們的系統添加 EPEL 存儲庫信息。 Y 選項會自動對整個過程中的幾個提示回答 yes。 現在我們可以安裝蚊子包。

sudo yum -y install mosquitto

這個包有一個簡單的默認配置,所以讓我們運行它來測試我們的安裝。

sudo systemctl start mosquitto

我們還需要啓用該服務,以確保在重新啓動系統時啓動:

sudo systemctl enable mosquitto

現在讓我們測試默認配置。 Mosquito 包附帶了一些命令行 MQTT 客戶機。 我們將使用其中一個訂閱我們代理的主題。

主題是發佈郵件到並訂閱的標籤。 它們被安排成一個層次結構,例如,你可以有傳感器 / 外部 / 溫度和傳感器 / 外部 / 溼度。 如何安排話題取決於你自己和你的需要。 在本教程中,我們將使用一個簡單的測試主題來測試我們的配置更改。

第二次登錄到您的服務器,這樣您就有兩個並排的終端。 在新的終端,使用蚊子子訂閱測試主題:

mosquitto_sub -h localhost -t test

H 用於指定 MQTT 服務器的主機名,-t 是主題名。 你會看到沒有輸出後,按下 ENTER,因爲蚊子子正在等待消息到達。 切換回你的另一個終端併發布一條消息:

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

蚊子到酒吧的選項是相同的蚊子到次,雖然這一次我們使用額外的-m 選項,以指定我們的信息。 點擊回車,你應該會看到 hello world 在另一個終端彈出。 您已經發送了您的第一條 MQTT 消息!

在第二個終端輸入 ctrl + c 以退出 mosquito 子,但保持到服務器的連接打開。 我們將在第5步中再次使用它進行另一個測試。

接下來,我們將使用 Certbot (新的 Let’s Encrypt 客戶機)使用 SSL 保護我們的安裝。

步驟2ー爲 Let’s Encrypt 證書安裝和運行 Certbot

Let’s Encrypt 是一個通過自動化 API 提供免費 SSL 證書的新服務。 官方的 Let’s Encrypt 客戶機名爲 Certbot,它包含在我們在前面步驟中安裝的 EPEL 存儲庫中。

用 yum 安裝 Certbot。

sudo yum -y install certbot

Certbot 需要回答 Let’s Encrypt API 發出的加密挑戰,以證明我們控制了域。 它使用端口80(HTTP)和 / 或443(HTTPS)來實現這一點。 我們將只使用端口80,所以現在讓我們允許在該端口上傳入通信量。

使用 firewall-cmd 添加 HTTP 服務。

sudo firewall-cmd --permanent --add-service=http

重新裝載防火牆,使更改生效。

sudo firewall-cmd --reload

我們現在可以運行 Certbot 來獲得我們的證書。 我們將使用 – standalone 選項告訴 Certbot 自己處理 HTTP 挑戰請求,而 – standalone-supported-challenges HTTP-01將通信限制在端口80。 D 用於指定希望獲得證書的域,certonly 告訴 Certbot 只檢索證書,而不需要執行任何其他配置步驟。

sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com

在運行該命令時,系統將提示您輸入一個電子郵件地址並同意服務條款。 這樣做之後,您應該會看到一條消息,告訴您流程已經成功,以及證書存儲在哪裏。

我們已經獲得了證書,現在我們需要確保 Certbot 在證書即將到期時自動更新它們。

第三步: 建立 Certbot 自動更新系統

Let’s Encrypt 的證書只有90天的有效期。 這是爲了鼓勵用戶自動化他們的證書更新過程。 我們需要設置一個定期運行的命令來檢查到期證書並自動更新它們。

爲了每天運行續約檢查,我們將使用 cron,這是一個用於運行週期性作業的標準系統服務。 我們通過打開和編輯一個名爲 crontab 的文件告訴 cron 要做什麼。

sudo EDITOR=nano crontab -e

將在 nano 編輯器中打開 crontab 文件。 如果您喜歡使用缺省的 vi 編輯器,請關閉它。

現在應該顯示默認的 crontab,一個空白文件。 粘貼下面的行,然後保存並關閉文件。

crontab

15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

這一行的153 * 部分表示“每天凌晨3:15運行以下命令”。 Certbot 的續訂命令將檢查系統上安裝的所有證書,並更新任何設置爲在30天內過期的證書。 – 非交互式告訴 Certbot 不要等待用戶輸入。

– post-hook“ systemctl restart mosquito”將重啓 Mosquitto 以獲得新的證書,但前提是證書必須更新。

現在已經設置了自動證書更新,我們將繼續配置 mosquito 以使其更加安全。

第四步ー設定 MQTT 密碼

讓我們設置蚊子使用密碼。 Mosquito 包含一個工具,可以生成一個名爲 mosquito passwd 的特殊密碼文件。 這個命令將提示您輸入指定用戶名的密碼,並將結果放在 / etc /

mosquito / passwd 中。

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

現在我們將替換默認的配置文件,並告訴 mosquito 使用這個密碼文件要求所有連接都登錄。 首先,刪除現有的 mosquito. conf。

sudo rm /etc/mosquitto/mosquitto.conf

現在打開一個新的空白配置。

sudo nano /etc/mosquitto/mosquitto.conf

粘貼到下面。

/etc/mosquitto/mosquitto.conf
allow_anonymous false
password_file /etc/mosquitto/passwd

Allow anonymous false 將禁用所有未經身份驗證的連接,密碼文件行告訴 Mosquitto 在哪裏查找用戶和密碼信息。 保存並退出文件。

現在我們需要重新啓動 mosquito 並測試我們的變化。

sudo systemctl restart mosquitto

嘗試在沒有密碼的情況下發布消息。

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

這個信息應該被拒絕:

Output
Connection Refused: not authorised.
Error: The connection was refused.

在我們再次嘗試輸入密碼之前,請再次切換到第二個終端窗口,並訂閱“測試”主題,這次使用用戶名和密碼:

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

它應該連接並靜坐,等待信息。 在本教程的其餘部分中,您可以保持這個終端處於開放狀態並與其連接,因爲我們將定期向其發送測試消息。

現在用另一個終端發佈一條消息,同樣使用用戶名和密碼:

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

該消息應該按照步驟1進行傳遞。 我們已經成功地爲蚊子增加了密碼保護。 不幸的是,我們在互聯網上發送未加密的密碼。 我們接下來將通過在 Mosquitto 加入 SSL 加密來解決這個問題。

步驟5ー配置 MQTT SSL

要啓用 SSL 加密,我們需要告訴 mosquito 我們的 Let’s Encrypt 證書存儲在哪裏。 打開我們先前啓動的配置文件。

sudo nano /etc/mosquitto/mosquitto.conf

在文件末尾粘貼以下內容,保留我們已經添加的兩行:

/etc/mosquitto/mosquitto.conf
. . .
listener 1883 localhost
 
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

我們在配置中添加了兩個獨立的偵聽器塊。 第一個是偵聽器1883 localhost,它在端口1883上更新缺省的 MQTT 偵聽器,到目前爲止我們一直連接到這個端口。 1883是標準的未加密 MQTT 端口。 該行的 localhost 部分指示 Mosquitto 只將該端口綁定到 localhost 接口,因此外部無法訪問該端口。 外部請求無論如何都會被我們的防火牆阻止,但是顯式的請求是好的。

監聽器8883在8883端口設置了一個加密監聽器。 這是 MQTT + SSL 的標準端口,通常稱爲 MQTTS。 接下來的三行代碼 certfile、 cafile 和 keyfile 都將 mosquito 指向適當的 Let’s Encrypt 文件以設置加密連接。

保存並退出文件。

在重新啓動 mosquito 以加載新配置之前,我們需要修復默認 mosquito 服務文件中的一個內容。 這是 systemd 用來確定如何運行蚊子的文件。 用你最喜歡的編輯器打開它。

sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service

尋找一行,說用戶蚊子和刪除它,然後保存和退出文件。

Mosquito 仍將作爲蚊子對用戶運行,但當它第一次啓動時,它將擁有 root 特權,並將能夠加載我們的 Let’s Encrypt 證書(出於安全原因,這些證書僅限於 root 訪問)。 加載證書後,它將下降到蚊子用戶。

我們需要重新加載 systemd 本身,這樣它就會注意到我們對服務文件所做的更改。

sudo systemctl daemon-reload

現在我們可以重新啓動 mosquito 來更新設置。

sudo systemctl restart mosquitto

更新防火牆以允許連接到端口8883。

sudo firewall-cmd --permanent --add-port=8883/tcp

重新裝載防火牆。

sudo firewall-cmd --reload

現在我們再次使用蚊子到酒吧進行測試,使用一些不同的 SSL 選項。

mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -u "sammy" -P "password"

注意,我們使用的是完整的主機名而不是本地主機。 因爲我們的 SSL 證書是爲 mqtt.example.com 服務器頒發的,如果我們嘗試一個到本地主機的安全連接,我們會得到一個錯誤,說主機名與證書主機名不匹配(即使它們都指向同一個 mosquito 服務器)。

– cafile / etc / ssl / certs / ca-bundle. Crt 啓用 SSL for mosquito to pub,並告訴它在哪裏尋找根證書。 這些通常是由你的操作系統安裝的,所以 Mac OS,Windows 等系統的路徑是不同的。 蚊子酒吧使用加密根證書來驗證蚊子酒吧服務器的證書是否由 Let’ s Encrypt 認證機構正確簽署。 需要注意的是,如果沒有這個選項(或類似的 capath 選項) ,mosquito to pub 和 mosquito to sub 將不會嘗試 SSL 連接,即使您連接到標準的安全端口8883。

如果一切順利的測試,我們將看到 hello 再次出現在其他次終端的蚊子。 這意味着您的服務器已經完全設置好了! 如果希望擴展 MQTT 協議以使用 websocket,可以按照最後一步操作。

步驟6ー通過 Websockets 配置 MQTT (可選)

爲了在 web 瀏覽器中使用 JavaScript 來說明 MQTT,該協議被調整爲可以在標準的 websocket 上工作。 如果你不需要這個功能,你可以跳過這一步。

我們需要添加一個更多的偵聽器塊到我們的蚊子配置。

sudo nano /etc/mosquitto/mosquitto.conf

在文件的末尾,添加以下內容:

/etc/mosquitto/mosquitto.conf
. . .
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

除了端口號和 protocol websocket 行之外,這基本上與前一個塊相同。 在 websockets 上沒有 MQTT 的官方標準化端口,但8083是最常見的。

保存並退出文件,然後重新啓動 mosquito。

sudo systemctl restart mosquitto

現在,打開防火牆中的8083端口。

sudo firewall-cmd --permanent --add-port=8083/tcp

再最後一次重新裝載防火牆。

sudo firewall-cmd --reload

爲了測試這個功能,我們將使用一個公共的、基於瀏覽器的 MQTT 客戶機。 現在已經有了一些,但是 mqtt-admin 非常簡單和直接。 在瀏覽器中打開 mqtt-admin。 你會看到以下內容:

填寫連接信息如下:

協議應該是 wss (即 web socket secure)。
主機應該是你的 mosquito 服務器的域名, mqtt.example.com。
端口應該是8083。
用戶名應該是你的蚊子用戶名,在這裏,我們使用 sammy。
密碼應該是您選擇的密碼。
Clientid 可以保留爲默認值 mqtt-admin。
按下保存設置後,mqtt-admin 將連接到您的 mosquito 服務器。 在下一個屏幕中,填寫 Topic 作爲測試,輸入任何有效負載的消息,然後按 Publish。 該信息將顯示在蚊子子子終端。

總結

現在,我們已經設置了一個安全的、受密碼保護的 MQTT 服務器,該服務器具有來自 Let’s Encrypt 服務的自動更新 SSL 證書。 這將爲您構想的任何項目提供一個健壯和安全的消息傳遞平臺。 一些流行的軟件和硬件可以很好地與 MQTT 協議協同工作,包括:

Owntracks,一個開源的地理追蹤應用,你可以安裝在你的手機上。 將定期向你的 MQTT 服務器報告位置信息,然後你可以將這些信息存儲並顯示在地圖上,或者根據你的位置創建警報並激活物聯網硬件。
Node-red 是一個基於瀏覽器的圖形界面,用於“連接”物聯網。 您可以將一個節點的輸出拖動到另一個節點的輸入,並且可以通過過濾器、在各種協議之間將信息路由到數據庫中,等等。 Mqtt 非常好地支持 Node-RED。
Esp8266是一個便宜的帶有 MQTT 功能的 wifi 微控制器。 你可以連接一個來發佈一個主題的溫度數據,或者訂閱一個氣壓主題,當暴風雨來臨時發出蜂鳴器!
這些只是 MQTT 生態系統中的一些流行示例。 還有更多的硬件和軟件能夠說明這個協議。 如果您已經有了最喜歡的硬件平臺或軟件語言,那麼它可能具有 MQTT 功能。 讓你的“東西”彼此交談愉快!

本文轉載來自於

https://www.zhangtaidong.cn/archives/66/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章