1. 程式人生 > 其它 >沙盒化容器:是容器還是虛擬機器

沙盒化容器:是容器還是虛擬機器

  隨著 IT 技術的發展,AI、區塊鏈和大資料等技術提升了對應用毫秒級擴充套件的需求,開發人員也面臨著的功能快速推出的壓力。混合雲是新常態,數字化轉型是保持競爭力的必要條件,虛擬化成為這些挑戰的基本技術。

  在虛擬化的世界,有兩個詞耳熟能詳:虛擬機器和容器。前者是對硬體的虛擬化,後者則更像是作業系統的虛擬化。兩者都提供了沙箱的能力:虛擬機器通過硬體級抽象提供,而容器則使用公共核心提供程序級的隔離。有很多人將容器看成是“輕量化的虛擬機器”,通常情況下我們認為容器是安全的,那到底是不是跟我們想象的一樣?

  容器:輕量化的虛擬機器?

  容器是打包、共享和部署應用的現代化方式,幫助企業實現快速、標準、靈活地完成服務互動。容器化是建立在 Linux 的名稱空間(namespace)和控制組(cgroup) 的設計之上。

  

  名稱空間建立一個幾乎隔離的使用者空間,併為應用提供專用的系統資源,如檔案系統、網路堆疊、程序ID和使用者ID。隨著使用者名稱空間的引入,核心版本 3.8 提供了對容器功能的支援:Mount(mnt)、程序 ID(pid)、Network(net)、程序間通訊(ipc)、UTS、使用者 ID(user)6 個名稱空間(如今已達 8 個,後續加入了 cgroup 和 time 名稱空間)。

  cgroup 則實施對應用的資源限制、優先順序、記賬和控制。cgroup可以控制 CPU、記憶體、裝置和網路等資源。

  同時使用 namespace 和 cgroup 使得我們可以在一臺主機上安全地執行多個應用,並且每個應用都位於隔離的環境中。

  虛擬機器提供更強大的隔離

  

  雖然容器很棒,足夠輕量級。但通過上面的描述,同一個主機上的多個容器其實是共享同一個作業系統核心,只是做到了作業系統級的虛擬化。雖然名稱空間提供了高度的隔離,但仍然有容器可以訪問的資源,這些資源並沒有提供名稱空間。這些資源是主機上所有容器共有的,比如核心 Keyring、/proc、系統時間、核心模組、硬體。

  我們都知道沒有 100% 安全的軟體,容器化的應用也一樣,從應用原始碼到依賴庫到容器 base 映象,甚至容器引擎本身都可能存在安全漏洞。發生容器逃逸的風險遠高於虛擬機器,黑客可以利用這些逃逸漏洞,操作容器的外部資源也就是宿主機上的資源。除了漏洞,有時使用的不當也會帶來安全風險,比如為容器分配了過高的許可權(CAP_SYS_ADMIN 功能、特權許可權),都可能導致容器逃逸。

  而虛擬機器依靠硬體級的虛擬化,實現的硬體隔離比名稱空間隔離提供了更強大的安全邊界。與容器相比,虛擬機器提供了更高程度的隔離,只因其有自己的核心。

  由此可見,容器並不是真正的“沙盒”,也並不是輕量化的虛擬機器。有沒有可能為容器增加一個更安全的邊界,儘可能的與主機作業系統隔離,做到類似虛擬機器的強隔離,使其成為真正的“沙盒”?

  

  沙盒化容器

  答案是有,就是沙盒容器。這種容器就像虛擬機器一樣有自己的核心,這層核心成為使用者空間核心。這層核心要保持容器的輕量級,使用現代程式設計技術編寫,本身非常輕,僅用於作為容器和主機之間的強隔離層。

  並且還要支援 OCI 和 CRI 規範,可以與 Docker 和 Kubernetes 等容器工具很好的整合。

  

  這裡簡單介紹下 gVisor 和 Kata Containers。

  gVisor

  gVisor 是使用 Go 編寫的應用核心,實現了 Linux 作業系統的大部分介面。其包含了一個叫做 runsc 的 OCI 執行時,提供了應用和宿主機核心間的隔離層。runsc 也實現了與 Docker 和 Kubernetes 的整合,可以很容易的執行沙盒容器。鄭州治療精神分裂症哪裡好http://www.juenpt.com/

  

  gVisor 為每個容器提供了獨立的作業系統核心。應用與 gVisor 核心提供的虛擬環境進行互動,不是直接訪問宿主機的核心。gVisor 還限制和管理檔案和網路操作,確保容器化應用和主機作業系統之間有兩個隔離層。通過減少和限制應用與主機核心的互動,儘可能減小攻擊者繞過容器隔離機制的攻擊面。

  與大部分核心不同,gVisor 不需要固定的物理資源;相反,其利用現有的主機核心功能,並作為一個正常程序執行。換句話說,gVisor 以 Linux 的方式實現了 Linux。

  gVisor 沙盒由多個程序組成,這些程序共同構成了可以執行一個或多個容器的環境。

  每個沙盒都有其獨立的例項:

  Sentry:執行容器的核心,攔截並響應應用的系統呼叫。

  沙盒中的每個容器都有其獨立的例項:

  Gofer:提供容器檔案系統的訪問。