容器是IT行業最熱門的軟件話題。共享虛擬機通用部分——操作系統、管理工具乃至應用,大大減少了鏡像消耗的內存資源,同時減少了加載相同代碼的眾多副本所需占用的網絡帶寬。
容器的實現方式能夠節省大量的資源。早期評估容器支持的實例數是傳統基于hypervisor方式的3到5倍,結果證明是合理的。在某些情況下,比如虛擬桌面基礎設施市場,容器支持的能力甚至更好。創建、部署容器所需要的時間只占創建、部署虛擬機的很小一部分。
容器價格要比hypervisor虛擬化低很多,但容器是一門新技術,技術不成熟一定會涉及到一些令人痛苦的教訓,之前我們采用hypervisor虛擬化時已經有所體會。盡管很多組織在某種程度上使用了容器,但在談到確保容器安全性時,大多數組織承認存在嚴重的恐懼。
數據安全隱憂
最核心的問題是多租戶保護。Hypervisor已經推出十多年,更重要的是已經經歷了幾個CPU周期。Intel以及AMD已經增加了對應的功能避免hypervisor出現跨內存攻擊。
這些特性保護沒有本地存儲的系統,但用于加速應用的本地實例存儲的出現意味著面臨著數據被刪除的風險,尤其是固態硬盤數據可能會暴露在租戶之間。Hypervisor廠商靈活應對,將數據塊標記為未寫入。如果實例嘗試讀取沒有別寫入的數據塊時,hypervisor會發送全零并保護該數據塊中的所有數據。
沒有上述保護措施,hypervisor就不全,任何租戶都能夠訪問其他實例中的數據。在一臺服務器的所有容器之間共享單個操作系統鏡像使硬件內存保護屏障變得無效。
這兩個問題可以通過在虛擬機內運行容器緩解。這避免了一臺虛擬機內的容器暴露給其他虛擬機,而hypervisor提供了所需要的存儲保護。所有主流云以及hypervisor,包括Azure現在都支持容器。
但這一保護措施存在代價。在規模擴張期間,必須在構建容器之前創建虛擬機。容器部署時間是以毫秒衡量的,而虛擬機構建時間是以秒衡量的。即使存在上述限制,但基于虛擬機的容器是一種可行的方式,也是到目前為止最常見的部署方式。部署輕量級hypervisor有大量的工作要做。例如,Intel Clear Containers是一個專為容器構建的hypervisor。此外,它使用內核相同頁合并安全地在虛擬機之間共享內存頁以減少內存占用。VMware還支持容器—考慮到其在虛擬化的主導地位—這對提升很多用戶的使用信心至關重要。
用戶訪問控制
除跨租戶信息泄露外,容器還面臨權限升級風險,應用獲取root權限就能夠控制主機。另一個問題是拒絕服務攻擊—或者是bug驅動的問題—所有資源都被單個容器占用了。這些問題在容器環境中更容易出現。例如Docker與主機系統共享命名空間,但在基于hypervisor的系統中不存在這種情況。
為保護容器并減少權限升級攻擊,要以普通用戶而非root用戶運行容器。在Docker中,需要在啟動命令中增加-u選項。移除SUID標簽能夠修復該問題。在容器之間隔離命名空間限制了野蠻應用接管服務器存儲空間。控制組可以被用于設置資源限制并阻止吃掉服務器資源的DDos攻擊。
鏡像中毒
另一個主要的避免攻擊的保護措施,尤其是在私有云中,是使用可信任的公共鏡像資源庫。目前幾乎所有的插件都使用眾多公共資源庫資源構建應用程序。這節省了大量的開發時間及成本,IT預算緊張時這是一項重要的實踐。然而大量的恐怖事件比比皆是。即使是高級資源庫也有可能傳播惡意軟件,分析最近發生的一些事件,發現部分代碼多年以來一直仍舊隱藏在流行的類庫中。
來自受信資源庫的代碼容易受到病毒入侵的攻擊。鏡像控制是當前所有環境而不僅僅是容器所面臨的一個核心問題。使用支持鏡像簽名的受信資源庫,并在加載鏡像時使用這些簽名進行驗證。有一些服務能夠用于簽名驗證,合理使用這些服務有助于緩解惡意軟件滲透。Docker Hub、Quay是兩個受信的公共容器注冊平臺。
另一個問題不是容器特有的,但由于容器所使用的典型的微服務環境使問題變得更加嚴重,由于用戶希望對他們運行的應用插件進行控制,這使得資源庫控制有點像把貓趕到一起一樣糟糕。對源識別及簽名校驗進行強制的用戶級驗證對確保環境安全穩定至關重要。GitHub站點上的Docker安全性測試是一個對眾多已知的安全問題進行檢查的工具。
自己構建一個合法的鏡像庫供用戶訪問可能是最終的實施方式,但缺點在于程序員很難管理而且類庫管理員缺乏敏捷性幾乎注定類庫會被忽略掉。任何資源庫必須有非常嚴密的安全措施限制訪問第三方資源庫的鏡像而且沒有寫權限。為便利鏡像庫管理,你可以使用Docker的注冊服務器或者CoreOS企業注冊庫。
校驗與加密
對鏡像內的應用及操作系統進行版本控制的措施相當脆弱。這同樣不僅僅是容器問題,而是容器在快速演變而且當新版本需要強化安全性時Docker傾向于拆除操作代碼架構并予以替換。版本控制不合規往往會提供攻擊面。
鏡像掃描工具可以用于自動校驗鏡像、文件。Docker提供的鏡像掃描工具是Nautilus,CoreOS提供的是Clair。鏡像加密問題仍舊沒有得到解決。
通常來講,對容易受到攻擊的文件進行更多的加密,受到惡意軟件攻擊的可能性就更低。對鏡像來說,加密應該在鏡像代碼中保護病毒或者木馬攻擊,結合簽名掃描以及播放列表驗證,應該可以阻止惡意軟件的攻擊。和hypervisor相比,容器具有明顯的優勢。容器的鏡像文件更少,加密、解密時服務器的負載更低。
容器守護進程是另一個脆弱點。守護進程是管理容器的進程,如果遭到破壞,就能夠獲取系統內的所有信息。限制訪問是保護守護進程的第一步。如果守護進程暴露在網絡中,那么必須采用加密傳輸方式。同時使用限定的管理工具進行最基本的Linux配置能夠減少攻擊平面。
采取上述措施,我們就具備了創建安全容器并構建鏡像的基礎。在容器運行時提供保護仍舊是一項正在進行中的工作。在監控領域有很多開創性的產品,提供了控制不穩定混合實例的第一步。CAdvisor是一款很不錯的用于監控容器的開源工具,而Docker提供了stats命令。這些工具的輸出結果需要插入到合適的分析包中比如Splunk或者Sumo Logic的Docker日志分析應用中。通過建立正常運營的基線,由惡意軟件而引發的非正常訪問都可以被發現并進行補救。
在過去的幾年當中容器已經得到了很大的發展。安全環境一定需要建立嚴格的制度,但很顯然容器社區正在引領鏡像管理領域。
我們可以預計下一代或之后的CPU會針對容器提供硬件支持,匹配目前針對hypervisor提供的功能。那時,我們可以預計組織會遷移到更簡化的裸金屬容器部署中。還存在更進一步的挑戰,比如將軟件定義的基礎設施納入容器生態系統中。從安全角度看容器和虛擬機是平等的,但在部署效率上容器要遠遠超過虛擬機。