認證是一種安全措施,用於識別使用者並驗證他們是否有權訪問系統或伺服器。它能夠保護系統免受未經授權的訪問,確保只有經過驗證的使用者才能使用系統。
物聯網連線萬物,對試圖訪問基礎設施的使用者進行認證至關重要。未經授權的訪問存在重大的安全隱患,必須加以防範。因此,物聯網開發者應該全面瞭解各類認證方法。
在本文中,我們將探討 MQTT 中的認證機制,以及其可以解決什麼安全風險,並介紹一種常用的認證方式:基於密碼的認證。
MQTT 中的認證
在 MQTT 中,認證是在連線建立時對客戶端或者服務端的身份進行驗證的過程。它僅涉及是否有許可權連線到 Broker,與授權不同,後者決定客戶端可以釋出和訂閱哪些主題。我們將在本系列之後的文章中對授權進行詳細講解。
- 基於密碼的認證:Broker 檢查客戶端是否具有正確的連線憑據,包括使用者名稱、客戶端 ID 和密碼。Broker 可以根據密碼驗證使用者名稱或客戶端 ID。
- 增強認證:引入了支援質詢-響應機制的認證框架,可以支援 SCRAM、Kerberos 等多種認證機制。
- 其他:如基於令牌的身份驗證(例如 JWT)等。
本文中我們將重點介紹基於密碼的認證方式。
基於密碼的認證
基於密碼的認證是一種透過檢驗連線方是否擁有正確的密碼憑據來確認連線方身份的方法。
在 MQTT 中,基於密碼的認證通常使用使用者名稱和密碼作為憑據,但在某些特殊場景下,有些客戶端可能無法提供使用者名稱,因此客戶端 ID 也可以作為唯一標識來代表身份。
當 MQTT 客戶端與 Broker 建立連線時,它會在 CONNECT 報文中攜帶使用者名稱和密碼。下面的示例展示了用 Wireshark 工具抓取的客戶端 CONNECT 報文,其中 Client ID 為 client1,使用者名稱為 user,密碼為 MySecretPassword。
Broker 從 CONNECT 報文中提取使用者名稱(或客戶端 ID)和密碼後,需要在相應的資料庫中查詢該使用者名稱對應的憑據,然後與客戶端傳送的密碼進行比較。如果資料庫中不存在該使用者名稱,或者密碼與資料庫中的憑據不一致,Broker 將拒絕客戶端的連線請求。
下圖展示了 Broker 如何使用 PostgreSQL 來驗證客戶端的使用者名稱和密碼。
基於密碼的認證可以確保只有擁有正確憑據(即使用者名稱和密碼)的客戶端才能連線到 Broker。但是,正如在 Wireshark 抓包過程中所見,如果有人能夠黑進通訊通道,他們就可以輕鬆地擷取資料包並獲取連線憑據,因為它們都以明文形式傳送。關於這個問題,我們將在本系列的後續文章中講解如何使用 TLS(安全傳輸層協議)進行解決。
使用 Salt 和 Hash 保護你的密碼
以明文方式儲存密碼是一種危險的做法,因為這將導致密碼容易被竊取。如果攻擊者獲得了密碼資料庫或密碼檔案的訪問權,他們就可以輕鬆地讀取並使用密碼對系統進行非法訪問。為了防止這種情況發生,密碼應該在儲存之前經過雜湊和 Salt 加密。
雜湊是一個函式,接收輸入資料,對資料進行數學運算,然後生成一個與原始輸入資料完全無關的雜湊值。這樣做的目的是為了混淆原始輸入資料。這個函式應該是不可逆的,確保不能根據輸出還原輸入。然而,雜湊值本身並不安全,可能會受到字典攻擊,如下例所示。
sha256 hash: 8f0e2f76e22b43e2855189877e7dc1e1e7d98c226c95db247cd1d547928334a9
加密後的密碼看起來很安全,透過觀察你無法推測出密碼是什麼。然而,對於一個固定的密碼,雜湊值總是相同的。因此,很容易製作一個包含常用密碼及其雜湊值的資料庫。如下表:
駭客就可以從線上雜湊資料庫中搜尋這個雜湊值,從而得到密碼 passw0rd。
在密碼中加入 Salt 可以解決這個問題。Salt 是一串隨機的字元,在雜湊運算之前被附加到密碼中。這使得即使密碼相同,加入 Salt 後它們的雜湊值也會不一樣。Salt 與密碼的雜湊值一起儲存在資料庫中,當使用者登入時,將 Salt 拼接到他們的密碼中,然後將生成的雜湊值與儲存在資料庫中的雜湊值進行比較。如果雜湊值相同,使用者就被允許訪問。
在執行雜湊函式之前,在密碼中插入一串隨機的字串,這個隨機字串就是 Salt。
例如,Salt 為 az34ty1,sha256(passw0rdaz34ty1) 為 :6be5b74fa9a7bd0c496867919f3bb93406e21b0f7e1dab64c038769ef578419d
這個雜湊值很難在雜湊資料庫中匹配,因為要想匹配該值,雜湊資料庫需要為密碼 passw0rd 新增海量的條目。
基於密碼的認證方法在 MQTT 中的最佳實踐
透過上文的介紹,我們將 MQTT 中基於密碼的認證方法最佳實踐總結如下:
- 在 MQTT 中進行基於密碼的認證,最重要的一點是要選擇複雜和獨特的密碼。容易被破解或在多個賬戶中重複使用的密碼會危害整個 MQTT 系統的安全。
- 安全地儲存和傳輸密碼以防止它們被惡意竊取也非常重要。例如,密碼應在儲存前進行 Hash 和 Salt 加密,並透過 TLS 等安全通道進行傳輸。
- 此外,為了減少密碼的暴露,不要在程式碼或配置檔案中硬編碼密碼,而是應該使用環境變數或其他安全儲存機制。
結語
總而言之,基於密碼的認證在保護 MQTT 連線和物聯網系統的完整性方面起著關鍵作用。透過遵循密碼選擇、儲存和傳輸的最佳實踐,同時注意暴力攻擊等常見問題,物聯網開發者可以有效實現 MQTT 系統的安全保障。作為一個廣泛使用的可擴充套件、高可用的 MQTT Broker,EMQX 也提供了包括基於密碼認證在內的一系列安全措施,以保證使用者的物聯網系統的安全。
基於密碼認證只是 MQTT 眾多認證方式中的一種,且並不一定適合每個使用場景。數字證書或 OAuth 2.0 等更高階的方法可能會在某些情況下提供更強的安全性。物聯網開發者需要了解和掌握各類常用的認證方式並選擇最適合的一種或多種。
在本系列的下一篇文章中,我們將介紹另一種認證方式:增強認證。敬請關注。
版權宣告: 本文為 EMQ 原創,轉載請註明出處。
原文連結:https://www.emqx.com/zh/blog/securing-mqtt-with-username-and-password-authentication