小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MQTT協(xié)議-安全問(wèn)題

 WindySky 2020-01-15

一、概述:

        物聯(lián)網(wǎng)的核心是連接萬(wàn)物,通過(guò)交換并分析數(shù)據(jù)使得生活更舒適與便捷。不過(guò),敏感數(shù)據(jù)泄露或者設(shè)備被非法控制可不是鬧著玩的。比如前段時(shí)間國(guó)內(nèi)某著名家電企業(yè)的智能洗衣機(jī),使用了某著名電商基于XMPP協(xié)議的物聯(lián)網(wǎng)平臺(tái),不費(fèi)吹灰之力便被黑客攻破并遠(yuǎn)程遙控,給智能家居的發(fā)展帶來(lái)了一些陰影。究其本質(zhì),并不是物聯(lián)網(wǎng)技術(shù)本身有缺陷,而是在物聯(lián)網(wǎng)系統(tǒng)的設(shè)計(jì)中最基本的安全設(shè)計(jì)被工程師輕視了,才導(dǎo)致整個(gè)系統(tǒng)的崩塌。

 

在這里我們將介紹為何以及如何運(yùn)用MQTT提供的安全特性來(lái)保證物聯(lián)網(wǎng)項(xiàng)目的順利實(shí)施。

安全對(duì)于幾乎所有的項(xiàng)目都是一個(gè)挑戰(zhàn),對(duì)于物聯(lián)網(wǎng)項(xiàng)目更是如此:

  • 設(shè)備安全性與設(shè)備可用性之間往往是零和博弈。
  • 加密算法需要更多的計(jì)算能力,而物聯(lián)網(wǎng)設(shè)備的性能往往非常有限。
  • 物聯(lián)網(wǎng)的網(wǎng)絡(luò)條件常常要比家庭或者辦公室的網(wǎng)絡(luò)條件差許多。

對(duì)于以上挑戰(zhàn),MQTT提供了多個(gè)層次的安全特性:

  1. 網(wǎng)絡(luò)層:有條件可以通過(guò)拉專(zhuān)線或者使用VPN來(lái)連接設(shè)備與MQTT代理,以提高網(wǎng)絡(luò)傳輸?shù)陌踩浴?/li>
  2. 傳輸層:傳輸層使用TLS加密是確保安全的一個(gè)好手段,可以防止中間人攻擊(Man-In-The-Middle Attack)??蛻?hù)端證書(shū)不但可以作為設(shè)備的身份憑證,還可以用來(lái)驗(yàn)證設(shè)備。
  3. 應(yīng)用層:MQTT還提供客戶(hù)標(biāo)識(shí)(Client Identifier)以及用戶(hù)名密碼,在應(yīng)用層驗(yàn)證設(shè)備。

雖然MQTT提供了多重安全設(shè)計(jì),不過(guò)世界上并沒(méi)有銀彈能夠保障數(shù)據(jù)的絕對(duì)安全,所以應(yīng)該在設(shè)計(jì)的時(shí)候就把安全放在設(shè)計(jì)目標(biāo)之中并擁有相當(dāng)?shù)膬?yōu)先級(jí),否則上文提到的智能洗衣機(jī)就是一個(gè)活生生的教訓(xùn)。

而網(wǎng)絡(luò)層可以使用專(zhuān)線或者VPN超出了本文的范圍,下面我們結(jié)合Mosquitto仔細(xì)了解一下傳輸層和應(yīng)用層的MQTT安全特性。

 

加密

MQTT是基于TCP的,默認(rèn)情況通訊并不加密。如果你需要傳輸敏感信息或者對(duì)設(shè)備進(jìn)行反控,使用TSL幾乎是必須的。打個(gè)比方,如果你在咖啡店用免費(fèi)Wi-Fi上網(wǎng),登錄互聯(lián)網(wǎng)金融的網(wǎng)站不支持HTTPS傳輸,那么你的賬號(hào)信息多半已經(jīng)在咖啡店的Wi-Fi日志里面躺著了……

TSL是非常成熟的安全協(xié)議,在握手的時(shí)候便可以創(chuàng)建安全連接,使得黑客無(wú)法偷聽(tīng)或者篡改內(nèi)容了。使用TLS的時(shí)候有以下注意點(diǎn):

  • 盡可能使用高版本的TLS。
  • 驗(yàn)證X509證書(shū)鏈防止中間人攻擊。
  • 盡量使用有CA發(fā)布的證書(shū)。

當(dāng)然,TLS會(huì)增加連接時(shí)開(kāi)銷(xiāo),對(duì)低運(yùn)算能力的設(shè)備而言是額外的負(fù)擔(dān),不過(guò)如果設(shè)備是長(zhǎng)連接的話就會(huì)避免反復(fù)連接的開(kāi)銷(xiāo)。

 

Mosquitto原生支持了TLS加密,生成證書(shū)后再配置一下MQTT代理即可。

