對于容器而言,由于底層的基礎(chǔ)架構(gòu)非常復(fù)雜,稍有不慎,就可能會帶來嚴(yán)重的安全后果。因此,在享受容器帶來便捷性紅利之前,如何讓容器“不裸奔”,這成為了容器推廣普及一大障礙。
當(dāng)然,確保容器安全是一個持續(xù)的過程。像其他測試和質(zhì)量控制措施一樣,應(yīng)該將安全集成到開發(fā)過程中來,盡可能實現(xiàn)自動化,減少手動處理的工作量,同時,安全還應(yīng)該擴(kuò)展到底層基礎(chǔ)架構(gòu)的運(yùn)行與維護(hù)當(dāng)中來。
青藤蜂巢,在對容器安全進(jìn)行深入研究之后,正式提出容器安全“五個保護(hù)”:
●保護(hù)容器主機(jī)的安全
●保護(hù)容器網(wǎng)絡(luò)流量安全
●保護(hù)容器中應(yīng)用的安全
●保護(hù)容器管理技術(shù)堆棧
●保護(hù)構(gòu)建管道的完整性
圖1:一站式容器安全解決方案
保護(hù)容器主機(jī)的安全
要保護(hù)主機(jī)安全,首先要保護(hù)主機(jī)操作系統(tǒng)。應(yīng)盡可能使用經(jīng)過優(yōu)化的分布式操作系統(tǒng)來運(yùn)行容器,例如Container Linux、RancherOS、Ubuntu Core、Google的Container-Optimized OS或RedHat Atomic等發(fā)行版本。這些發(fā)行版本都已經(jīng)刪除了可有可無的服務(wù),優(yōu)化了性能并減少了攻擊面。如果使用常規(guī)Linux發(fā)行版或Windows系統(tǒng),則通常需要禁用或刪除不必要的服務(wù)并加固操作系統(tǒng)。
然后添加主機(jī)安全產(chǎn)品,確保主機(jī)按預(yù)期狀況運(yùn)行,實時監(jiān)控主機(jī)風(fēng)險狀況包括漏洞、不合規(guī)配置、弱密碼等等,還需要實時進(jìn)行入侵檢測,在入侵行為尚未造成危害之前及時發(fā)現(xiàn)和響應(yīng)。
監(jiān)控容器網(wǎng)絡(luò)流量安全
容器投入生產(chǎn)后,需要與其他容器和資源進(jìn)行交互。進(jìn)入網(wǎng)絡(luò)的流量通常會受到其他安全控制措施的保護(hù)。部署在網(wǎng)絡(luò)邊界處的Web網(wǎng)關(guān)和IPS具有一定的過濾功能,可以防止發(fā)生直接攻擊或嘗試進(jìn)行水坑攻擊(先攻擊某項服務(wù),然后攻擊其訪問者)。
關(guān)于容器流量的另一項安全挑戰(zhàn)是監(jiān)控和保護(hù)容器之間的流量。攻擊者在系統(tǒng)中找到一個立足點后,就會迅速進(jìn)行橫向行動,擴(kuò)大影響范圍。比如主機(jī)A的Apache向主機(jī)B的MongoDB請求數(shù)據(jù);同時也有可能是主機(jī)內(nèi)部容器之間的流量,比如主機(jī)A內(nèi)部的Apache服務(wù)器請求主機(jī)A內(nèi)部的MongoDB的流量。
為應(yīng)對這類威脅,目前有兩種入侵防御方案,一種是在網(wǎng)絡(luò)邊界處部署IPS設(shè)備,另一種是以軟件形式在物理主機(jī)上部署入侵防御軟件。但是部署在邊界處的IPS無法監(jiān)控主機(jī)內(nèi)部容器之間的流量,部署在主機(jī)內(nèi)部IPS軟件,也無法對跨主機(jī)的容器之間的流量進(jìn)行入侵防御。
針對容器東西向流量入侵防御,以docker為例,目前有一種方式是在物理主機(jī)內(nèi)部連接容器的網(wǎng)橋上設(shè)置Netfilter鉤子,利用鉤子截獲所有進(jìn)出容器的東西向流量。對截獲的東西向流量進(jìn)行清洗,判斷所述東西向流量中的報文是否屬于惡意流量。若屬于惡意流量,則阻止相關(guān)連接。
圖2:監(jiān)控容器流量
保護(hù)容器管理技術(shù)堆棧
在容器部署問題,通常會使用兩個關(guān)鍵基礎(chǔ)設(shè)施,即私有容器鏡像倉庫和容器編排工具Kubernetes。
容器鏡像倉庫是用于搜索、存儲和分發(fā)容器的,簡化了容器的共享工作,并幫助團(tuán)隊充分利用彼此的工作成果,提高了工作效率。為了確保每個容器都符合開發(fā)和安全基準(zhǔn),需要對容器鏡像實時進(jìn)行漏洞掃描。在將容器鏡像推送到鏡像倉庫中去之前,要先對容器鏡像進(jìn)行漏洞掃描,查看是否存在已知漏洞、惡意軟件以及明文秘鑰,這樣有助于減少下游的安全問題。此外,還需要確保鏡像倉庫本身也采取了良好的保護(hù)措施。鏡像倉庫應(yīng)該運(yùn)行在加固系統(tǒng)或信譽(yù)良好的云服務(wù)之上。
Kubernetes是一款復(fù)雜的容器編排工具,讓企業(yè)實現(xiàn)了應(yīng)用的自動化部署,給企業(yè)帶來了巨大的業(yè)務(wù)收益。從安全角度來看,Kubernetes還提供了實現(xiàn)許多運(yùn)營和安全控制的功能。實施Pod(集群級別的資源)和網(wǎng)絡(luò)安全策略后,可以采用不同方案來滿足風(fēng)險承受能力。
保護(hù)容器中的應(yīng)用安全
在構(gòu)建一款應(yīng)用時,開發(fā)人員很少會從頭開始。通常的做法是從一個現(xiàn)有容器著手,例如像Ubuntu或CentOS這樣的低層容器,或者像node或nginx這樣的更高層容器,或者是組織機(jī)構(gòu)自定義的容器。不管選擇在哪個容器上構(gòu)建數(shù)據(jù),關(guān)鍵是要確保構(gòu)建應(yīng)用的底層容器基礎(chǔ)是安全的,不會給數(shù)據(jù)造成風(fēng)險。
從首選鏡像倉庫中拉取鏡像部署容器時,也是如此。需要有一個相應(yīng)的工作流程,確保使用的容器安全可靠,可抵御常見威脅。為此,需要進(jìn)行容器鏡像掃描,掃描容器的內(nèi)容,查看是否存在任何問題,然后再用于構(gòu)建應(yīng)用。在投入生產(chǎn)之前,還要進(jìn)行最后的安全檢查。
進(jìn)行鏡像掃描主要是為了查找惡意軟件、已知漏洞以及任何秘鑰或機(jī)密信息(例如應(yīng)用程序編程接口(API)密鑰和令牌),以便在繼續(xù)開發(fā)應(yīng)用之前降低風(fēng)險。這一步可確保在安全容器基礎(chǔ)之上構(gòu)建應(yīng)用。
鏡像掃描功能不僅限于確定使用的容器基礎(chǔ)是安全可靠的,還應(yīng)該成為編碼流程不可或缺的一部分。這是一個完全自動化的過程,可以快速輕松地識別開發(fā)應(yīng)用和容器時遇到的任何問題。在開發(fā)過程的早期階段捕獲漏洞、惡意軟件或明文秘鑰之類的問題,更易于解決并節(jié)省您的時間。
雖然一旦將應(yīng)用構(gòu)建到容器中并部署到生產(chǎn)環(huán)境中,就不會再發(fā)生變化。但是,容器投入生產(chǎn)運(yùn)行后,是會實時發(fā)生變化的。容器會產(chǎn)生應(yīng)用數(shù)據(jù),生成日志文件、緩存文件等等。
安全監(jiān)控軟件,包括有助于確保在容器中開展的活動中是否存在一些風(fēng)險。例如,如果存在漏洞,則安全引擎可以檢測是否有人在嘗試進(jìn)行漏洞利用,并通過丟棄數(shù)據(jù)包來保護(hù)應(yīng)用。
確保構(gòu)建管道的完整性
除了容器環(huán)境之外,容器構(gòu)建管道也日益成為攻擊者的目標(biāo)。攻擊者已開始將攻擊轉(zhuǎn)移到持續(xù)集成/持續(xù)交付的早期階段(CI/CD)管道。如果攻擊者攻陷了容器構(gòu)建服務(wù)器、代碼存儲庫或開發(fā)人員工作站,那么攻擊者就可以在組織機(jī)構(gòu)的環(huán)境中駐留很長時間。因為大多數(shù)安全程序不會主動監(jiān)控這些關(guān)鍵資源。
對此,第一步是確保這些系統(tǒng)具有強(qiáng)大的安全控制措施,并進(jìn)行隨時更新。組織機(jī)構(gòu)的代碼通常是其最具價值的資產(chǎn)之一,因此,需要保護(hù)代碼的安全。
第二步是在整個管道中實施強(qiáng)大的訪問控制策略。這可以從代碼存儲庫和分支策略著手,一直擴(kuò)展到容器存儲庫。這需要確保實施最小特權(quán)原則(僅提供完成任務(wù)所需的訪問權(quán)限)并定期審核該訪問情況。
總結(jié)
對于容器安全而言,從來都沒有一個解決方案可以作為萬能良藥。盡管容器本身很簡單,但容器底層的基礎(chǔ)架構(gòu)會越來越復(fù)雜。這就需要像關(guān)鍵資產(chǎn)一樣,了解、監(jiān)控和保護(hù)基礎(chǔ)架構(gòu)。毫無疑問,各大企業(yè)可以從容器技術(shù)中受益,但與任何新技術(shù)一樣,必須制定強(qiáng)有力的“由外而內(nèi)”安全計劃,自動化實現(xiàn)容器以及容器構(gòu)建管道的安全。