威脅隔離!用SELinux保護(hù)虛擬化
譯文【51CTO.com獨(dú)家翻譯】虛擬化被認(rèn)為是計(jì)算機(jī)技術(shù)發(fā)展史中的一次技術(shù)革命,它在資源分配,系統(tǒng)管理,電力和制冷成本節(jié)省,按需擴(kuò)大或收縮資源等方面表現(xiàn)出極大的優(yōu)勢,雖然人人都在談虛擬化,人人都準(zhǔn)備用上虛擬化,但一直伴隨虛擬化揮之不去的陰影 - 安全問題 - 又讓無數(shù)人望而卻步。
虛擬化安全性如何?
當(dāng)攻擊者攻破虛擬機(jī),接管了虛擬機(jī)的所有控制權(quán)后會發(fā)生什么?如果系統(tǒng)管理程序(Hypervisor)存在bug又會發(fā)生什么?
在未虛擬化之前,我們隔離了服務(wù)器,攻擊者攻破一臺服務(wù)器后,他只能控制那一臺服務(wù)器,這時(shí)攻擊者必須采取網(wǎng)絡(luò)攻擊,攻擊網(wǎng)絡(luò)內(nèi)的其它服務(wù)器,才有可能拿到其它服務(wù)器的控制權(quán)。系統(tǒng)管理員有很多工具檢測和保護(hù)網(wǎng)絡(luò)攻擊,如防火墻,網(wǎng)絡(luò)流量分析工具,入侵檢測工具等。
虛擬化后,在同一臺物理主機(jī)上運(yùn)行了多個服務(wù)(應(yīng)用程序),如果虛擬機(jī)被攻破,攻擊者只需要破壞系統(tǒng)管理程序,就可以達(dá)到破壞所有服務(wù)的目的。如果系統(tǒng)管理程序存在漏洞,攻擊者可以接管主機(jī)上托管的所有虛擬機(jī),甚至可以向主機(jī)能直接訪問的虛擬機(jī)鏡像寫入惡意代碼。
聽起來非??植腊桑F(xiàn)在的問題是如果真發(fā)生這種情況時(shí)該如何處置,攻擊者對系統(tǒng)管理程序的漏洞興趣越來越濃,前不久Xen系統(tǒng)管理程序就已經(jīng)被攻破了?!?1CTO王文文:VMware的產(chǎn)品中同樣出現(xiàn)過類似問題,而現(xiàn)在他們已經(jīng)在采用RSA的身份認(rèn)證技術(shù)來緩解虛擬數(shù)據(jù)中心威脅了。那如果不使用身份認(rèn)證技術(shù)的話,我們看看本文中SELinux的保護(hù)方式。
現(xiàn)在我們來看看Fedora 11中的libvirtd/qemu/kvm,libvirtd啟動所有虛擬機(jī),所有虛擬機(jī)都以獨(dú)立的進(jìn)程運(yùn)行,虛擬鏡像被保存為一個文件或類似邏輯卷和iSCSI目標(biāo)的設(shè)備。
SELinux真的有用么?
SELinux標(biāo)記進(jìn)程,文件和設(shè)備,同時(shí)負(fù)責(zé)定義被標(biāo)記進(jìn)程,文件和設(shè)備之間互操作的規(guī)則,通過SELinux可以減小系統(tǒng)管理程序漏洞引起的影響范圍。
如果你閱讀過Xen漏洞文檔,你一定知道如何繞過RHEL 5中SELinux保護(hù)機(jī)制,攻擊者知道標(biāo)記為xend_t的xen進(jìn)程可以讀/寫所有用fixed_disk_device_t標(biāo)記的固定磁盤,通過寫物理磁盤,攻擊者可以繞過SELinux的限制。我給RHEL 5上的Xen編寫策略時(shí),最初要求管理員將Xen鏡像設(shè)備卷標(biāo)記為xen_image_t,Xen開發(fā)人員認(rèn)為這對管理員的管理來說太困難了,可能會導(dǎo)致許多故障,我們沒有時(shí)間制作管理工具使其自動化,大家都認(rèn)為在這個例子中可用性比安全更重要,我不得不同意他們的意見。
在Fedora 11中,James Morris,Daniel Berrange和我以及其它共事者給libvirt增加了SELinux支持,形成了sVirt,我們給libvirt增加了一個插件架構(gòu),默認(rèn)啟用了SELinux保護(hù),理論上你可以使用其它安全架構(gòu)。libvirt動態(tài)地標(biāo)記鏡像文件,并用正確的標(biāo)記啟動虛擬機(jī),管理員不必記住給鏡像文件和設(shè)備設(shè)置的標(biāo)記,在F11中,默認(rèn)所有虛擬機(jī)都使用svirt_t type類型標(biāo)記,所有鏡像文件都使用svirt_image_t類型標(biāo)記。
SELinux策略規(guī)定svirt_t進(jìn)程可以讀/寫svirt_image_t文件和設(shè)備。
這種保護(hù)允許我們保護(hù)主機(jī)不受任何虛擬機(jī)的侵害,虛擬機(jī)只能與正確標(biāo)記的文件和設(shè)備交互,被攻破的虛擬機(jī)不能訪問我的home目錄,即使虛擬機(jī)以root權(quán)限運(yùn)行。
但這種類型的保護(hù)不能阻止一個虛擬機(jī)攻擊另一個虛擬機(jī),我們需要一種方法使用相同的類型標(biāo)記域和鏡像文件,與此同時(shí),停掉虛擬機(jī)1,以svirt_t類型運(yùn)行,攻擊虛擬機(jī)2,虛擬機(jī)2也將以svirt_t類型運(yùn)行。
多類別安全(Multi Category Security,MCS)保護(hù)
我們在開發(fā)RHEL 5時(shí),我們增加了MCS支持,包括給SELinux上下文增加第四個字段。
最開始在RHEL 4中,SELinux上下文只有三個字段:“用戶:角色:類型”,在RHEL 5中,SELinux上下文字段增加到四個:“用戶:角色:類型:MLS”,例如,home目錄中的文件可能被標(biāo)記為system_u:system_r:user_home_t:TopSecretRecipe,MLS標(biāo)記定義了一個敏感級別(s0-s15)和數(shù)據(jù)分類(c0.c1023),這個例子中的TopSecretRecipe是類似s15:c0.c36這樣的字段的人文翻譯,MLS標(biāo)記允許MLS機(jī)器不僅可以基于它的使用者標(biāo)記文件,在這個例子中是user_home_t,也可以根據(jù)敏感性和內(nèi)容的本身屬性進(jìn)行標(biāo)記,如TopSecretRecipe。
這個字段僅在MLS策略中使用,我們嘗試在默認(rèn)策略(targeted)中使用它,只定義一個敏感級別(s0),允許管理員定義分類,我們把它叫做多分類安全(MCS),旨在讓管理員和用戶可以基于文件內(nèi)容的自身屬性進(jìn)行標(biāo)記,如system_u:object_r:database_t:PatientRecord可能是一個包含病人記錄的數(shù)據(jù)庫,遺憾的是,由于種種原因,MCS未被廣泛使用。
但我們在開發(fā)sVirt時(shí),我們認(rèn)識到可以使用MCS隔離兩個相同SELinux類型(svirt_t)的虛擬機(jī),我們設(shè)計(jì)libvirt分配一個不同的隨機(jī)選擇的MCS標(biāo)記給每個虛擬機(jī)及其關(guān)聯(lián)的虛擬鏡像,libvirt保證它選擇的MCS字段的唯一性,SELinux阻止以不同MCS字段運(yùn)行的虛擬機(jī)互操作,這樣就保證了虛擬機(jī)不會相互攻擊。
例如,libvirt用下面這些標(biāo)記創(chuàng)建兩個虛擬鏡像:
SELinux阻止虛擬機(jī)1(system_u:system_r:svirt_t:s0:c0,c10)訪問虛擬機(jī)2的鏡像文件(system_u:object_r:svirt_image_t:s0:c101,c230),因此這兩個虛擬機(jī)不能互相攻擊。
下面是libvirt指定的標(biāo)記:
我們也給sVirt增加了靜態(tài)標(biāo)記的功能,靜態(tài)標(biāo)記允許管理員為虛擬機(jī)選擇一個特殊的標(biāo)記,包括MCS/MLS字段,虛擬機(jī)將總是以這個標(biāo)記啟動,運(yùn)行靜態(tài)虛擬機(jī)的管理員負(fù)責(zé)給鏡像文件設(shè)置正確的標(biāo)記,libvirt永遠(yuǎn)不會修改靜態(tài)虛擬機(jī)上下文的標(biāo)記,它允許sVirt組件在MLS環(huán)境下運(yùn)行,你可以在一個libvirt系統(tǒng)上以不同敏感級運(yùn)行多個虛擬機(jī)。
【51CTO.COM 獨(dú)家翻譯,轉(zhuǎn)載請注明出處及作者!】
【編輯推薦】