首先我們需要生成證書(shū)權(quán)威(Certificate Authority,CA)的認(rèn)證和密鑰,生成過(guò)程中Common Name一定要填寫(xiě)Fully Qualified Domain Name(測(cè)試期間用IP地址也湊合):

 

openssl req -new -x509 -days 365 -extensions v3_ca -keyout ca.key -out ca.crt

 接下來(lái)生成MQTT代理使用的密鑰:

 

 

openssl genrsa -des3 -out server.key 2048

 并去除密碼:

 

 

openssl genrsa -out server.key 2048

 然后為MQTT代理準(zhǔn)備一個(gè)認(rèn)證注冊(cè)請(qǐng)求(Certificate Signing Request,CSR),這里的Common Name也要寫(xiě)對(duì):

 

 

openssl req -out server.csr -key server.key -new

 最后通過(guò)CA簽署這個(gè)CSR生成MQTT代理證書(shū):

 

 

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

 現(xiàn)在配置/etc/mosquitto/mosquitto.conf,確保8883端口的設(shè)置如下:

 

 

listener 8883
cafile /etc/mosquitto/tls/ca.crt
certfile /etc/mosquitto/tls/server.crt
keyfile /etc/mosquitto/tls/server.key

 重啟Mosquitto服務(wù)就可以用以下命令訂閱和發(fā)布消息了,當(dāng)然所有消息都由TLS加密,可以無(wú)憂(yōu)無(wú)慮地傳遞私密信息啦:

 

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt
mosquitto_pub -h host -p 8883 -t 'topic' -m '15' --cafile ca.crt

 

其中,host需要與前面指定的Common Name一致,否則TLS連接會(huì)報(bào)錯(cuò),錯(cuò)誤信息也不是很直觀……

認(rèn)證

認(rèn)證是驗(yàn)證設(shè)備身份的過(guò)程。拿旅行做比方,在換登機(jī)牌的時(shí)候需要出示護(hù)照以驗(yàn)明正身,即使別人能夠假冒你的名字,但是拿不出護(hù)照便無(wú)法偽造身份。買(mǎi)房的時(shí)候,需要通過(guò)戶(hù)口本證明你媽是你媽。

MQTT支持兩種層次的認(rèn)證:

  • 傳輸層:傳輸層使用TLS不但可以加密通訊,還可以使用X509證書(shū)來(lái)認(rèn)證設(shè)備。
  • 應(yīng)用層:MQTT支持客戶(hù)標(biāo)識(shí)、用戶(hù)名密碼以及X509證書(shū),在應(yīng)用層驗(yàn)證設(shè)備。

通過(guò)傳輸層和應(yīng)用層來(lái)解釋認(rèn)證并不直觀,下面我們直接從客戶(hù)標(biāo)識(shí)、用戶(hù)名密碼以及X509證書(shū)的角度來(lái)了解認(rèn)證。

客戶(hù)標(biāo)識(shí)

用戶(hù)可以使用最多65535個(gè)字符作為客戶(hù)標(biāo)識(shí)(Client Identifier),UUID或者M(jìn)AC地址最為常見(jiàn)。

使用客戶(hù)標(biāo)識(shí)來(lái)認(rèn)證并不可靠,不過(guò)在某些封閉的環(huán)境中或許已經(jīng)足夠。

用戶(hù)名密碼

MQTT協(xié)議支持通過(guò)CONNECT消息的username和password字段發(fā)送用戶(hù)名和密碼。

用戶(hù)名密碼的認(rèn)證使用起來(lái)非常方便,不過(guò)再?gòu)?qiáng)調(diào)一下,由于用戶(hù)名密碼是以明文形式傳輸,在通過(guò)互聯(lián)網(wǎng)時(shí)使用TSL加密是必須的。

Mosquitto支持用戶(hù)名/密碼認(rèn)證方式,只要確保/etc/mosquitto/mosquitto.conf有如下設(shè)置:

 

 

password_file /etc/mosquitto/passwd
allow_anonymous false

 其中passwd文件是用來(lái)保存用戶(hù)名和密碼的,可以通過(guò)mosquitto_passwd來(lái)維護(hù)用戶(hù)名密碼。之后便可以通過(guò)如下命令訂閱和發(fā)布消息了:

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt -u user -P pwd
mosquitto_pub -h host -p 8883 -t 'topic' -m '9' --cafile ca.crt -u user -P pwd

 

 

這里端口使用8883是假設(shè)已經(jīng)配置了TLS加密的。

結(jié)合TLS加密的用戶(hù)名密碼認(rèn)證,已經(jīng)是相對(duì)完善的安全體系了。

X509證書(shū)

MQTT代理在TLS握手成功之后可以繼續(xù)發(fā)送客戶(hù)端的X509證書(shū)來(lái)認(rèn)證設(shè)備,如果設(shè)備不合法便可以中斷連接。

