X86伺服器虛擬化的三種技術(2)

餘二五發表於2017-11-15
在上一講中我介紹了:Intel的VT(Virtual Technology)和AMD的AMD-V(AMD Virtualization)技術對X86架構處理器打了硬體補丁之後,X86平臺在虛擬CPU與內部儲存器方面變成了一個支援完全虛擬化的平臺,在這方面,Citrix Xen,MS Hyper-V(“在旁邊的虛擬化”)與VMware ESX(全虛擬化)之間的差別已不復存在。但我必須提醒:前兩者與後者在虛擬輸入輸出裝置(IO Devices)方面仍然存在著一個根本的重要的差別。本講揭示這一差別。
與虛擬CPU和記憶體的情況一樣,虛擬一個IO裝置也是讓一個虛擬機器(VM)感覺到它是在獨享該裝置。所以IO裝置虛擬化任務也是替每一個VM分別管理好所用裝置的服務狀態(service state)。設想當一個裝置(如網路卡)在某個時間片斷為VM1提供了一個服務片斷(讀入一頁網頁),在下一個時間片斷要轉而向VM2提供服務時,此時系統就必須先記住該裝置為VM1提供當前服務片斷後的狀態,才可以讓裝置轉向服務於VM2。只有這樣做該裝置才會知道以後再回到VM1時怎樣繼續提供尚未完成的服務。因為每一個IO裝置都完全受控於一個叫做裝置驅動器的軟體,所以對一個裝置和一個VM之間進行狀態跟蹤管理也就是針對相應驅動軟體的服務狀態進行跟蹤管理。
“在旁邊的虛擬化”(Para-Virtualization, Citrix Xen與MS Hyper-V都是)採用了非常簡單實用的“在旁邊有驅動器”之方法:讓所有的客戶(guest)VM 都去使用安裝在那個“管理OS”(Xen的Dom0,Hyper-V的Parent Partition)裡面現成的裝置驅動器。這樣一來整個平臺上的IO裝置就可以步調一致井井有條地為每一個客戶VM服務了。當一個客戶VM中的OS(中自有的裝置驅動器)向硬體發出IO裝置使用指令時,這些指令會被trap到hypervisor裡,再被轉到管理OS去使用它裡面相應的裝置驅動器。
與這個方法不同,VMware ESX選擇在hypervisor裡面置入並管理平臺上所有的IO裝置驅動器。ESX上的管理OS(又叫做Host OS或Service Console)只負責讓系統管理員來管理客戶VMs,比如創立、啟動客戶VM,啟動VMotion操作等等,而不負責虛擬任何IO驅動器。另外我們知道ESXi壓根就不帶有管理OS,系統管理員是通過網路進入hypervisor來管理客戶VM的。
上回我還講道:Intel和AMD在給X86架構打硬體補丁的工作還實現了統一控制平臺上IO裝置對記憶體的直接訪問(Direct Memory Access, DMA)。這改變了以前機器上IO裝置可以隨意對主機記憶體進行直接訪問的無政府主義危險狀況。諸位不要以為只有中央處理器(CPU)才是平臺上唯一的腦子可以對記憶體進行訪問操作。CPU的確可以被看作是平臺上的“大腦”,然而平臺上還有諸多“小腦”們:幾乎每一個現代IO裝置都自身帶有韌體,裡面裝有可執行指令可對主機記憶體進行讀寫訪問。在以前的X86硬體上這些小腦們對主機記憶體進行DMA讀寫操作根本不必聽從大腦的指揮。幸虧在非虛擬情況下平臺上只跑一個作業系統,如果某個小腦對主機記憶體做了錯誤操作,造成的破壞也許還可以容忍,因為大不了平臺崩潰只不過毀掉了跑在一臺機器上的應用(一定遇到過Windows的藍屏吧!)。如今在一個虛擬化的伺服器平臺上跑著許多不同虛擬機器和不同作業系統,無政府主義的危害就不再那麼單純無邪了。小腦的一個誤操作有可能打破不同虛擬機器之間的隔離,輕者造成所模擬的作業系統出錯,重者導致平臺上所有的虛擬機器全部崩潰。最近在X86硬體上的補丁工作(Intel的 VT-d, AMD的 IOMMU)對主機板進行了重新佈線,將所有小腦們的IO連線都統一聯到北橋上的一個硬體部件IOMMU,於是大腦就可以使用該部件,採用MMU同樣的方法統一協調管理小腦們對記憶體的IO訪問了。有了大腦統一協調管理IOMMU,小腦即使誤操作也應該無法穿越不同VM之間的隔離。但是這個說法只適用於通常的非惡意系統軟硬體錯誤情形,不適用於在電腦保安上出錯的情形。在考慮安全問題時所謂錯誤都是惡意攻擊的結果,是攻擊者有意引入的。在考慮安全問題時小腦們的驅動器軟體(請回憶,IO裝置都是受驅動器控制的)身處於系統軟體棧的哪個許可權層次就是一個非常重要的問題。這些軟體所處的許可權層次越接近硬體層,攻擊者對它們進行攻擊的手段就越有限也越困難。
對於“在旁邊的虛擬化”方法( Citrix Xen與MS Hyper-V),前面我們說過所有裝置驅動器軟體都安裝在管理OS裡面。這個管理OS雖然跑在一個低特權態(hypervisor之上的非核心態),卻由於需要向平臺上所有客戶VMs提供裝置驅動器服務因而必須可以操控所有這些客戶VMs。於是這個處於低特權態的管理OS就自然形成了一個可以被利用來對任一客戶VM進行DMA攻擊的最薄弱環節。所有對一般OS有效的攻擊方法(我們知道有大量這樣的方法)都可以被利用來攻擊這個OS中的驅動器軟體,對客戶VM實施DMA攻擊。
而VMware ESX的情況不同:平臺上所有裝置驅動器都是在hypervisor中模擬得到的。我們知道hypervisor是直接跑在硬體上的,即處於最高特權態。一般攻擊OS的使用者態手段都不能對hypervisor產生有效攻擊。另外Intel VT-d和AMD IOMMU都格外注重對hypervisor程式碼與資料施加保護。如果想要通過攻擊hypervisor中裝置驅動器的方法來對客戶VM實施DMA攻擊,那要遠比這些裝置驅動器處身於使用者態OS中的情況困難得多。
業界諸多專家已經認可如下為不爭事實:用可信計算技術來保護hypervisor是一個可行方法,Intel的Trusted eXecution Technology(TXT)就是一個典型案例。而用可信計算技術來保護使用者態OS是一個不可行方法,MS的Vista OS中的BitLocker技術就是嘗試這一方法的一個典型失敗案例。
下一講將介紹可信計算技術並討論為什麼使用可信計算技術來保護hypervisor,尤其是保護象VMware ESX那種自身含有IO裝置驅動器的hypervisor,這種技術方法可以在雲端計算或基於服務架構的安全保護上找到重要有效的應用。
本文轉自 wenbomao 51CTO部落格,原文連結:http://blog.51cto.com/wenbomao/169028,如需轉載請自行聯絡原作者


相關文章