系統(tǒng)安全:一個來自中世紀(jì)的模型
正如一名安全專家所言,系統(tǒng)安全不是一件事情,而是一個過程。在我們這個鏈接越來越廣泛的環(huán)境,也是越來越充滿敵意的環(huán)境中,安全這一過程——是層出不窮的新攻擊,導(dǎo)致帶來新對策,然后是更創(chuàng)新的新攻擊,如此不斷重復(fù)。就像冷戰(zhàn)時期的軍備競賽削弱其交戰(zhàn)國的資源,對于有漏洞的系統(tǒng),解決新挑戰(zhàn)占用的資源會越來越多。
在數(shù)據(jù)中心,即使有大量的可互換資源,這也是很大的問題。但是在嵌入式系統(tǒng)中,資源是專用的,而且通常限制很嚴(yán),安全可能會成為不可逾越的障礙。物聯(lián)網(wǎng)(IoT)已經(jīng)滲透到發(fā)達(dá)國家的關(guān)鍵基礎(chǔ)設(shè)施中,這些系統(tǒng)對安全的需求的確關(guān)乎生死,非常重要。因此,對于嵌入式系統(tǒng)設(shè)計人員而言,理解這種不斷發(fā)展的挑戰(zhàn)非常重要,對于數(shù)據(jù)中心架構(gòu)師而言同樣如此。
安全的三個層面
我們可以把系統(tǒng)安全分成三個不同的層面。這種劃分既是物理的——每一層面以系統(tǒng)的不同領(lǐng)域?yàn)橹攸c(diǎn),也是按時間順序的,因?yàn)樵O(shè)計人員會逐級前進(jìn),以便逐步深入的理解問題。一種軍事類比很好的解釋了這些層面(圖1)。
圖 1.十一世紀(jì)Bamburgh城堡清楚的解釋了現(xiàn)代系統(tǒng)安全背后的原理。
這些層面是周界完整性、內(nèi)部安全,以及主動安全。簡言之,周界完整性方法旨在防止對整個系統(tǒng)進(jìn)行攻擊,就像城堡周圍的城墻。內(nèi)部安全措施是為了一旦攻破系統(tǒng)后減小其損害,就像城墻上的城樓,迷宮似的街道,最終,城堡擊退了進(jìn)入城墻的攻擊者。主動安全是找到并隔離對系統(tǒng)的攻擊,非常像是在城墻內(nèi)外巡邏的城堡衛(wèi)士,設(shè)下埋伏,突襲敵人,或者破壞敵人的地道。
在真實(shí)的世界中,系統(tǒng)安全的三個層面互相交織,彼此依賴,就像城堡城墻需要守備部隊(duì),而沒有城墻,守備部隊(duì)會非常龐大。我們將分別研究每一層面——部分是為了更清晰,部分是因?yàn)榈姑沟南到y(tǒng)設(shè)計人員在前一層面失敗后才打算實(shí)現(xiàn)下一層面。這就像一個軍閥構(gòu)筑了不設(shè)防的城墻,當(dāng)城墻被攻擊時,再修建城樓,招募市民,發(fā)給他們棍棒和杈子,只有當(dāng)?shù)诙伪粨魯『?,才會雇傭、武裝、訓(xùn)練士兵和軍官。
保衛(wèi)周界
保護(hù)您的財產(chǎn)最直觀明顯的方式是圍繞它構(gòu)筑城墻。事實(shí)是,這幾乎從未成功過——不論是在軍事歷史上還是系統(tǒng)安全上,卻一直受到政治家或者系統(tǒng)設(shè)計人員的關(guān)注。因此,我們應(yīng)該從了解周界完整性開始:它能夠應(yīng)對的攻擊,它所采用的技術(shù),它所需要的資源。
對系統(tǒng)進(jìn)行攻擊的一個基本形式是假身份。攻擊者假裝成別的人,有權(quán)進(jìn)行數(shù)據(jù)讀寫操作,執(zhí)行代碼或者更新您的系統(tǒng)。堵住這種攻擊需要身份認(rèn)證:要求相應(yīng)的一方證明自己的身份,通常采用密碼或者證書。
但是任何監(jiān)視這種會話過程的人都很容易復(fù)制密碼。因此,系統(tǒng)通常采用變化的碼型對密碼加密,以防止中間有人竊取加密后的密碼,并重用。
但這還是不夠。這個中間人通過觀察就能夠竊取寶貴的數(shù)據(jù),或者他能夠破壞發(fā)送給系統(tǒng)的代碼和數(shù)據(jù)。因此,在很多應(yīng)用中,重要的是對整個會話進(jìn)行加密,而不僅僅是密碼。通常在互聯(lián)網(wǎng)的傳送層安全(TLS,接替了安全套接字層(SSL))或者通過IPsec來實(shí)現(xiàn)這一層面的安全。原理上,假設(shè)密鑰沒有被偷走,這些協(xié)議保護(hù)了整個會話內(nèi)容不會被讀取或者篡改。然而,這兩者之間有明顯的不同。
TLS是熟悉的https安全網(wǎng)絡(luò)連接的基礎(chǔ),運(yùn)行在第4層,在傳輸控制協(xié)議(TCP)之上。相應(yīng)的,可以在瀏覽器等應(yīng)用程序中實(shí)現(xiàn)。IPsec運(yùn)行在第3層,必須由操作系統(tǒng)內(nèi)核提供支持,因此,并不像TLS應(yīng)用得那么廣泛。今天,IPsec主要應(yīng)用在企業(yè)虛擬私有網(wǎng)絡(luò)(VPN)中,即使它的確比TLS安全得多。第三,MACsec是功能更強(qiáng)大的以太網(wǎng)數(shù)據(jù)流加密方法,對整個數(shù)據(jù)包進(jìn)行加密,因此,中間人絲毫不會知道源、目的、格式和內(nèi)容。但是,MACsec要求對以太網(wǎng)接口進(jìn)行較大的硬件改變,應(yīng)用不太廣泛。
身份認(rèn)證和加密都有一個邏輯問題:怎樣讓通信對方首先獲得密鑰,而不會被別人偷走?答案是常用的公開密鑰密碼。這一計算量巨大的過程使用了一對密鑰,都來自一個大隨機(jī)數(shù)。一個密鑰是公開的——您可以將其與任何人分享。另一個是私有的,其擁有者一定要保護(hù)好它。
對于身份認(rèn)證,服務(wù)器可以使用私有密鑰加密證書(或者其哈希序列),把加密后的消息發(fā)送給客戶端。然后,任何客戶端都可以采用匹配的公開密鑰對消息解密,驗(yàn)證服務(wù)器是私有密鑰的實(shí)際擁有者。如果解密后產(chǎn)生了有效的證書或者哈希序列,那么,數(shù)據(jù)一定是采用匹配的私有密鑰進(jìn)行了加密。還會詳細(xì)的進(jìn)行記錄,記錄證書的擁有者,進(jìn)一步提高了可信性。然而,服務(wù)器操作人員并不太在意保存好所記錄的證書,因此,客戶端如果能夠解密消息,那么大部分時間都會正常工作。
對于數(shù)據(jù)流本身的安全,過程正好相反。任何人都可以使用公開密鑰對消息加密,但是只有持有匹配私有密鑰的人能夠?qū)ζ浣饷堋?/p>
這種不對稱的方法避免了在服務(wù)器和客戶端首先要傳送未加密密鑰,不需要這樣就能夠傳送信息。但是,加密和解密任務(wù)非常艱巨。Barco Silex的Gregory Baudet說,采用加密軟件對一個短數(shù)字簽名進(jìn)行檢查時,在Cortex®-M3微控制器上需要2.7秒。對于數(shù)據(jù)中心這并不是一個大問題,您可以使用一個Xeon內(nèi)核解決這一問題。但是在相互連接的嵌入式系統(tǒng)中,每秒可能需要接收數(shù)百個簽名,如果不進(jìn)行硬件加速,幾乎就不可能實(shí)現(xiàn)。即使是在客戶端服務(wù)器環(huán)境下,TLS只使用公開密鑰加密方法來保護(hù)密鑰組的交換,然后,應(yīng)用在效率更高的對稱密鑰算法中,以保護(hù)實(shí)際消息。
如果您的通信方——或者互聯(lián)網(wǎng)傳輸路由上的某一跳,被感染了,那么這些都不能保護(hù)您——如果您使用TLS。因此,周界完整性方法會含有最后一道防線,掃描輸入解密后的消息,確定是否有入侵。在數(shù)據(jù)中心,這種方法會對已知病毒相關(guān)的模式進(jìn)行窮盡式搜索。在嵌入式系統(tǒng)中,消息指令表數(shù)量有限,任務(wù)可以是簡單的規(guī)則檢查。取決于復(fù)雜度和速度,這種防火墻可以是從仔細(xì)的保護(hù)軟件任務(wù)直至專用硬件規(guī)則表達(dá)式引擎等各種方法。
內(nèi)部安全
紛亂的軍事歷史最終只剩下破敗的城墻和堡壘。而今天,可怕的安全入侵事件越來越多,數(shù)據(jù)中心架構(gòu)師也開始認(rèn)識到僅有周界防護(hù)是不夠的。他們的系統(tǒng)必須能夠?qū)挂呀?jīng)存在于周界內(nèi)部的攻擊。嵌入式系統(tǒng)也更是如此。
很自然的認(rèn)為內(nèi)部威脅是穿過系統(tǒng)外部防護(hù)而在內(nèi)部發(fā)起的攻擊。但是,正如Edward Snowden所揭示的,人們的注意力已經(jīng)轉(zhuǎn)向了另一場景:內(nèi)部人的威脅。如果一個目標(biāo)的價值比較高——很多工業(yè)、基礎(chǔ)設(shè)施和交通系統(tǒng)都是此類,最簡單、最可靠的攻擊是由內(nèi)部人進(jìn)行的——一個授權(quán)用戶。通過密碼或者身份認(rèn)證,他們可以自由的進(jìn)入系統(tǒng),內(nèi)部人已經(jīng)旁路了第一條防線,可以直接置入惡意軟件或者偷竊數(shù)據(jù)。逐漸地,這些內(nèi)部人發(fā)起的威脅成為內(nèi)部安全所關(guān)注的重點(diǎn)。
內(nèi)部安全的中心任務(wù)在于如何防止未授權(quán)代碼的執(zhí)行。這一任務(wù)相應(yīng)的從安全啟動過程開始。最終,系統(tǒng)在執(zhí)行任何程序之前,必須依靠防篡改硬件對啟動代碼進(jìn)行身份認(rèn)證。相應(yīng)的,啟動代碼在把控制權(quán)交給操作系統(tǒng)代碼之前,必須對其進(jìn)行身份認(rèn)證(圖2)。通常,這一過程會包括建立經(jīng)過身份認(rèn)證的可信模式,管理密鑰存儲訪問、地址空間訪問的授權(quán)代碼,以及應(yīng)用代碼的身份認(rèn)證。
圖 2.需要安全事件鏈才能啟動一個安全系統(tǒng)。
這些任務(wù)中最敏感的是保護(hù)密鑰。通常,在數(shù)據(jù)中心,密鑰存儲、密鑰管理和密碼加速過程都會駐留在專用硬件安全模組中,這些模組與服務(wù)器相分離。這些模組提供了訪問控制、加密和防篡改功能。在嵌入式系統(tǒng)中,密鑰存儲的問題要難得多。一方面,成本、體積和功耗限制導(dǎo)致很難實(shí)現(xiàn)硬件安全模組。另一方面,有可能會給財產(chǎn)甚至生命帶來風(fēng)險。嵌入式系統(tǒng)可能在物理上受到攻擊者的控制,因此,必須保護(hù)密鑰存儲,不受側(cè)面通道的攻擊和物理篡改,而不僅僅是未授權(quán)讀申請。
各種約束可能迫使嵌入式系統(tǒng)開發(fā)人員將密鑰和加密代碼存儲在系統(tǒng)處理器地址空間中的某些地方。這一選擇著重說明了安全啟動過程的重要性,以及可信操作模式的重要性,只有可信操作模式能夠唯一的訪問系統(tǒng)中所有的存儲管理單元。自然地,同樣重要的是不允許任何設(shè)備上的不可信模式直接訪問物理存儲器。
這些措施不僅使得保護(hù)密鑰成為可能,而且還支持實(shí)現(xiàn)其他各類內(nèi)部安全特性。如果一項(xiàng)任務(wù)只能通過可信代碼初始化并準(zhǔn)許訪問存儲器,那么系統(tǒng)就有機(jī)會很好的防止大部分惡意軟件的攻擊。但總是有可能在某些地方、某些情況下攻破防線。
最后一條靜態(tài)防線是對存儲中的數(shù)據(jù)進(jìn)行加密——這很顯然,但是令人驚奇的是,對性能或者利潤的興趣導(dǎo)致忽略了這條防線。如果對存儲的數(shù)據(jù)進(jìn)行了加密,嘗試讀取或者寫入的任何任務(wù)必須提供有效的密鑰。因此,即使一名攻擊者能夠啟動一次惡意軟件攻擊,他仍然需要獲得授權(quán)任務(wù)的存儲加密密鑰。即使介質(zhì)——例如閃存、硬盤或者磁帶等,被物理盜竊了,存儲加密也有保護(hù)數(shù)據(jù)的優(yōu)點(diǎn)。
但是也有挑戰(zhàn)。解密增加了存儲訪問延時——特別是在軟件中進(jìn)行解密的情況。更差的是,軟件解密任務(wù)很容易成為攻擊者的目標(biāo)。因此,出于這些原因,有必要采用基于硬件的加密。
還有一個問題是把加密墻放在哪里。在硬盤和DRAM之間是很顯然的選擇。而閃存越來越多的用于硬盤高速緩存,甚至是主存儲器,那么,您真的希望在共享的非易失存儲器中對文件進(jìn)行解密嗎?在最安全的系統(tǒng)中,處理器SoC本身可以存放密碼,因此,即使是在DRAM中對數(shù)據(jù)加密,那么最好還是在片內(nèi)高速緩存中。對于SoC設(shè)計和系統(tǒng)性能而言,這一方法最有意義。
最后,還有威懾。即使不能完全保護(hù)系統(tǒng)不受內(nèi)部威脅的攻擊,也有可能讓內(nèi)部人覺得攻擊會非常危險。最終,系統(tǒng)能夠跟蹤用戶或者任務(wù)的活動過程,特別是啟動新任務(wù)或者把數(shù)據(jù)輸入輸出系統(tǒng)等關(guān)鍵事件。然后,會通過算法或者通過人員查看,來審查這些記錄,以便發(fā)現(xiàn)可疑的活動。審查并不能阻止攻擊成功。但是,很多內(nèi)部威脅需要不斷的嘗試找到系統(tǒng)防護(hù)的薄弱之處。審查能夠使得任何攻擊都不太可能很快成功,對于攻擊者而言這要冒很大的風(fēng)險。
這種對系統(tǒng)行為的監(jiān)督并不一定要離線或者事后進(jìn)行。您可以設(shè)計一個系統(tǒng)監(jiān)視其自己的行為,甚至對可疑的行為采取反制措施。這種想法促使我們進(jìn)入安全的第三層,主動方法。
主動安全
到目前為止,我們所討論的措施實(shí)際上都是被動的。要么試圖阻止對系統(tǒng)資源的訪問,要么使得這些資源對于入侵者而言是不可用的。但是,還有采用了完全不同的策略的第三類防護(hù):如果已經(jīng)出現(xiàn)了安全破壞事件,那么,想辦法反擊。我們可以把這類措施分成三類:擦除、監(jiān)視,以及機(jī)器學(xué)習(xí)。所有這三類并非源自安全,而是來自可靠性和隨機(jī)故障探測領(lǐng)域。把入侵當(dāng)做是硬件差錯來進(jìn)行查找。
擦除的想法非常簡單:如果系統(tǒng)的某一狀態(tài)對于安全非常關(guān)鍵,那么,經(jīng)常性的讀取它,采用哈希序列對其正確性進(jìn)行驗(yàn)證,如果有必要,還可以給出狀態(tài)報警或者糾正狀態(tài)。這類擦除方法可以選用啟動ROM、在CPU安全模式中執(zhí)行的任何代碼、身份認(rèn)證密鑰、MMU和高速緩存TLB輸入,以及決定FPGA功能的控制RAM等。如果不是采用單獨(dú)的硬件進(jìn)行擦除,隔離篡改惡意軟件,則很難避免出現(xiàn)無限回歸問題。
我們的第二類是行為監(jiān)視:觀察系統(tǒng),以確保它沒有出錯。在實(shí)際中,與數(shù)據(jù)中心相比,這一方法更適用于嵌入式系統(tǒng),能夠更清晰的定義不正確的行為,而在數(shù)據(jù)中心,主機(jī)并不清楚客戶代碼的預(yù)期行為。
某些可靠性非常高的系統(tǒng)中所使用的一個極端的例子是三模組冗余(TMR),請參見圖3。這里,您有同一行為的三種模組——但是,理想情況是采用不同的實(shí)現(xiàn),它們運(yùn)行在鎖步狀態(tài)下,對每一步驟的結(jié)果進(jìn)行投票。一名攻擊者將不得不導(dǎo)致兩種不同的模組在同一步驟上獲得同樣錯誤的結(jié)果,才能影響系統(tǒng)的行為。
圖 3.三模組冗余方法對比一個模組三種獨(dú)立實(shí)現(xiàn)的結(jié)果,對正確狀態(tài)進(jìn)行多數(shù)投票。
TMR要求三個完整的模組附加上對比、投票和錯誤恢復(fù)硬件。如果沒有安全硬件,對投票或者恢復(fù)過程的攻擊能夠避開冗余所提供的保護(hù)功能。您可以只使用兩種模組以降低成本,但是,系統(tǒng)就只能探測錯誤,而無法隨時對其進(jìn)行糾正。
相關(guān)的方法能夠進(jìn)一步降低成本。并沒有采用冗余模組,而是建立一個狀態(tài)機(jī),在每一關(guān)鍵步驟,把系統(tǒng)狀態(tài)和一組全面定義了可接受行為的規(guī)則進(jìn)行對比。這一方法能夠大幅度降低嵌入式系統(tǒng)的成本和功耗,這些系統(tǒng)能夠簡明的定義可接受的行為。這可以用在功能安全系統(tǒng)中,這些系統(tǒng)能夠定義不安全的活動。但是,在實(shí)際中,可能會很難找到足夠的規(guī)則。
這就給我們帶來了第三種可選方法——目前還在試驗(yàn)中:深度學(xué)習(xí)。把系統(tǒng)的關(guān)鍵狀態(tài)變量連接至深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。同時采用正常工作、已知攻擊和隨機(jī)注入故障來訓(xùn)練網(wǎng)絡(luò)。您可能一直不會知道最終網(wǎng)絡(luò)是怎樣工作的,也不能確定網(wǎng)絡(luò)是否正常運(yùn)行。但是在復(fù)雜系統(tǒng)中,有可能超出人類設(shè)計出的規(guī)則。毫無疑問,訓(xùn)練過的網(wǎng)絡(luò)本身必須能夠安全的不受攻擊。
這些主動措施帶來了一個關(guān)鍵問題:我們應(yīng)該在哪一層面上應(yīng)用它們?我們要檢查的模組應(yīng)該是一個寄存器,還是處理器中的一個功能模塊,SoC中一個完整的處理器,或者整個嵌入式系統(tǒng)? 模組粒度越精細(xì),成本越高,具有諷刺意味的,也越難探測到某些攻擊。一個工作良好的CPU能夠很好的執(zhí)行惡意軟件。在全系統(tǒng)層面上進(jìn)行檢查會更經(jīng)濟(jì)一些,但是,很難定義可接受行為的范圍,在某一攻擊對系統(tǒng)造成內(nèi)部損害之前很難發(fā)現(xiàn)它。
總結(jié)
我們提供了三類防護(hù):周界完整性、關(guān)鍵資產(chǎn)安全,以及主動監(jiān)視。從外面的城墻到城堡據(jù)點(diǎn)直至巡邏士兵,我們所提供的與中世紀(jì)軍事指揮官的非常相似。隨著硬件功能虛擬化所支持的云數(shù)據(jù)中心越來越多的執(zhí)行安全關(guān)鍵任務(wù),這些理念將會創(chuàng)新的出現(xiàn)在服務(wù)器、網(wǎng)絡(luò)和存儲硬件中。嵌入式系統(tǒng)在任務(wù)中越來越關(guān)鍵,相互連接也越來越多,這些理念也會在嵌入式系統(tǒng)中實(shí)現(xiàn)。
準(zhǔn)備好了嗎。這是您的城堡。