使用X509認(rèn)證的好處,是在傳輸層就可以驗(yàn)證設(shè)備的合法性,在發(fā)送MQTT CONNECT之前便可以阻隔非法設(shè)備的連接,以節(jié)省后續(xù)不必要的資源浪費(fèi)。

如果你可以控制設(shè)備的創(chuàng)建和設(shè)置,X509證書(shū)認(rèn)證或許是個(gè)非常好的選擇。不過(guò)代價(jià)也是有的:

  1. 需要設(shè)計(jì)證書(shū)創(chuàng)建流程。如果你對(duì)設(shè)備有著完全的控制,在設(shè)備出廠前就能燒錄X509證書(shū)到設(shè)備中,那么這條路是非常合適的。但是,對(duì)于移動(dòng)設(shè)備等無(wú)法實(shí)現(xiàn)燒錄證書(shū)的場(chǎng)景,用戶(hù)名/密碼認(rèn)證或許是更好的選擇。
  2. 需要管理證書(shū)的生命周期,最好通過(guò)PKI(Public-Key-Infrastructure)來(lái)管理。
  3. 如果證書(shū)泄露了,一定要立即使證書(shū)失效。一個(gè)選擇是使用證書(shū)黑名單(Certificate Revocation Lists),另一個(gè)選擇是提供在線證書(shū)狀態(tài)協(xié)議(Online Certificate Status Protocol),方便MQTT代理及時(shí)了解證書(shū)的狀態(tài)。

MQTT原生支持X509認(rèn)證,生成客戶(hù)證書(shū)后再配置一下MQTT代理便可。

首先生成設(shè)備密鑰:

openssl genrsa -des3 -out client.key 2048

然后為準(zhǔn)備一個(gè)設(shè)備認(rèn)證注冊(cè)請(qǐng)求:

openssl req -out client.csr -key client.key -new

最后通過(guò)CA簽署這個(gè)CSR生成設(shè)備證書(shū):

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365

現(xiàn)在配置/etc/mosquitto/mosquitto.conf,確保8883端口的設(shè)置如下:

listener 8883
cafile /etc/mosquitto/tls/ca.crt
certfile /etc/mosquitto/tls/server.crt
keyfile /etc/mosquitto/tls/server.key
require_certificate true

重啟Mosquitto服務(wù)就可以用以下命令訂閱和發(fā)布消息了,當(dāng)然所有消息都由TLS加密,可以無(wú)憂(yōu)無(wú)慮地傳遞私密信息啦:

mosquitto_sub -h host -p 8883 -t 'topic' --cafile ca.crt --cert client.crt --key client.key
mosquitto_pub -h host -p 8883 -t 'topic' -m '95' --cafile ca.crt --cert client.crt --key client.key

可以看到,X509同時(shí)提供了完善的加密和驗(yàn)證,只是證書(shū)的生命周期管理的代價(jià)要比用戶(hù)名密碼高一些。

授權(quán)

授權(quán)是對(duì)資源的訪問(wèn)權(quán)限。繼續(xù)拿機(jī)場(chǎng)做例子,在使用護(hù)照認(rèn)證了用戶(hù)之后,系統(tǒng)會(huì)根據(jù)預(yù)定決定用戶(hù)可以上特定時(shí)間和班次的飛機(jī),這就是授權(quán)。

對(duì)MQTT而言意味著對(duì)主題的訂閱和發(fā)布權(quán)限。Mosquitto內(nèi)置了基本的授權(quán),那就是基于Access Control List的授權(quán)。

由于ACL是基于特定用戶(hù)的,所以需要使用用戶(hù)名密碼認(rèn)證方式。然后,在/etc/mosquitto/mosquitto.conf中指定ACL文件:

acl_file /etc/mosquitto/acl

在這個(gè)ACL文件便可以指定用戶(hù)的讀寫(xiě)權(quán)限,比如下面便可以授權(quán)用戶(hù)tom讀寫(xiě)指定主題的權(quán)限:

user tom
topic readwrite company/building/floor/#

Mosquitto只提供了基本的基于ACL的授權(quán),更高級(jí)的基于RBAC的授權(quán)可能需要通過(guò)插件的形式自行開(kāi)發(fā)了。

體系

在MQTT項(xiàng)目實(shí)施時(shí),還可以考慮通過(guò)防火墻保護(hù)MQTT代理:

  • 僅允許相關(guān)的流量傳遞到MQTT代理,比如UDP、ICMP等流量可以直接屏蔽掉。
  • 僅允許相關(guān)端口的流量傳遞到MQTT代理,比如MQTT over TCP使用1883,而MQTT over TLS使用8883。
  • 僅允許某些IP地址段來(lái)訪問(wèn)MQTT代理,如果業(yè)務(wù)場(chǎng)景允許的話。

 

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多