操作系統/虛擬化安全知識域:操作系統及其設計在安全中的作用
在高層次上,操作系統和虛擬機管理程序的任務是管理計算機系統的資源,以保證可以構建安全的基礎。有關機密性、完整性和可用性的應用程序。
軟件堆棧的這些最低層在安全性方面的主要作用是提供安全域的隔離和可能違反隔離的所有操作的中介。在理想情況下,操作系統將任何單個進程與所有其他進程隔離開來。例如,外圍進程應該無法訪問分配給主進程的內存,了解與該主進程相關的活動的任何信息,除了進程選擇顯示或阻止進程無限期使用其分配的資源(如CPU時間)的那些。某些操作系統甚至可能調節信息流,以便在沒有適當許可的情況下永遠不會將絕密數據泄漏到進程,或者分類數據不能由沒有適當權限級別的進程修改。
深入挖掘,我們可以區分控制平面和數據平面操作,我們看到操作系統中的隔離涉及兩者。在內存隔離中,操作系統在配置MMU(內存管理單元)時在控制平面上運行,然后負責隔離,操作系統不會過多參與。在大多數其他交互中,例如,在對非特權安全域提供的系統調用參數進行操作時,操作系統在兩個平面上運行。平面之間缺乏分離很容易導致漏洞,例如,當操作系統決定在另一個域中重用以前屬于一個安全域(由MMU強制實施訪問隔離)的內存頁時,沒有正確覆蓋(可能敏感)數據。
設計操作系統的方法有很多種。無花果。1說明了四種極端設計選擇。在圖內。1(a),操作系統和應用程序在單個安全域中運行,并且沒有任何隔離。早期的操作系統是這樣工作的,但今天的許多嵌入式系統也是如此。在這種情況下,系統中的不同組件之間幾乎沒有隔離,應用程序可能會損壞文件系統(FS)的活動,網絡堆棧、驅動程序或系統的任何其他組件。
圖1(b)顯示了大多數現代通用操作系統的配置,其中大多數操作系統駐留在單個安全域中,與應用程序嚴格隔離,而每個應用程序也與所有其他應用程序隔離。例如,這是Windows,Linux,OSX和原始UNIX的許多后代的結構。由于操作系統的幾乎每個組件都在單個安全域中運行,因此該模型非常有效,因為這些組件僅通過函數調用和共享進行交互記憶。只要每個組件都是良性的,該模型也是安全的。但是,如果攻擊者設法破壞單個組件(例如驅動程序),則所有安全性都將無效。通常,設備驅動程序和其他操作系統擴展(例如,Linux內核模塊)是系統安全性的重要考慮因素。通常由第三方編寫,并且比核心操作系統代碼更有缺陷,在操作系統的單個安全域中運行的擴展可能會完全損害系統的安全性。
有趣的是,內核和此類系統中其他安全域之間的邊界通常有點模糊,因為操作系統可以繞過內核進行高速網絡,或者將非性能關鍵型操作系統組件實現為用戶進程。示例包括UNIX操作系統中的用戶空間文件系統(FUSE)和Windows中的用戶模式驅動程序框架(UMDF)。即便如此,大多數操作系統功能仍然形成單個整體式安全域。
圖1(c)顯示了多服務器操作系統中構成操作系統的所有組件在單獨進程中的極端分解。該配置的效率可能低于以前的模型,因為操作系統不同組件之間的所有交互都涉及進程間通信(工控機)。此外,操作系統作為分布式系統運行,任何曾經構建過分布式系統的人都知道問題可能會變得多么復雜。但是,多服務器系統的優點是,例如,受感染的驅動程序不能輕易危害系統的其余部分。此外,雖然從概念的角度來看,多服務器看起來像一個分布式系統,但真正的分布式系統的很多復雜性是由于不負責任的通信,這在多服務器系統中是不存在的。普遍的觀點是,基于微內核的多服務器設計比單片和單域設計具有安全性和可靠性優勢,但會產生更高的開銷-安全價格。
最后,圖1(d)顯示的情況乍一看與圖相似。1(a):在多路復用底層資源的最小內核之上,應用程序與最小的“庫操作系統”(libOS)一起運行。libOS包含的代碼通常是操作系統的一部分,但直接包含在應用程序中。此配置允許應用程序完全根據其需求定制操作系統,并省略它們無論如何都不打算使用的所有功能。庫操作系統最早是在1990年代提出的(例如,在麻省理工學院的Exokernel和劍橋的Nemesis項目中)。在相對默默無聞的幾年之后,它們再次變得流行起來——尤其是在虛擬化環境中,它們通常被稱為Unikernels。在安全性方面,Unikernels很難與基于微內核的多服務器系統相提并論。一方面,它們沒有操作系統組件的極端分離。另一方面,它們允許(庫)操作系統代碼更小、更簡單——它只需要滿足這一個應用程序的需求。此外,該庫不能妥協隔離:它是此應用程序可信計算基礎的一部分,而不是其他庫。
關于哪種設計更好的爭論可以追溯到安德魯·1992年,Tanenbaum和LinusTorvalds。到那時,MINIX,一個由Tanenbaum開發的小型類UNIX操作系統,已經存在了五年左右,并且作為教育操作系統在世界范圍內獲得了牽引力-特別是因為貝爾實驗室的原始UNIX作為商業產品出售,并帶有限制性許可證,禁止用戶修改它。MINIX的用戶之一是Torvalds,當時是一名芬蘭學生,他在Usenet的comp.os.minix新聞組中宣布了新的操作系統內核。1992年1月,Tanenbaum批評該設計缺乏可移植性,并瞄準了Linux的整體設計,聲稱Linux從一開始就已經過時了。Torvalds回應了他自己對MINIX的批評。這場激烈的交流包含了越來越復雜的論點,其中許多論點今天仍然存在,以至于誰贏得了辯論的問題仍然沒有答案。
圖1:操作系統的極端設計選擇:(a)單域(有時用于嵌入式系統),(b)單片操作系統(Linux、Windows和許多其他操作系統),(c)基于微內核的多服務器操作系統(例如,Minix-3)和(d)單內核/庫操作系統
也就是說,Linux已經變得非常流行,很少有人會認為它已經過時了。同樣明顯的是,來自多服務器系統(如MINIX)的想法已被納入現有的操作系統和基于虛擬機管理程序的系統中。有趣的是,在撰寫本文時,甚至MINIX本身也在數億個英特爾處理器中作為微型操作系統運行在稱為管理引擎的獨立微處理器上。此外,現在現代系統中的CPU越來越復雜。片上系統(SoC),硬件本身開始看起來像一個分布式系統,一些研究人員明確主張設計操作系統。因此,重點是消息傳遞,而不是用于通信的內存共享。
一般來說,虛擬化環境的情況與操作系統的情況相當。我們已經看到,在一種極端情況下,帶有應用程序和精簡操作系統的整個虛擬機可以形成一個域。更常見的情況是,在虛擬機中有一個最低級別的虛擬機管理程序,支持一個或多個操作系統,如Linux或Windows。換句話說,這些虛擬機管理程序為每個操作系統提供了一種在專用硬件上運行的錯覺。在光譜的另一端,我們發現整個系統分解為單獨的、相對較小的虛擬機。事實上,一些操作系統,如QubesOS,通過允許單個用戶進程在自己的虛擬機中隔離,完全集成了虛擬化和操作系統的概念。最后,正如我們已經看到的,Unikernels在虛擬機管理程序之上的虛擬化環境中很受歡迎。
順便說一句,虛擬機的缺點之一是每個操作系統映像都使用存儲并添加冗余,因為每個系統都會認為自己是硬件山中的王者,而實際上它是共享的資源。此外,虛擬機中的每個操作系統都需要單獨的維護:更新、配置、測試等。因此,一種流行的替代方案是在操作系統級別進行虛擬化。在這種方法中,多個環境(稱為容器)在單個共享操作系統上運行。容器盡可能彼此隔離,并具有自己的內核命名空間、資源限制等,但最終共享底層操作系統內核,通常是二進制文件和庫。與虛擬機相比,容器更輕量級。但是,如果我們暫時忽略管理方面,虛擬機通常被認為比容器更安全,因為它們非常嚴格地劃分資源,并且僅將虛擬機管理程序共享為之間的薄層。硬件和軟件。另一方面,有些人認為容器比虛擬機更安全,因為它們非常輕量級,我們可以將應用程序分解為“微服務”,在容器中具有明確定義的接口。此外,需要保護安全的東西更少,總體上減少了攻擊面。容器(或“操作系統級虛擬化”)的早期工作可以在chroot調用中找到,該調用于1979年首次添加到版本7Unix。2000年,FreeBSD發布了Jails,它在操作系統虛擬化方面走得更遠。今天,我們有許多容器實現。一個流行的是Docker。
最后一類操作系統明確針對小型和資源受限的設備,例如物聯網(IoT)中的設備。雖然每個人對物聯網的含義以及要考慮的設備范圍從智能手機到智能灰塵都有不同的看法,但有一個共識,即大多數資源受限的設備應該是其中的一部分。對于此類設備,即使精簡的通用操作系統也可能過于龐大,并且操作系統預計只能運行幾千字節。舉一個極端的例子,流行的物聯網操作系統(如RIOT)的大小可能小于10KB,并且可以在從8位微控制器到通用32位CPU的系統上運行,帶或不帶內存管理單元(MMU)等高級功能。我們要求Windows和Linux等操作系統提供的豐富功能和應用程序隔離在這些操作系統中可能不存在,但可能支持實時計劃或低功耗等功能網絡在許多嵌入式系統中都很重要。
由于我們對操作系統提供的安全保證感興趣,因此我們將假設存在多個安全域。在下一節中,我們將從既定的安全原則的角度闡述不同設計的優缺點。我們的重點將放在設計的安全性以及我們可以阻止攻擊的方式上,但在觀察到在這個級別上還有更多安全之前。特別是,系統的管理和維護性(在更新、擴展、配置等方面)起著重要作用。