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