IoT由內(nèi)而外的安全
很多物聯(lián)網(wǎng)(IoT)設(shè)備都是我們?nèi)粘I钪兴褂玫模缂译姾秃銣仄鞯?,因此,網(wǎng)絡(luò)安全應(yīng)是IoT系統(tǒng)供應(yīng)商首先要考慮的問(wèn)題。人們?cè)谌粘I钪杏龅絾?wèn)題最容易讓人沮喪:如果您的冰箱由于軟件缺陷而停止工作,這是不是也會(huì)成為頭版頭條!
IoT產(chǎn)品在安全上有各種層面的考慮,從基本的數(shù)據(jù)流加密到用戶和設(shè)備級(jí)的認(rèn)證等。在這篇文章中,我們重點(diǎn)介紹網(wǎng)絡(luò)級(jí)安全。
一個(gè)典型的IoT設(shè)備位于私有網(wǎng)路中,在防火墻的后面。這種體系結(jié)構(gòu)既有優(yōu)點(diǎn)也有問(wèn)題。一方面,它減少了設(shè)備與防火墻和Wi-Fi網(wǎng)絡(luò)本身的安全接觸,無(wú)論如何,減輕了網(wǎng)絡(luò)供應(yīng)商的安全責(zé)任。安全代理有助于降低CPU成本。另一方面,防火墻阻止了云服務(wù)器出于通過(guò)移動(dòng)應(yīng)用程序進(jìn)行控制的目的而直接連接IoT設(shè)備。
有些技術(shù)能夠幫助旁路防火墻,支持從云端到IoT設(shè)備的輸入連接。但是,很多這類技術(shù)利用了漏洞,并不是所有網(wǎng)絡(luò)都支持這樣做,而且,這種體系結(jié)構(gòu)很難設(shè)計(jì)一種真正安全的 IoT設(shè)備。旁路防火墻最簡(jiǎn)單、最安全、最可靠的方法是IoT設(shè)備符合“僅輸出連接”規(guī)則:所有連接都是從設(shè)備向云端發(fā)起,然后,設(shè)備應(yīng)保持這一連接是開(kāi)放的。這一方法簡(jiǎn)單而且更安全,這是因?yàn)樗灰揽糠阑饓Φ拈_(kāi)放端口,也不依靠讓防火墻完成數(shù)據(jù)流路由的技術(shù),例如,NAT會(huì)話穿越(STUN)方法等。
建立連接后,我們應(yīng)選擇怎樣高效的使用連接,在響應(yīng)和資源占用之間達(dá)到均衡。HTTP 長(zhǎng)輪詢是一種雙向通信,基于“由內(nèi)而外輸出 標(biāo)準(zhǔn)的方法 (圖1)。
圖1. 雙向通信,基于由內(nèi)而外標(biāo)準(zhǔn)的方法
在長(zhǎng)輪詢模型中,IoT 設(shè)備向服務(wù)器發(fā)出HTTP請(qǐng)求。服務(wù)器延遲對(duì)HTTP請(qǐng)求的響應(yīng),直至經(jīng)過(guò)了預(yù)先設(shè)定的時(shí)間周期,或者直至收到要求響應(yīng)IoT設(shè)備的命令或者請(qǐng)求。如果命令是必須的,服務(wù)器會(huì)立即響應(yīng)命令,IoT客戶端處理命令。IoT客戶端會(huì)立即發(fā)出另一服務(wù)器 HTTP 請(qǐng)求,開(kāi)始循環(huán)。如果命令或者請(qǐng)求需要向服務(wù)器提供結(jié)果,那么,它會(huì)在新的長(zhǎng)輪詢請(qǐng)求中進(jìn)行。
這一方法有幾種優(yōu)點(diǎn)。從IoT設(shè)備的角度看,HTTP簡(jiǎn)單,輕量,而且還有很多支持庫(kù)。HTTP還提供了互聯(lián)網(wǎng)路由功能,包括對(duì)長(zhǎng)輪詢所需要的持續(xù)連接的支持。
HTTP還支持任意負(fù)載,您可以靈活的選擇與設(shè)備相關(guān)的消息。我們成功的在長(zhǎng)輪詢上使用了JSON/REST語(yǔ)法,以及谷歌協(xié)議緩沖消息。
從云端服務(wù)器的角度看,大部分工作框架都是設(shè)計(jì)成處理HTTP請(qǐng)求,支持服務(wù)器開(kāi)發(fā)人員自由的使用現(xiàn)有工作框架和庫(kù)以加速開(kāi)發(fā)。
HTTP 長(zhǎng)輪詢還支持服務(wù)器通過(guò)簡(jiǎn)單的實(shí)現(xiàn)更長(zhǎng)的響應(yīng)延時(shí),從而控制帶寬利用率。而且,通過(guò)增加簡(jiǎn)單的“輪詢定時(shí)器”,迫使 IoT 客戶端延時(shí)HTTP請(qǐng)求,這樣,您很容易獲得真輪詢模型,一方面,犧牲響應(yīng)時(shí)間,而另一方面,降低了對(duì)資源的占用,可以使用電池供電。
WebSockets 是另一種選擇,與HTTP長(zhǎng)輪詢非常相似。WebSockets與HTTP幀頭配合使用,效率非常高。WebSockets還提供實(shí)時(shí)設(shè)備至服務(wù)器提醒功能,某些應(yīng)用會(huì)需要這一功能。為獲得長(zhǎng)輪詢模型的實(shí)時(shí)提醒功能,必須使用單獨(dú)的套接字,以保持服務(wù)器控制的長(zhǎng)輪詢通道。
然而,并不是所有服務(wù)器工作框架都支持WebSockets,在很少的一些實(shí)際應(yīng)用中,網(wǎng)絡(luò)布線會(huì)成為問(wèn)題。在不遠(yuǎn)的將來(lái),WebSockets 會(huì)是很好的選擇,但是目前而言,我不會(huì)使用它,除非您的目標(biāo)環(huán)境支持它。
這些技術(shù)的基礎(chǔ)都是傳輸控制協(xié)議(TCP)套接字。合理可行的安全模型在這一套接字連接上對(duì)數(shù)據(jù)流進(jìn)行加密。雖然最近有些不好的消息,但是安全套接字層(SSL)或者傳送層安全(TLS)仍然是加密層最好的選擇。SSL 通過(guò)的審查最多,支持最多,也最被容易理解。
您想過(guò)要發(fā)明自己的協(xié)議?考慮到最近的安全缺陷,例如,目前出名的“Heartbleed” 缺陷,它來(lái)自一些大公司的SSL和開(kāi)放源庫(kù),這說(shuō)明了很難開(kāi)發(fā)一種真正安全的協(xié)議,更不用說(shuō)正確的實(shí)現(xiàn)它。因此,在嘗試自己的安全方案之前一定要三思。
然而,SSL 本質(zhì)上是一種大規(guī)模協(xié)議,在連接建立過(guò)程中需要很多次握手。這種開(kāi)銷進(jìn)一步說(shuō)明所有通信應(yīng)使用持續(xù)連接方法,好在HTTPS長(zhǎng)輪詢(結(jié)合TCP套接字“保持連接”,因此,每次輪詢不會(huì)重新打開(kāi))適合這一應(yīng)用。
SSL還會(huì)占用大量的代碼空間和運(yùn)行時(shí)存儲(chǔ)器。對(duì)于資源豐富的云服務(wù)器,SSL資源開(kāi)銷并不是太大的問(wèn)題,但是對(duì)于低成本IoT設(shè)備卻不然,這是因?yàn)榇鎯?chǔ)器和CPU功耗是首當(dāng)其沖要考慮的。當(dāng)考慮IoT設(shè)備的SSL庫(kù)時(shí),如果您選擇的SSL庫(kù)提供了選項(xiàng)來(lái)禁用您不使用的功能,那么應(yīng)評(píng)估您需要使用 SSL 的哪些功能。您還應(yīng)該看看目標(biāo)硬件能否幫助您減輕負(fù)載。SSL 基于高級(jí)加密標(biāo)準(zhǔn)(AES)、安全哈希算法(SHA),以及其他標(biāo)準(zhǔn)密碼算法。很多硬件平臺(tái)提供專門的加密硬件,把這些計(jì)算從CPU中卸載下來(lái)。
最后,這些方法實(shí)際上是在資源和理解安全需求之間達(dá)到均衡。認(rèn)真的思考,提前規(guī)劃好有助于解決很多棘手的問(wèn)題。