容器是IT領(lǐng)域最熱門的軟件理念。共享虛擬機通用部分這一概念——包括共享操作系統(tǒng),管理工具,甚至應(yīng)用程序,減少了任意鏡像占用內(nèi)存的這一主要因素,同時節(jié)省了網(wǎng)絡(luò)帶寬與許多副本上加載的基本相同的代碼。
這些節(jié)省意義很大,初步估計容器支持降低三到五倍的實例數(shù)量,相比于某些情況下的傳統(tǒng)的基于虛擬機管理程序的方法顯得更加有效,例如在VDI市場的應(yīng)用。值得注意的是,容器的創(chuàng)建和部署僅需要虛擬機的小部分時間和空間。
容器在經(jīng)濟性方面要比基于虛擬機管理程序的虛擬化好很多,然而容器是一項新技術(shù),不成熟且還需要經(jīng)過很多我們了解的虛擬化方式普及中曾經(jīng)遇到過的問題。雖然許多公司都在不同層面利用容器進行工作,大多數(shù)人還是會承認有一些擔心。
爆發(fā)的擔憂
最關(guān)鍵的問題是多租戶保護。虛擬機管理程序已經(jīng)遠遠超過了十年,而且更重要的是,經(jīng)歷了許多CPU的產(chǎn)品周期。英特爾和AMD已經(jīng)在虛擬機管理程序中添加相應(yīng)功能,防止有關(guān)的內(nèi)存交叉使用的行為。
這些功能的保護系統(tǒng)在本地沒有存儲驅(qū)動器,但本地用于加速應(yīng)用程序?qū)嵗某霈F(xiàn),意味著數(shù)據(jù)會被擦除,特別是SSD的數(shù)據(jù),可能會在不同租戶間被暴露。虛擬機管理程序供應(yīng)商隨機應(yīng)變,現(xiàn)在將區(qū)塊標記成未寫入的狀態(tài)。如果一個實例試圖讀取某一尚未寫入的區(qū)塊,虛擬機管理程序會發(fā)送全零指令并隱藏相關(guān)區(qū)塊的所有數(shù)據(jù)。
沒有這些保護功能,虛擬機管理程序?qū)⒑懿话踩魏稳丝梢酝ㄟ^其他實例來獲取數(shù)據(jù)的訪問權(quán)。在某一服務(wù)器中的所有容器間,共享某一單獨的操作系統(tǒng)鏡像,能將硬件內(nèi)存保護措施無效化,這就是并不成熟的容器技術(shù)在發(fā)展中所遇到的存儲問題。
這兩個問題可以通過在虛擬機中運行容器來緩解。這將保護在某一虛擬機中的容器無法被其他虛擬機通過交叉內(nèi)存漏洞訪問,同時虛擬機管理程序提供了所需的存儲保護。包括Azure在內(nèi)的所有主流云與虛擬機管理程序,現(xiàn)在都支持容器技術(shù)。
保護機制可能需要一定成本,盡管如此,因為在大量構(gòu)建虛擬機規(guī)模之時需要優(yōu)先創(chuàng)建容器。這兩項技術(shù)運行在不同的時間尺度上,容器部署時間以毫秒計算,虛擬機部署則以秒計算。即使存在這些限制,基于虛擬機的容器是一種可行的方法,也是截至目前最常見的部署方法。業(yè)內(nèi)已經(jīng)在努力發(fā)展輕量級的虛擬機管理程序。例如,英特爾純凈容器技術(shù)(Intel Clear Containers)是一個以創(chuàng)建容器為目的的虛擬機管理程序。在其他方面,它使用核心的同頁合并來安全地共享內(nèi)存頁之間的虛擬機,從而減少內(nèi)存占用。VMware還支持容器,鑒于該公司在虛擬化方面的優(yōu)勢,對許多部門的運營方面的信心有重要作用。
用戶訪問控制
除了多租戶問題,容器還存在特權(quán)升級的風(fēng)險,某一應(yīng)用程序獲得根訪問權(quán)限后,便可以獲得主機的控制權(quán)。另一個問題是一個拒絕服務(wù)(Denial-Of-Service)攻擊,或者即使是某個由bug造成的問題,所有的資源都能被某一單一容器控制。這些問題在容器環(huán)境中更容易出現(xiàn)。舉例來說,Docker與主機系統(tǒng)的共享其命名空間,這種情況在基于虛擬化管理程序的環(huán)境中是永遠不會出現(xiàn)的。
越權(quán)攻擊可以通過啟動時選擇普通用戶而非根用戶的方式來緩解。在Docker中,這表示要在啟動命令中加入代碼-u。通過去掉SUID來啟動這一修正。容器間獨立的命名空間可以有效限制惡意軟件控制服務(wù)器的存儲空間??丶M可用于設(shè)置資源限制,并阻止拒絕服務(wù)攻擊吸收服務(wù)器的資源。
中毒的鏡像
是容器免受攻擊的另一重保護,特別是在私有云,是使用受信任的公共庫的鏡像。今天,幾乎所有的混搭使用代碼都是用公共庫的源代碼來構(gòu)建應(yīng)用程序。這節(jié)省了巨大的開發(fā)時間和成本,因此對于IT預(yù)算緊張的應(yīng)用場景,此種方式就顯得很有實踐意義。然而,大量的安全隱患也同時存在。即使是“高級”的庫也可能會傳播惡意軟件,并且在最近的案例中發(fā)現(xiàn),這樣的代碼已隱藏在流行的代碼庫有很多年。
來自受信任庫的代碼仍然容易受到病毒的侵入。對當今所使用的任何環(huán)境,鏡像的控制都是關(guān)鍵問題,而不僅僅針對容器。使用支持鏡像簽名的可信任庫,并當鏡像加載到庫中時,使用這些簽名來驗證,通過驗證后再放行進入容器。這些服務(wù)是用來進行簽名驗證的,同時正確使用這些服務(wù)將保護你免受惡意軟件的滲透。Docker Hub和Quay是兩款可以信任的公共容器注冊室。
另一個問題在容器上不是很明顯,但在使用容器的傳統(tǒng)微服務(wù)環(huán)境下比較嚴重,即用戶所期望控制它們所運行的程序混搭。這使得存儲庫控制有點像溜貓。兼具源標識和簽名檢查的強制用戶級驗證對于穩(wěn)定和安全的環(huán)境至關(guān)重要。在GitHub的Docker安全測試是一種能夠檢查許多已知安全問題的功能。為用戶訪問而建設(shè)自己的驗證鏡像庫可能是這種方法的最終體現(xiàn),但缺點在于,程序員很難保持一致并且缺乏靈活性,而庫管理員能夠幾乎可以確定繞過這一驗證機制。任何存儲庫都必須具有非常嚴格的安全機制,當從第三方存儲庫獲取鏡像時,確保其對用戶端沒有寫入權(quán)限。要提高鏡像庫的管理水平,可考慮使用泊Docker的注冊服務(wù)器或CoreOS Enterprise Registry。
驗證和加密
對鏡像中的應(yīng)用程序和操作系統(tǒng)的版本控制是與漏洞有關(guān)的區(qū)域。同樣,這不僅是容器特有的問題,但容器極其快速的變革和Docker對操作代碼結(jié)構(gòu)的取代趨勢,并將他們替換成新版本是需要很強的制度約束。錯位的版本通常提供會提供攻擊的可能。
鏡像掃描工具可用來自動化鏡像并完成文件驗證。Docker上有Nautilus工具,而CoreOS上則有Clair工具。如何進行靜態(tài)或動態(tài)下的鏡像加密問題仍然懸而未決。一般來說,漏洞文件的加密保護越多,我們要對抗勒索軟件就越困難。對于鏡像,加密應(yīng)該起到阻止病毒或木馬攻擊鏡像代碼,并且再加上簽名掃描和驗證列表,便可遠離勒索軟件。在這方面,鏡像相對于虛擬機管理程序有著明顯的優(yōu)勢。與周圍許多的鏡像文件相比,服務(wù)器上的加密和解密負載要少得多。
容器守護進行時另一個漏洞點。它是管理容器的進程,并且如果被攻陷,便可以訪問系統(tǒng)中的任何內(nèi)容。限制訪問是在保證守護進程安全的第一步。如果守護進程在網(wǎng)絡(luò)上運行,那么加密傳輸是必要的,而使用小型化的Linux配置能夠有效減少被攻擊的可能。
有了上述的這些,我們便有了創(chuàng)建容器和建立其鏡像的安全環(huán)境的基礎(chǔ)。保護運行中的容器棧仍需繼續(xù)努力。在監(jiān)控區(qū)有個很不錯的初期活動處理方法,它為控制動蕩的實例混合提供了第一步的可能。CAdvisor是一款很好的容器監(jiān)控開源工具,同時Docker提供數(shù)據(jù)命令。這些工具能夠獨立保證數(shù)據(jù)過載,因此它們的輸出需要輸入合適的分析軟件包,像Splunk或Sumo Logic’s Docker 日志分析應(yīng)用程序那樣。通過建立正常操作的基線,任何由于惡意軟件造成的異常訪問的痕跡,都可以阻止并修復(fù)。
容器技術(shù)在短短幾年里已經(jīng)有了長足的發(fā)展。安全的環(huán)境確實需要很強的制度約束,但顯而易見的是容器社區(qū)在相關(guān)領(lǐng)域,如鏡像管理方面處于領(lǐng)先態(tài)勢。
我們可以期待在未來1-2代的CPU中將出現(xiàn)對容器的硬件原生支持,就像CPU和當今的虛擬機管理程序配合那樣。當其成為現(xiàn)實時,我們可以期待簡化的裸金屬容器部署的實現(xiàn)。未來還有許多挑戰(zhàn),如將軟件定義的基礎(chǔ)設(shè)施集成到容器的生態(tài)系統(tǒng)之中。容器在安全方面與虛擬機技術(shù)持平,同時在靈活性和部署速度方面更勝一籌。