虛擬化接口對上層虛擬機(jī)不產(chǎn)生影響。在接口層,可以通過virsh命令或API接口創(chuàng)建虛擬機(jī);抽象驅(qū)動(dòng)層,通過函數(shù)注冊的方式,屏蔽了底層driver的具體實(shí)現(xiàn),例如:網(wǎng)絡(luò)驅(qū)動(dòng)(network driver)、存儲(chǔ)驅(qū)動(dòng)(storage driver)、設(shè)備驅(qū)動(dòng)(device driver)、接口驅(qū)動(dòng)(interface driver)、安全驅(qū)動(dòng)(secure driver)、顯示驅(qū)動(dòng)(monitor driver);具體驅(qū)動(dòng)層,針對不同的平臺(tái),預(yù)留不同的驅(qū)動(dòng)來實(shí)現(xiàn)對應(yīng)的虛擬化,例如:XEN、KVM、QEMU、LXC。如圖2所示,一種Libvirt庫的層次結(jié)構(gòu)示意圖。
[0052]在一種可能的實(shí)現(xiàn)方式中,所述預(yù)先設(shè)置安全度量模塊,包括:通過Libvirt庫設(shè)置所述安全度量模塊。
[0053]在一種可能的實(shí)現(xiàn)方式中,可以將關(guān)鍵鏡像文件的信息存儲(chǔ)在列表中,遍歷該列表即可得到需要度量的關(guān)鍵鏡像文件。所述預(yù)先確定虛擬機(jī)鏡像中待度量的關(guān)鍵鏡像文件,包括:預(yù)先設(shè)置存儲(chǔ)虛擬機(jī)鏡像中待度量的關(guān)鍵鏡像文件的信息的列表;
[0054]所述S2,包括:遍歷所述列表,根據(jù)待度量的關(guān)鍵鏡像文件的信息,確定當(dāng)前關(guān)鍵鏡像文件,度量當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件。
[0055]由于當(dāng)文件不變時(shí),該文件的哈希值也不變,如果該文件被修改,則其哈希值也會(huì)發(fā)生改變,因此可以通過計(jì)算關(guān)鍵鏡像文件的哈希值來判斷關(guān)鍵鏡像文件是否被篡改。
[0056]在一種可能的實(shí)現(xiàn)方式中,在所述SI之前,還包括:預(yù)先設(shè)置每個(gè)當(dāng)前關(guān)鍵鏡像文件的第一哈?;鶞?zhǔn)值;
[0057]所述S2中所述度量當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件,包括:
[0058]對當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件進(jìn)行安全散列算法SHA-1度量,得到每個(gè)當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值;
[0059]所述S3,包括:
[0060]判斷是否滿足每個(gè)當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值與對應(yīng)的第一哈?;鶞?zhǔn)值均相等,如果是,則確定啟動(dòng)當(dāng)前虛擬機(jī),否則,確定不啟動(dòng)當(dāng)前虛擬機(jī)。
[0061]在一種可能的實(shí)現(xiàn)方式中,在所述SI之前,還包括:預(yù)先設(shè)置當(dāng)前關(guān)鍵鏡像文件的第二哈?;鶞?zhǔn)值;
[0062]所述S2,包括:
[0063]對當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件進(jìn)行SHA-1 (Secure Hash Algorithm,譯作安全散列算法)度量,得到當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值;
[0064]所述S3,包括:
[0065]判斷所有當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值之和與所述第二哈?;鶞?zhǔn)值是否相等,如果是,則確定啟動(dòng)當(dāng)前虛擬機(jī),否則,確定不啟動(dòng)當(dāng)前虛擬機(jī)。
[0066]其中,當(dāng)前關(guān)鍵鏡像文件的第二哈?;鶞?zhǔn)值可以是預(yù)先計(jì)算出的當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值。
[0067]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖及具體實(shí)施例對本發(fā)明作進(jìn)一步地詳細(xì)描述。
[0068]在本實(shí)施例中,提供了一種保護(hù)KVM虛擬化平臺(tái)下的虛擬機(jī)的安全的方法。KVM(Kernel-based Virtual Machine)是基于Linux內(nèi)核的虛擬機(jī),它在標(biāo)準(zhǔn)的Linux內(nèi)核中增加了虛擬技術(shù),通過優(yōu)化的內(nèi)核來支持虛擬化。在KVM模型中,每一個(gè)虛擬機(jī)都是由Linux調(diào)度程序管理的標(biāo)準(zhǔn)進(jìn)程。在KVM平臺(tái)下,創(chuàng)建虛擬機(jī)主要有以下方式:(1)KVM自帶命令行工具;(2) virsh命令;(3) virt-manager等。它們底層實(shí)現(xiàn)都是通過開源虛擬化庫Libvirt來完成的。Libvirt庫是一種實(shí)現(xiàn)Linux虛擬化功能的Linux API,Libvirt基于驅(qū)動(dòng)程序?yàn)榧軜?gòu)的工具包,該架構(gòu)允許以一種通用的API,通過相似的調(diào)用方式,為不同的虛擬機(jī)監(jiān)控程序提供服務(wù)。在KVM虛擬化平臺(tái)下,創(chuàng)建/重啟虛擬機(jī)時(shí)通過Libvirt庫添加鏡像文件度量功能,來驗(yàn)證Guest OS鏡像文件的完整性,防止攻擊者對操作系統(tǒng)關(guān)鍵模塊篡改,保證系統(tǒng)啟動(dòng)過程的安全可信。KVM虛擬平臺(tái)由兩個(gè)內(nèi)核模塊kvm.ko和kvm_intel.ko (Inter處理器)提供支持。KVM通過加載內(nèi)核模塊將Linux內(nèi)核轉(zhuǎn)換為系統(tǒng)管理程序。此內(nèi)核模塊導(dǎo)出名為/dev/kvm的設(shè)備,可以啟用內(nèi)核的客戶模式。基于此種機(jī)制,虛擬機(jī)使自己的地址空間獨(dú)立于內(nèi)核空間。為支持不同虛擬機(jī)間的隔離,每個(gè)啟動(dòng)/dev/kvm的進(jìn)程對應(yīng)不同的內(nèi)存映射。內(nèi)核模塊只提供了 CPU和內(nèi)存的虛擬化,用戶空間的I/O虛擬化是通過QEMU來實(shí)現(xiàn)的。如圖3所示,一種KVM虛擬機(jī)的系統(tǒng)架構(gòu)示意圖,圖中包括:用戶空間、KVM虛擬機(jī)、QEMU、/dev/kvm設(shè)備、Libvirt庫、虛擬機(jī)監(jiān)視器、硬件資源。
[0069]如圖4所示,本發(fā)明實(shí)施例提供了一種保護(hù)虛擬機(jī)的安全的方法,該方法可以包括以下步驟:
[0070]步驟401:預(yù)先設(shè)置存儲(chǔ)KVM鏡像中待度量的關(guān)鍵鏡像文件的信息的列表,預(yù)先通過Libvirt庫設(shè)置安全度量模塊,預(yù)先設(shè)置當(dāng)前關(guān)鍵鏡像文件的第二哈?;鶞?zhǔn)值。
[0071]在虛擬機(jī)鏡像中有很多鏡像文件,當(dāng)前外部入侵虛擬機(jī)時(shí),可能會(huì)對這些文件進(jìn)行篡改,威脅虛擬機(jī)的安全。為了保證虛擬機(jī)的安全,在啟動(dòng)虛擬機(jī)過程中,需要對虛擬機(jī)鏡像中的鏡像文件進(jìn)行檢測。通過該步驟可以預(yù)先設(shè)定需要檢測的鏡像文件,即關(guān)鍵鏡像文件。可以將關(guān)鍵鏡像文件的信息存儲(chǔ)在列表中,當(dāng)檢測時(shí),從列表中獲取關(guān)鍵鏡像文件的信息,通過該信息來找到關(guān)鍵鏡像文件。該信息可以是關(guān)鍵鏡像文件的名稱、存儲(chǔ)路徑等。
[0072]步驟402:加載當(dāng)前KVM虛擬機(jī)的當(dāng)前KVM鏡像。
[0073]每個(gè)虛擬機(jī)都需要虛擬機(jī)鏡像來啟動(dòng),在一臺(tái)宿主機(jī)上,可能存在多個(gè)虛擬機(jī),對這些虛擬機(jī)進(jìn)行相互獨(dú)立的檢測。每個(gè)虛擬機(jī)都可以通過安全度量模塊來檢測。
[0074]步驟403:通過Libvirt接口調(diào)用所述安全度量模塊,通過所述安全度量模塊遍歷所述列表,根據(jù)待度量的關(guān)鍵鏡像文件的信息,確定當(dāng)前關(guān)鍵鏡像文件,對當(dāng)前KVM鏡像中的當(dāng)前關(guān)鍵鏡像文件進(jìn)行SHA-1度量,得到當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值。
[0075]在該步驟中,計(jì)算關(guān)鍵鏡像文件的哈希值時(shí),也可以采用其他方法實(shí)現(xiàn),例如:SHA-224、SHA-256、SHA-384、SHA-512。
[0076]步驟404:判斷所有當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值之和與所述第二哈希基準(zhǔn)值是否相等,如果是,則執(zhí)行步驟405,否則,執(zhí)行步驟406。
[0077]由于關(guān)鍵鏡像文件可以有多個(gè),在與第二哈?;鶞?zhǔn)值進(jìn)行比較時(shí),可以通過所有關(guān)鍵鏡像文件的哈希值之和與對應(yīng)的第二哈?;鶞?zhǔn)值進(jìn)行比較。也可以設(shè)置多個(gè)第二哈希基準(zhǔn)值,每個(gè)關(guān)鍵鏡像文件對應(yīng)一個(gè)第二哈?;鶞?zhǔn)值,然后,將計(jì)算出的每個(gè)關(guān)鍵鏡像文件的哈希值與對應(yīng)的第二哈?;鶞?zhǔn)值進(jìn)行比較,當(dāng)有其中一個(gè)關(guān)鍵鏡像文件的哈希值與對應(yīng)的第二哈?;鶞?zhǔn)值不相等時(shí),則確定不啟動(dòng)當(dāng)前虛擬機(jī)。
[0078]步驟405:確定啟動(dòng)當(dāng)前KVM虛擬機(jī);
[0079]步驟406:確定不啟動(dòng)當(dāng)前KVM虛擬機(jī)。
[0080]另外,需要說明的是:可以將計(jì)算出的關(guān)鍵鏡像文件的度量結(jié)果發(fā)送給預(yù)先設(shè)定的可信第三方,通過預(yù)先設(shè)定的可信第三方來執(zhí)行步驟S3,具體地,可以通過可信第三方來比較第二哈?;鶞?zhǔn)值和對應(yīng)的關(guān)鍵鏡像文件的哈希值。該可信第三方可以通過當(dāng)前虛擬機(jī)的 UUID (Universally Unique Identifier,通用唯一識(shí)別碼)與 Domain ID (域 ID)來確定該當(dāng)前虛擬機(jī)。
[0081]參見圖5,本實(shí)施例提供的一種保護(hù)虛擬機(jī)的安全的裝置,包括:
[0082]第一確定單元501,用于確定虛擬機(jī)鏡像中待度量的關(guān)鍵鏡像文件;
[0083]第一設(shè)置單兀502,用于設(shè)置安全度量模塊;
[0084]加載單元503,用于加載當(dāng)前虛擬機(jī)的當(dāng)前虛擬機(jī)鏡像;
[0085]度量單元504,用于通過Libvirt接口調(diào)用所述安全度量模塊,通過所述安全度量模塊度量當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件;
[0086]第二確定單元505,用于根據(jù)當(dāng)前關(guān)鍵鏡像文件的度量結(jié)果,確定是否啟動(dòng)當(dāng)前虛擬機(jī)。
[0087]在一種可能的實(shí)現(xiàn)方式中,該裝置還包括:第二設(shè)置單元,用于設(shè)置每個(gè)當(dāng)前關(guān)鍵鏡像文件的第一哈希基準(zhǔn)值;
[0088]所述度量單元,用于在執(zhí)行度量當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件時(shí),具體執(zhí)行:對當(dāng)前虛擬機(jī)鏡像中的當(dāng)前關(guān)鍵鏡像文件進(jìn)行安全散列算法SHA-1度量,得到每個(gè)當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值;
[0089]所述第二確定單元,用于判斷是否滿足每個(gè)當(dāng)前關(guān)鍵鏡像文件的SHA-1哈希值與對應(yīng)的第一哈?;鶞?zhǔn)