Cloud Foundry warden container 安全性探討

本文將從Cloud Foundrywarden container的幾個方面探討warden container的安全性。

 

1. warden container互訪


1.1.  互訪原理·

Cloud Foundry內部,用戶應用的運行環境通過warden container來進行隔離。

其中,網絡方面,container之間的互訪如下圖:



假設container1主動訪問container3

1.  container1從自身的虛擬網卡virtual eth0_0發起請求,由於自身內核路由表中的指向,請求發至virtual eth0_1(以下簡稱爲網關);

2.  virtual eth0_1接受到請求,講請求轉發至host主機的物理網卡eth0

3.  host物理網卡eth0接收到請求,從而交給內核網絡棧處理;

4.  請求在內核網絡棧中的處理流程中,首先進行源地址轉換(SNAT),使用host主機的eth0ip地址替換請求數據包的源ip地址,即講10.254.0.2替換爲10.10.18.83,隨後在進行route路由轉發;

5.  經過SNAT轉換之後,請求發往內核路由部分,根據路由表中規則,請求將會轉發至virtual eth2_1網關;

6.  請求回到host宿主機,開始發往virtual eth2_1網關;

7.  Virtual eth2_1網關接收到請求,根據規則轉發至container3的虛擬網卡virtual eth2_0

 

       總體而言,所有從container內部發起的請求,只要經過host宿主機,在其內核網絡棧中均會進行SNAT,隨後進行route路由處理。這樣的話,container之間的互訪也就有了可能性。

 

1.2.  潛在安全問題

       Cloud Foundry是個多租戶的PaaS雲平臺,不同租戶的應用極有可能被部署在同一個DEA上的不同container內部。以上的分析表明,同個DEA上的不同container完全有可能進行互訪,因此假設租戶A的應用在containerA中,通過某些途徑(如ip猜測,端口輪詢等方式),可以獲取到租戶B的應用在containerB中監聽的端口,那麼租戶A具備了攻擊租戶B應用的條件,從而存在安全隱患。

 

1.3.  解決方案設計

 

方案一:

        假設設計的目標是讓所有的container之間都不具備互訪的能力,則配置host宿主機的網絡內核棧規則是一個可行的方案。

        1.1中的分析中可以得出結論,關於container發起的請求,在到達其他container之前都會經過host宿主機的eth0物理網卡。其中,在host宿主機內核網絡棧中,進行規則處理,最後進行轉發。

        container中發起的請求,會經過host宿主機的eth0物理網卡,因此可以在eth0將請求交給內核網絡棧後,內核網絡棧可以在進行SNAT處理之前先校驗數據報的源ip地址以及目的ip地址。若源ip地址和目的ip地址均爲DEA內部containerip地址,則將數據報直接丟棄。

 

       方案一中的設計,雖然可以滿足container之間不能互訪的要求,但是配置所有container之間不能互訪的做法顯得靈活性不足。

        假設租戶A有多個應用分別運行在同一個DEA上的不同container內部,該場景使用方案一的話,租戶A自己的應用也將不能互訪,這大大降低了租戶對運行環境要求的靈活性,也削弱了租戶A應用的功能。


以下介紹方案二的設計。

 

方案二:

       引入應用安全組的概念,允許用戶配置container的外出防火牆規則,主要爲用戶提供創建和隔離應用組的安全網絡zone的概念。

       應用安全組的實現,使得租戶A的應用container與其他租戶的應用container保持網絡不能互訪,而對於同一個租戶自己的多個應用,租戶有權限根據需求進行配置,使得有需要的container之間可以進行互訪,而沒有需要的container之間不能互訪。



2. ContainerCloud Foundry組件級別的互訪

       目前Cloud FoundryDEA上運行的container可以訪問任何Cloud Foundry的組件,相反Cloud Foundry任何組件都可以訪問container,這顯然是不利於整個平臺的安全防護的。



2.1.  互訪原理 

2.1.1. Container訪問Cloud Foundry組件

        假設container發起請求,連接Cloud FoundryDEA外的其他組件,則該請求會在進行SNAT處理之後,有eth0進行轉發,只要host宿主機與其他組件的機器保持網絡暢通,則container完全可以與Cloud Foundry的其他組件進行通信。其中,container默認合法的訪問組件只有gorouter以及service組件,若完成應用間通信的話,container與其他DEA之間的通信也將被認爲合法,而和其他組件的通信均可以認爲是非法的,具體流程圖如下:


 

2.1.2. Cloud Foundry組件訪問container

        該部分內容與2.1.1中大致相同。由於外界訪問container的請求都會被做DNAT處理,因此所有能夠訪問container所在宿主機的Cloud Foundry組件都可以訪問host主機,則均可以訪問container。目前允許訪問DEA內部containerCloud Foundry內部組件,只有gorouterservice,以及其他DEA(假設允許應用之間允許互相通信),而Cloud Foundry其他的組件訪問container均被認爲是非法的。

 

