馬威,曹劉洋,菅朋朋
(1.華北水利水電大學(xué) 信息工程學(xué)院,鄭州 450046;2.重慶理工大學(xué) 兩江人工智能學(xué)院,重慶 401135)
近年來,云計算由于低成本、高可靠、高可用以及彈性可伸縮的優(yōu)勢,在各行各業(yè)得到廣泛應(yīng)用[1-2].快速部署是云計算中的關(guān)鍵技術(shù)之一,這一技術(shù)能夠按需動態(tài)組織云環(huán)境中的軟件、硬件資源,同時能及時響應(yīng)用戶動態(tài)的、多樣化的計算需求.在當(dāng)前的快速部署技術(shù)中,往往需要一個預(yù)定義的模板,其中包含了組織好的軟件資源,這一模板被稱為云鏡像.當(dāng)用戶發(fā)起部署請求時,快速部署機制能夠基于云鏡像快速實例化用戶所需的云計算資源[3].例如在IaaS(Infrastructure as a Service)中,用戶獲得的是一個基于模板實例化的虛擬主機;在PaaS(Platform as a Service)中,用戶獲取的是一個基于模板實例化的容器.快速部署隨著這些年來云計算技術(shù)自身的發(fā)展而發(fā)展,如虛擬機克隆技術(shù),能夠從運行態(tài)的父虛擬機中動態(tài)克隆得到一個新的虛擬機[4],或是運用fork函數(shù)的思想,利用父虛擬機并行克隆出大量子虛擬機,提高部署效率[5-6];Copy-On-Write技術(shù)也被運用在虛擬機的快速部署中,它僅傳輸模板中需要修改的數(shù)據(jù)塊,因此能夠極大提高部署的速度[7-8];有方法進(jìn)一步將云鏡像的存儲也分布式化和虛擬化,使用存儲池和并行傳輸來進(jìn)一步提高部署的速度[3,9-10].
關(guān)于快速部署的研究進(jìn)展主要集中在效率方面[11],即如何使部署速度更快,以便更快捷地響應(yīng)用戶的服務(wù)請求,而云鏡像則在快速部署中始終扮演不可或缺的核心角色.但是,云鏡像往往會成為攻擊者的攻擊目標(biāo).例如篡改云鏡像,在其中注入惡意代碼,進(jìn)而構(gòu)建僵尸網(wǎng)絡(luò)[12],最近幾年中,又頻繁出現(xiàn)攻擊者篡改云鏡像,植入挖礦軟件從而獲得經(jīng)濟(jì)利益的事件[13].因此,對云鏡像的保護(hù)應(yīng)當(dāng)是云計算安全的重要一環(huán).
對云鏡像的保護(hù),主要體現(xiàn)在防止云鏡像被篡改,即確保云鏡像的數(shù)據(jù)完整性不會遭到破壞.而云計算環(huán)境中數(shù)據(jù)完整性的保護(hù)一直是研究重點之一,最普遍采用的方法是使用鏡像文件或數(shù)據(jù)文件的散列值對數(shù)據(jù)完整性進(jìn)行監(jiān)控,但這種傳統(tǒng)方法的效率低下,面對云計算環(huán)境中海量的鏡像數(shù)據(jù)處理速度無法滿足云環(huán)境的需求.在使用散列值的基礎(chǔ)上,引入了哈希鏈來確保數(shù)據(jù)完整性.文獻(xiàn)[14-15]使用了哈希鏈,并結(jié)合了其他密碼學(xué)技術(shù)提出了在分布式系統(tǒng)上的證書撤銷機制,能夠檢測到對數(shù)據(jù)塊修改和刪除的動機.但是基于哈希鏈的方法與傳統(tǒng)的基于散列值的方法類似,需要大量的驗證工作,難以適應(yīng)數(shù)據(jù)量巨大的云環(huán)境.另一類廣泛運用的檢測數(shù)據(jù)完整性的方法是使用Merkel樹,Merkel樹是一種樹形結(jié)構(gòu),其中每個葉結(jié)點是數(shù)據(jù)塊的哈希,每個非葉子結(jié)點是其子結(jié)點的哈希.文獻(xiàn)[16-18]使用Merkel樹對云存儲中的數(shù)據(jù)進(jìn)行了動態(tài)驗證,文獻(xiàn)[19-20]使用Merkel樹實現(xiàn)了云數(shù)據(jù)的保護(hù)和驗證.相比較于哈希鏈和傳統(tǒng)散列值的完整性驗證方法,Merkel樹最大的優(yōu)點在于它可以通過對根節(jié)點的單次哈希運算實現(xiàn)對所有葉子節(jié)點(即對應(yīng)的數(shù)據(jù))的完整性驗證,能夠有效提高驗證效率,因此Merkel樹在完整性驗證中有著十分廣泛的應(yīng)用.但是,由于Merkel樹是靜態(tài)構(gòu)建的,與云計算環(huán)境中動態(tài)性的要求難以匹配.
近年來,區(qū)塊鏈技術(shù)的發(fā)展為完整性檢測提供了新的方法和思路.區(qū)塊鏈?zhǔn)请S著加密數(shù)字貨幣出現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu),具有去中心化、時序性、安全可信等特點[21].在每一個區(qū)塊中,將不同的事務(wù)/交易進(jìn)行哈希運算后,使用Merkel樹的形式進(jìn)行存儲,確保了事務(wù)/交易的完整性;使用鏈?zhǔn)浇Y(jié)構(gòu)將區(qū)塊進(jìn)行組織,讓信息可以動態(tài)追溯.從本質(zhì)上而言,區(qū)塊鏈?zhǔn)且环N不可篡改的賬本,保障數(shù)據(jù)完整性的核心內(nèi)容相匹配,因此區(qū)塊鏈在數(shù)據(jù)完整性保護(hù)方面具有很強的研究意義[22].
在本文中,結(jié)合區(qū)塊鏈技術(shù)提出了一種云鏡像完整性監(jiān)測方法.首先,對云環(huán)境中可用的云鏡像進(jìn)行哈希運算,形成一棵Merkel樹并記錄在一個區(qū)塊中,該Merkel樹記錄了所有鏡像的哈希信息,通過對它根節(jié)點的驗證即可實現(xiàn)對所有鏡像的完整性驗證;然后,以一個固定的時間間隔重復(fù)上一步,并形成區(qū)塊鏈;最后,實時監(jiān)控最新區(qū)塊中Merkel樹的根節(jié)點,發(fā)現(xiàn)變化則意味著有鏡像的完整性遭到了破壞,進(jìn)而迅速定位被篡改的鏡像文件.方法的創(chuàng)新點主要體現(xiàn)在:(1)引入Merkel樹作為存儲云鏡像完整性信息的靜態(tài)數(shù)據(jù)結(jié)構(gòu);(2)使用區(qū)塊鏈機制實現(xiàn)云鏡像完整性的動態(tài)存證和可追溯;(3)通過實驗證明,本文提出的方法能夠帶來3%以上的性能提升.
在云計算環(huán)境中,云鏡像主要用來快速實例化所需的虛擬機實例,單個云鏡像的生命周期如圖1所示.
云鏡像是云計算快速部署機制的核心.一般情況下,云鏡像會集中存儲在云鏡像服務(wù)器中,當(dāng)收到用戶發(fā)起的部署請求后,云中的調(diào)度機制會尋找有足夠空閑資源的主機,然后將相應(yīng)云鏡像復(fù)制(全部復(fù)制或使用Copy-On-Write機制部分復(fù)制)到目標(biāo)主機,并使用該鏡像實例化虛擬機.云鏡像也支持云用戶之間和云服務(wù)提供商之間的共享.此外,云鏡像還會根據(jù)需求(軟件升級、安裝補丁等)進(jìn)行更新.基于某個云鏡像實例化的虛擬機,其中必定包含和運行云鏡像中預(yù)置的軟件程序,因此對云鏡像進(jìn)行篡改,在其中注入惡意軟件、僵尸程序或挖礦軟件,是針對云計算環(huán)境的一種有效攻擊手段,保護(hù)云鏡像的完整性至關(guān)重要.
首先分析攻擊者的目的.對于攻擊者而言,其目的主要在于:(1)利用云計算平臺可觀的算力來進(jìn)行發(fā)起于網(wǎng)絡(luò)內(nèi)或者網(wǎng)絡(luò)之間的惡意攻擊;(2)浪費云計算資源,直接損害云計算供應(yīng)商的利益;(3)惡意占用云計算平臺算力資源,對云計算用戶造成間接的危害;(4)利用云計算海量的網(wǎng)絡(luò)資源和數(shù)據(jù)資源非法獲取云計算平臺中用戶的隱私數(shù)據(jù),給云計算平臺企業(yè)、用戶和與之互聯(lián)的網(wǎng)絡(luò)主機帶來直接和間接的危害.攻擊者能力如表1所示.
表1 攻擊者能力
這一攻擊者模型的定義旨在明確攻擊者的目標(biāo)、能力范圍,進(jìn)而在這些基礎(chǔ)上設(shè)計方法.
本文提出的方法可用算法1中的偽代碼描述.
算法1 云鏡像監(jiān)測輸入:鏡像文件M(1)t,M(2)t,…,M(n)t輸出:被篡改的文件編號i1:if no New Block then2: MTt←MerkelTree(M(1)t,M(2)t,…,M(n)t)3: Build New Block with MTt4:end if5:MTt+δ←MerkelTree(M(1)t+δ,M(2)t+δ,…,M(n)t+δ)6:Nodet←MTt. RootNode7:Nodet+δ←MTt+δ.RootNode8:while Diff (Nodet,Nodet+δ)=TRUE do9: if Nodet is Leaf Node then10: return id of Nodet11: else12: Nodet←Nodet.ChildNode13: Nodet+δ←Nodet+δ.ChildNode14: end if15:end while
在這一方法中,主要包括以下幾個步驟:鏡像完整性度量步驟、區(qū)塊鏈構(gòu)造步驟、鏡像完整性監(jiān)測步驟和鏡像篡改檢測步驟.
方法的第一步,需要對鏡像進(jìn)行完整性度量并構(gòu)成區(qū)塊鏈所需的Merkel樹.在這一步所產(chǎn)生的Merkel樹中,其葉子節(jié)點與云環(huán)境中的鏡像一一對應(yīng),即每個葉子節(jié)點存放的是鏡像文件的哈希值.用M1,M2,…,Mn表示云環(huán)境中的n個鏡像,H(M)表示其對應(yīng)的哈希值,則Merkel樹的葉子節(jié)點的內(nèi)容分別為H(M1),H(M2),…,H(Mn).Merkel樹中非葉子節(jié)點中存放的哈希值,則由對其左右孩子節(jié)點的哈希值進(jìn)行二次哈希得到,如M1和M2所對應(yīng)的父節(jié)點中存放的內(nèi)容為H(H(M1)‖H(M2)).最終產(chǎn)生的Merkel樹的結(jié)構(gòu)如圖2所示.
由于Merkel樹是一棵完全二叉樹,而鏡像文件的數(shù)量未必滿足這一要求,因此在生成Merkel樹時,需要對樹的高度加以考慮.用h表示完整性度量得到的Merkel樹的高度,那么在n個云鏡像的情況下,必然有n≤2(h-1).為了生成高度最小的Merkel樹,需要遵循以下步驟:
(1)計算鏡像M1至Mn的哈希值,在Merkel樹的2(h-1)-1至2h-1+n-2葉子節(jié)點中存儲;
(2)使用空白值填充Merkel樹2h-1+n-1至2h-1-2的葉子節(jié)點;
(3)除葉子結(jié)點外的所有非葉子結(jié)點按照從最大非葉子結(jié)點遞減的順序遞歸地從其左右孩子的哈希值中計算出新的等長哈希值,逐層向上遞歸計算哈希值,最終計算到Root結(jié)點的哈希值.
經(jīng)過這一過程構(gòu)造的Merkel樹,其根節(jié)點中存儲的哈希值對所有鏡像的完整性敏感,即任何鏡像的修改都會導(dǎo)致根節(jié)點哈希的變化.
為鏡像文件生成相應(yīng)的完整性度量Merkel樹后,可以進(jìn)一步構(gòu)造區(qū)塊鏈.在t0時刻,系統(tǒng)生成創(chuàng)世區(qū)塊;每隔一段時間,系統(tǒng)會重新為每個鏡像進(jìn)行完整性度量,重構(gòu)Merkel樹,并將新的Merkel樹打包到區(qū)塊鏈中.區(qū)塊及區(qū)塊鏈的結(jié)構(gòu)如圖3所示.
每個區(qū)塊包含區(qū)塊頭和區(qū)塊體,其中區(qū)塊頭中包含當(dāng)前的Merkel樹的根節(jié)點,以及指向前一個和后一個區(qū)塊的指針、時間戳和一個隨機數(shù);區(qū)塊體則包含了當(dāng)前Merkel樹的根節(jié)點以外的其他節(jié)點.系統(tǒng)在t0時刻生成創(chuàng)世區(qū)塊后,會在t1,t2,…,tm時刻生成區(qū)塊1,區(qū)塊2,區(qū)塊m等,其時間戳tk,k∈[1,m]被記錄在區(qū)塊頭中,區(qū)塊體則是在這個時刻重構(gòu)的Merkel樹.為了防止TOCTOU(Time-Of-Check-Time-Of-Use)攻擊,系統(tǒng)通過調(diào)整隨機數(shù)的計算難度來控制區(qū)塊產(chǎn)生的速度,即區(qū)塊產(chǎn)生的時間間隔δ=t1-t0=t2-t1=…=tm-tm-1是一個恒定值,且需要根據(jù)云鏡像的具體情況確定其具體取值.
在本文提出的方法中,Merkel樹保存了靜態(tài)的云鏡像完整性信息,區(qū)塊鏈則實現(xiàn)了信息的動態(tài)存證.
在構(gòu)造了相應(yīng)Merkel樹和區(qū)塊鏈的基礎(chǔ)上,可以對當(dāng)前時刻鏡像庫中的云鏡像完整性進(jìn)行監(jiān)測.監(jiān)測的目的在于確認(rèn)云鏡像沒有被篡改,由于區(qū)塊鏈中Merkel樹的存在,因此對所有鏡像完整性的監(jiān)測主要在于對Merkel樹根節(jié)點的監(jiān)測.首先,方法依據(jù)時間戳檢查當(dāng)前區(qū)塊的生成時間,即檢查最新區(qū)塊是否生成:如果最新區(qū)塊尚未生成,則生成最新區(qū)塊;如果最新區(qū)塊已經(jīng)生成,則從最新區(qū)塊中讀取當(dāng)前Merkel樹中根節(jié)點中存儲的哈希值,監(jiān)測最新區(qū)塊中的一根哈希與前一個區(qū)塊相比是否變化;當(dāng)監(jiān)測到根哈希變化時,由于Merkel樹的特性,即可認(rèn)為是某個鏡像被篡改,進(jìn)而啟動檢測機制對篡改進(jìn)行檢測.
當(dāng)監(jiān)測機制發(fā)現(xiàn)了鏡像篡改后,會啟動檢測機制定位被篡改的鏡像.首先,依據(jù)現(xiàn)有鏡像構(gòu)建新的Merkle樹,將其根結(jié)點與當(dāng)前區(qū)塊中Merkle樹的根節(jié)點進(jìn)行對應(yīng)比較,如果這兩結(jié)點的哈希值相同的話,則認(rèn)為沒有發(fā)生篡改;如果這兩結(jié)點的哈希值不同的話,則需要進(jìn)行進(jìn)一步的判斷:先判斷此結(jié)點是否為Merkle樹的葉子結(jié)點,如是,則該節(jié)點對應(yīng)的鏡像文件已經(jīng)遭到篡改;如果此結(jié)點不是葉子結(jié)點,則分別對此結(jié)點的左孩子結(jié)點和右孩子結(jié)點進(jìn)行以上判斷.通過這種遞歸式的判斷,進(jìn)而定位到被篡改的鏡像文件所對應(yīng)的葉子節(jié)點.
本文從遍歷、監(jiān)測和監(jiān)測3個角度分析時間復(fù)雜度.在有n個云鏡像的云環(huán)境中,之前的方法中使用傳統(tǒng)哈希值或文獻(xiàn)[10-11]中使用的哈希鏈方法對云鏡像的完整性驗證時,由于兩者均為線性結(jié)構(gòu),因此遍歷需要逐一處理,其時間復(fù)雜度為O(n);監(jiān)測鏡像完整性時,需要逐一比對,因此監(jiān)測的時間復(fù)雜度也是O(n);檢測被篡改的鏡像文件時,同樣需要逐一處理,因此時間復(fù)雜度是O(n).而本文提出的方法,在遍歷時,首先需要為每個鏡像進(jìn)行完整性計算并建立Merkel樹,因此時間復(fù)雜度是O(n);在監(jiān)測鏡像文件是否被篡改時,由于Merkle 樹的良好性質(zhì),僅需比對根結(jié)點處的哈希值,因此在鏡像文件的監(jiān)測階段時間復(fù)雜度僅為O(1).當(dāng)發(fā)現(xiàn)根節(jié)點的變化,即需要檢測和定位具體的被篡改鏡像時,會依據(jù)上述流程執(zhí)行遞歸操作:
(1)讀取根結(jié)點的內(nèi)容;
(2)判斷根結(jié)點內(nèi)容是否發(fā)生了變化,若沒有變化則結(jié)束,若有變化則執(zhí)行(3);
(3)若此節(jié)點為葉子結(jié)點,則此結(jié)點對應(yīng)鏡像文件遭到篡改,否則將此結(jié)點的左右孩子結(jié)點分別帶入(2)中進(jìn)行判斷.
圖4描述了一個定位兩個被篡改鏡像的示例.在圖4所示的例子中,鏡像和被篡改了.重構(gòu)Merkel樹后,首先,方法會發(fā)現(xiàn)根結(jié)點的哈希值變化;然后,方法會尋找根結(jié)點的孩子結(jié)點即A結(jié)點和B結(jié)點,比對其值與當(dāng)前區(qū)塊中的對應(yīng)節(jié)點的值,發(fā)現(xiàn)A結(jié)點的值發(fā)生了變化而B結(jié)點的值并未改變,這意味著篡改發(fā)生在A 結(jié)點的子孫結(jié)點;然后,方法再進(jìn)一步比對A結(jié)點的孩子結(jié)點,即C結(jié)點和D結(jié)點.這樣逐步遞歸,可以最終定位到被篡改的鏡像文件.這一檢測過程實質(zhì)上是完全二叉樹的查找過程,其時間復(fù)雜度為O(log2n).表2總結(jié)了之前文獻(xiàn)中使用哈希值或哈希鏈的方法與本文提出方法的時間復(fù)雜度的對比.
表2 時間復(fù)雜度對比
本文實現(xiàn)了一套原型系統(tǒng)以進(jìn)一步驗證所提出方法的性能.原型系統(tǒng)使用以太坊構(gòu)建私有區(qū)塊鏈,部署5個結(jié)點完成共識,選用PoA(Proof of Authority)共識機制.其中創(chuàng)世區(qū)塊文件中的period參數(shù)被設(shè)置為300,即區(qū)塊產(chǎn)生的時間間隔被設(shè)置為5 min(300 s).因此,當(dāng)前的云鏡像每5 min會進(jìn)行一次完整性檢查,構(gòu)造Merkel樹并生成一個新的區(qū)塊.原型系統(tǒng)中準(zhǔn)備了3種不同的云鏡像文件:(1)Windows鏡像文件,可用于快速部署Windows虛擬機;(2)RedHat Linux鏡像文件,可用于快速部署Linux虛擬機;(3)CentOS鏡像,其中內(nèi)置了LAMP程序,可用于快速部署LAMP環(huán)境.這些云鏡像文件的大小各不相同,通過組合這3種云鏡像,實驗在原型系統(tǒng)中模擬了3種應(yīng)用場景,以檢驗方法的性能,其中場景1包含兩個CentOS鏡像以及RedHat鏡像和Winows鏡像各1;場景2包含兩個CentOS鏡像和5個RedHat鏡像;場景3包含4個CentOS鏡像、10個RedHat鏡像以及4個Windows鏡像.實驗分別計算了在這3種場景下構(gòu)建Merkel樹和定位被篡改的鏡像文件時的時間開銷,以驗證方法的性能,實驗結(jié)果如圖5所示.
圖5中的實驗結(jié)果顯示,當(dāng)云鏡像規(guī)模的增長時,構(gòu)建Merkel樹的時間還是定位篡改文件的時間開銷都會隨之增加.而在所有的場景下,本文提出的方法的性能表現(xiàn)都要優(yōu)于之前基于哈希值或哈希鏈的方法,并且云鏡像的規(guī)模越大,本文方法所表現(xiàn)出來的優(yōu)越性越強,例如在構(gòu)建Merkel樹的時間開銷上,在場景1即云鏡像總規(guī)模為10.2 GB時,本文方法相對于之前的方法有約0.5%的性能優(yōu)勢,而在場景3即云鏡像總規(guī)模為50 GB時,本文方法則表現(xiàn)出了約3.25%的性能優(yōu)勢.這表明了本文提出的方法更適用于大規(guī)模存儲的環(huán)境,例如云鏡像的集中存儲環(huán)境.此外,在原型系統(tǒng)的區(qū)塊鏈環(huán)境中,5個參與結(jié)點僅用于完成PoA共識,將鏡像的哈希信息記錄在Merkel樹中并在新生成的區(qū)塊中存儲,并不涉及代幣的交易或智能合約的運行,同時也沒有PoW(Proof of Work)共識機制下的“挖礦”活動,因此不會產(chǎn)生區(qū)塊鏈系統(tǒng)內(nèi)部資源(如gas)的消耗.
下面從安全性、可追溯性和可擴展性三方面對本文提出的方法進(jìn)行討論.
安全性:本文提出方法的監(jiān)測與檢測過程都依賴于預(yù)先構(gòu)建的Merkel樹,該Merkel樹存放在區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)中,而區(qū)塊鏈防篡改的特性決定了這一Merkel樹是無法被非法修改的.同時,方法可以通過調(diào)整δ的取值來規(guī)避TOCTOU攻擊,確保無法在區(qū)塊生成的間隙實施攻擊.此外,根據(jù)1.2中定義的攻擊者模型,攻擊者不具有攻擊區(qū)塊鏈機制的知識和能力.因此,本文所提出方法的安全性是可以保證的.
可追溯性:本文提出的方法中,區(qū)塊是依據(jù)同樣的時間間隔逐一生成的,這種時序特性賦予了方法可追溯性.當(dāng)檢測到當(dāng)前區(qū)塊的完整性變化時,表明攻擊行為發(fā)生在當(dāng)前區(qū)塊建立之前,前一個區(qū)塊建立之后,因此能夠通過完整性檢測確定系統(tǒng)遭受攻擊的時間.此外,鏡像的完整性信息按照時間順序被保存在區(qū)塊鏈中,作為存證便于系統(tǒng)在遭受攻擊后恢復(fù)被篡改的鏡像.
可擴展性:區(qū)塊鏈去中心化的特性使得本文提出的方法具有可擴展性.在真實的云環(huán)境中,云鏡像往往采用分布式儲存的方法進(jìn)行部署.在這種情況下,本文的方法可以調(diào)整為:各個存儲節(jié)點共同維護(hù)一個區(qū)塊鏈,單個存儲節(jié)點為自己維護(hù)的鏡像文件構(gòu)建Merkel樹,獲取區(qū)塊鏈的記賬權(quán),生成新的區(qū)塊并最終組成區(qū)塊鏈;其中,對單個存儲節(jié)點而言,其所維護(hù)的云鏡像所對應(yīng)的區(qū)塊按照固定時間間隔生成,記作δ1;對于整個區(qū)塊鏈而言,兩個相鄰區(qū)塊的生成時間間隔也是固定值,記作δ2.通過調(diào)整δ1和δ2的取值,可以確保區(qū)塊鏈有序地對所有存儲節(jié)點中存儲的鏡像文件進(jìn)行完整性存證,同時也支持新存儲節(jié)點的動態(tài)加入和動態(tài)離開,即實現(xiàn)了擴展性.
本文研究了一種云鏡像完整性監(jiān)測方法,基于Merkel樹技術(shù)和區(qū)塊鏈技術(shù)對云鏡像文件的完整性實施動態(tài)監(jiān)測和篡改檢測.其中,借助于Merkel樹的特性,本文提出的方法實現(xiàn)了高效率的完整性監(jiān)測;區(qū)塊鏈在本文提出的方法中,體現(xiàn)出了時序性、分布式和防篡改的特性,借助于這些特性,使得本文提出的方法是一種安全、可追溯及可擴展的方法.通過實驗和分析,驗證了本文提出的方法在效率上優(yōu)于傳統(tǒng)方法.在未來的工作中,將著力于解決方法在動態(tài)性方面尚存的不足.