MQTT 安全性

三個概念是 MQTT 安全的基礎: 身分、鑑別及授權。 身分可為要授權及提供權限的用戶端命名。 鑑別可提供用戶端的身分,而授權可管理為用戶端提供的權限。

嘗試安全範例

身分

透過其用戶端 ID、使用者 ID 或公用數位憑證來識別 MQTT 用戶端。 這些屬性中有一項定義了用戶端身分。 MQTT 伺服器會使用 SSL 通訊協定來鑑別用戶端所傳送的憑證,或使用用戶端所設定的密碼來鑑別用戶端身分。 伺服器根據用戶端身分控制用戶端可以存取的資源。

MQTT 伺服器會使用其 IP 位址及數位憑證,向用戶端識別其本身。 MQTT 用戶端使用 SSL 通訊協定來鑑別伺服器所傳送的憑證。 在某些情況下,它使用伺服器的 DNS 名稱來驗證為其傳送憑證的伺服器登錄為憑證持有者。

請按下列其中一種方式設定用戶端的身分:

用戶端 ID
MqttClient 類別(C 中的 MQTTClient_createMQTTAsync_create)可設定用戶端 ID。 呼叫類別建構子,將用戶端 ID 設為參數,或傳回隨機產生的用戶端 ID。 用戶端 ID 在所有連接至伺服器的用戶端中必須是唯一的,而且不得與伺服器上的佇列管理程式同名。 所有用戶端都必須具有用戶端 ID ,即使它未用於身分檢查。 請參閱 用戶端 ID
使用者 ID
MqttClient 類別(C 中的 MQTTClient_createMQTTAsync_create)可將用戶端使用者 ID 設為 MqttConnectOptions 的屬性(C 中的 MqttClient_ConnectOptions)。 使用者 ID 不需要是用戶端唯一的。
用戶端數位憑證
用戶端數位憑證儲存在用戶端金鑰儲存庫中。 金鑰儲存庫位置視用戶端而定:
  • Java

    透過呼叫 MqttConnectOptionssetSSLProperties 方法並傳遞金鑰儲存庫內容,來設定用戶端金鑰儲存庫的位置及內容。 請參閱 對 Example.java的 SSL 修改keytool 工具可管理 Java 金鑰和金鑰儲存庫。

  • C

    MQTTClient_createMQTTAsync_create 會將金鑰儲存庫內容設為 MQTTClient_SSLOptions ssl_opts的屬性。 openSSL 工具會建立並管理 MQTT Client for C 所存取的金鑰和金鑰儲存庫。

  • Android

    設定 > 安全 功能表中管理 Android 裝置金鑰儲存庫。 從 SD 卡載入新憑證。

將伺服器的私密金鑰儲存在伺服器金鑰儲存庫中,以設定伺服器的身分:

IBM WebSphere MQ
MQTT 伺服器金鑰儲存庫是用戶端所連接遙測通道的屬性。

使用 IBM WebSphere MQ ExplorerDEFINE CHANNEL 指令來設定金鑰儲存庫位置及屬性; 請參閱 DEFINE CHANNEL (MQTT)。 多個通道可以共用金鑰儲存庫。

鑑別

MQTT 用戶端可以鑑別它所連接的 MQTT 伺服器,而伺服器可以鑑別它所連接的用戶端。

用戶端使用 SSL 通訊協定鑑別伺服器。 MQTT 伺服器會使用 SSL 通訊協定及/或密碼來鑑別用戶端。

如果用戶端鑑別伺服器,但伺服器未鑑別用戶端,用戶端通常稱為匿名用戶端。 通常透過 SSL 建立匿名用戶端連線,然後使用 SSL 階段作業加密的密碼鑑別用戶端。 由於憑證公佈及管理問題,使用密碼(而非用戶端憑證)鑑別用戶端更為普遍。 您可能在高價值裝置(如 ATM 及晶片銀行卡機)及在自訂裝置(智慧型電表)中尋找用戶端憑證。

透過用戶端鑑別伺服器
MQTT 用戶端會使用 SSL 通訊協定來鑑別伺服器憑證,以驗證它已連接至正確的伺服器。 當您透過 HTTPS 通訊協定瀏覽網站時,此驗證表單對您來說很熟悉。

伺服器可將公用憑證(由憑證管理中心簽署)傳送至用戶端。 用戶端使用憑證管理中心的公開金鑰,來驗證伺服器憑證上的憑證管理中心的簽章。 它也會檢查憑證是否是最新的。 這些檢查會確定憑證是否有效。