2.2. 潛在安全問題

2.2.1. Container非法訪問Cloud Foundry組件的安全

       Cloud Foundry託管用戶應用的運行,假設用戶上傳惡意應用,而惡意應用與Cloud Foundry其他的組件可以保持網絡的暢通,則惡意應用完全有可能具有能力對Cloud Foundry的其他組件進行攻擊,從而影響到整個平臺的安全性。

 

2.2.2. Cloud Foundry組件非法訪問container的安全

        原則上,由於Cloud Foundry組件是平臺級別的,對container的訪問理論上不會造成很大的影響。然而當Cloud Foundry平臺級別的組件受到惡意攻擊並被攻破,而DEAcontainer沒有受到攻擊的時候,假設Cloud Foundry組件還可以訪問container,則惡意攻擊還將蔓延至用戶部署的應用上,而限制Cloud Foundry組件非法訪問container的策略,可以在Cloud Foundry平臺被攻擊的情況下,大大提高用戶應用的安全性。

 

2.3. 解決方案設計

        對於Cloud Foundrycontainer內部訪問Cloud Foundry其他組件的情況,可以配置DEA所在的host宿主機防火牆規則來實現。

        container內部的請求發送至host宿主機的物理網卡eth0,在做SNAT地址轉換之前,由宿主機內核網絡棧對請求進行處理,如果目的ip地址不是gorouterservice或者dea的話,該數據報將會被丟棄。

        爲實現以上的策略,DEA在啓動之前需要獲知所有Cloud Foundry內部組件的角色與IP地址映射關係,從而通過這些映射關係配置防火牆策略。


3. ContainerService組件的互訪


3.1.  互訪原理

       Cloud FoundryService的存在大大完善了應用的功能性。然而,目前Cloud Foundry內部的應用對於Service的訪問,只需應用持有數個元素,即可以訪問service instance,這些元素主要有5個,即service instanceipportusernamepasswordinstance name

        關於service instance訪問請求的流程,與container訪問Cloud Foundry其他組件的原理一致,如下圖:


 

3.2.   潛在安全問題

        假設一個租戶的應用非法持有了某service intance的這5個元素,那麼此應用將會完全有能力訪問該service instance。原先的Cloud Foundry對於這種情況,沒有合適的應對措施,也就相當於默認service instance的這種安全隱患。

        以上的敘述可見,關於container訪問service的安全隱患,主要體現在防範的侷限性方面。因爲所有的安全策略制定都依賴於service instancecredentials信息,也就是5元素上。在目前工業界中,依靠這部分的安全保護,已經顯得不足。而且Cloud Foundry是一個面向多租戶的PaaS,數據的安全性格外敏感,必須從多個維度來保護用戶數據的安全性。

 

3.3.   解決方案設計

 

方案一:

       通過配置container所在的host宿主機防火牆規則,來實現合法應用對service instance的合法訪問,並且阻止非法應用對service instance的非法訪問。

具體實現如下:

1.   在應用和service instance綁定完畢之後,DEA會將service instancecredentials信息當作參數放入應用啓動請求中;

2.  DEA可以在啓動應用之前,先提取containerip地址,以及service instanceip地址信息,從而在host宿主機上配置防火牆策略,實現,containerservice instance的合法訪問,而沒有綁定過service instancecontainer則在非法持有正確的credentials之後,也無法訪問service instance

3.   當停止應用的時候,DEA首先解析containerip地址以及service instance的信息,隨後刪除防火牆記錄。

 

方案二:

       通過配置service instance所在的Service Server所在節點,來實現合法應用對service instance的訪問,並且阻止非法應用對service instance的非法訪問。

具體實現如下:

1.   在應用和service instance進行綁定的時候,由Cloud Controller告知service server所在節點,綁定service instance的應用所屬的IP:PORT映射對;

2.   Service Server所在節點,接收到Cloud Controller發送來的請求後,制定自身的防火牆策略,從而保證只允許綁定service instance的應用所對應的IP:PORT映射對才能訪問該節點。

3.   當應用停止的時候,Cloud Controller發送請求給Service Server所在節點,由Service Server所在節點刪除防火牆記錄。 


        以上便是對Cloud Foundry中warden container的部分安全性探討。

        未完待續。



關於作者:

孫宏亮,DAOCLOUD軟件工程師。兩年來在雲計算方面主要研究PaaS領域的相關知識與技術。堅信輕量級虛擬化容器的技術,會給PaaS領域帶來深度影響,甚至決定未來PaaS技術的走向。


轉載請註明出處。

本文更多出於我本人的理解,肯定在一些地方存在不足和錯誤。希望本文能夠對接觸warden安全性的人有些幫助,如果你對這方面感興趣,並有更好的想法和建議,也請聯繫我。

我的郵箱:[email protected]
新浪微博:@蓮子弗如清
                      

發佈了47 篇原創文章 · 獲贊 10 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章