憑證管理中心憑證(通常稱為主要憑證)儲存在用戶端信任儲存庫中:
  • Java

    呼叫 MqttConnectOptionssetSSLProperties 方法並傳遞信任儲存庫內容,以設定用戶端信任儲存庫的位置及內容。 請參閱 對 Example.java的 SSL 修改。 使用 keytool 工具管理憑證及信任儲存庫。

  • C

    MQTTClient_createMQTTAsync_create 將信任儲存庫內容設為 MQTTClient_SSLOptions ssl_opts的屬性。 使用 openSSL 工具管理憑證及信任儲存庫。

  • Android

    設定 > 安全 功能表管理 Android 裝置信任儲存庫。 從 SD 卡載入新的主要憑證。

透過伺服器鑑別用戶端

MQTT 伺服器會使用 SSL 通訊協定來鑑別用戶端憑證,或使用密碼來鑑別用戶端身分,以驗證它已連接至正確的用戶端。

它會使用用戶端傳送至伺服器的 MQTT protocol 標頭中的密碼來鑑別用戶端。 伺服器可以選擇使用密碼鑑別用戶端 ID、使用者 ID 或憑證。 它視伺服器而定。 通常,伺服器鑑別使用者 ID。 透過 SSL 連線(驗證伺服器來保護安全)驗證密碼,以避免用明碼傳送密碼。
  • IBM WebSphere MQ

    IBM WebSphere MQ 會使用 SSL 通訊協定來鑑別用戶端憑證。 將主要憑證儲存在 IBM WebSphere MQ Telemetry 金鑰儲存庫中。 您只能透過相互 SSL 鑑別來鑑別用戶端憑證。 亦即,您必須為用戶端提供伺服器公用憑證,以及為伺服器提供用戶端公用憑證。

    IBM WebSphere MQ Telemetry 對其自己的專用和公用憑證以及其他公用憑證 (例如憑證管理中心提供的主要憑證) 使用相同的儲存庫。

    使用 IBM WebSphere MQ ExplorerDEFINE CHANNEL 指令來設定金鑰儲存庫位置及屬性; 請參閱 DEFINE CHANNEL (MQTT)。 多個通道可以共用金鑰儲存庫。

    IBM WebSphere MQ 會呼叫 Java 鑑別和授權服務 (JAAS) 來鑑別用戶端使用者 ID 或用戶端 ID。

    在儲存於 jaas.config 檔案的 MQXRConfig 配置段落中配置 JAAS。 該檔案儲存在 IBM WebSphere MQ 資料路徑的 qmgrs\QmgrName\mqxr 目錄中。

    透過為 JAASLoginModule 撰寫 login 方法來檢查用戶端的確實性。 請參閱 遙測通道 JAAS 配置

    IBM WebSphere MQ Telemetry 會傳遞下列參數給 JAASLoginModule.login 方法:
    • 使用者 ID
    • 密碼
    • 用戶端 ID
    • 網路 ID
    • 通道名稱
    • ValidPrompts

授權

授權不是 MQTT protocol的一部分。 它由 MQTT 伺服器提供。 授權的內容視伺服器執行的作業而定。 MQTT 伺服器是發佈/訂閱分配管理系統,有用的 MQTT 授權規則可控制哪些用戶端可以連接至伺服器,以及用戶端可以發佈或訂閱哪些主題。 如果 MQTT 用戶端可以管理伺服器,則更多授權規則會控制哪些用戶端可以管理伺服器的不同層面。

可用的用戶端非常多,因此分別授權每一個用戶端是不可行的。 MQTT 伺服器將具有依設定檔或群組分組用戶端的方法。

從存取及授權的觀點來看,用戶端的身分不是 MQTT 用戶端特有的身分。 用戶端的身分不等於用戶端 ID。 它們可能相同,但通常是不同的。 例如,您可能有一個在許多服務之間通用的使用者名稱,其中有些服務會在 單一登入中合作。 企業級 MQTT 伺服器可能會呼叫授權服務,為不同的應用程式提供一般身分及權限。

IBM WebSphere MQ

IBM WebSphere MQ 具有外掛授權服務。 WindowsLinux® 上提供的預設授權服務是物件權限管理程式 (OAM)。 請參閱 在 UNIX、 Linux 及 Windows 系統上使用 OAM 來控制對物件的存取權。 它會將作業系統使用者 ID 和群組與 IBM WebSphere MQ 物件上的作業 (例如主題和佇列) 相關聯。

您可以配置遙測通道,以使用固定使用者 ID 來存取 IBM WebSphere MQ 。 這是設定範例通道的方式。 或者,您可以使用 MQTT 用戶端所設定的使用者 ID 來存取 IBM WebSphere MQ授權 MQTT 用戶端存取 WebSphere MQ 物件 說明如何設定 IBM WebSphere MQ Telemetry ,以達到粗略、中等及精細的用戶端存取控制。