雲原生時代,如何“玩轉”容器安全?

綠盟科技發表於2021-05-22

1. 引言

隨著雲端計算的發展,以容器和微服務為代表的雲原生技術,受到了人們的廣泛關注,其中DockerKubernetes(以下簡稱“K8S”)是企業容器執行時和容器編排的首要選擇。然而,在應用容器和K8S過程中,大多數企業都遇到過不同程度的安全問題,如何保障容器安全,已成為企業最關心的問題。

 

2. 應用容器帶來新挑戰

容器應用之前,雲中應用系統多數執行於虛擬機器上,但虛擬機器仍會有額外的資源浪費和維護成本,並且其啟動速度較慢。容器技術因具有佔用資源少、部署速度快和便於遷移等特點,開始受到企業青睞。在典型的雲原生環境中,通常包括主機、映象、容器、容器編排平臺、網路和微服務等物件,但由於目前多數企業使用容器技術部署業務應用,故下面將重點分析與容器相關的安全挑戰。

 

2.1 容器技術風險

作為一種作業系統虛擬化技術,容器共享作業系統核心,但並未實現完全隔離,若虛擬化軟體存在漏洞,或宿主機被攻擊,將會造成容器逃逸或資源隔離失效,影響某個容器或多個容器的安全。

 

容器逃逸:利用虛擬化軟體存在的漏洞,攻擊者透過容器獲取主機許可權,可攻擊容器所在主機,甚至是該主機上的其他容器。過去幾年內已經發現了多個相關漏洞,其中CVE-2019-5736RunC的一個安全漏洞,它會導致18.09.2版本前的Docker允許惡意容器覆蓋宿主機上的RunC二進位制檔案,使攻擊者能夠以Root身份在宿主機上執行任意命令。

 

資源隔離失效:攻擊者只要攻破容器作業系統核心,就可訪問到主機上的檔案系統,或進入其它容器,導致容器隔離失效。如果把主機的檔案系統掛載到多個容器的目錄裡,容器就可以訪問同一個目錄,將會引起資訊洩露或內容篡改等安全問題。

 

2.2 不安全的映象

映象是一個包含應用/服務執行所必需的作業系統和應用檔案的集合,用於建立一個或多個容器,它們之間緊密聯絡,映象的安全性將會影響容器安全。根據映象建立和使用方式,通常有三個因素影響映象安全。

 

現有映象不安全:映象通常是開發者基於某個現有映象建立的,無論是攻擊者上傳的惡意映象,還是現有映象存在的安全缺陷,基於它建立的映象都將會是不安全的。

 

使用包含漏洞的軟體:開發者經常會使用軟體庫的程式碼或軟體,如果它們存在漏洞或惡意程式碼,一旦被製作成映象,也將會影響容器的安全。

 

映象被篡改:容器映象在儲存和使用的過程中,可能被篡改,如被植入惡意程式和修改內容。一旦使用被惡意篡改的映象建立容器後,將會影響容器和應用程式的安全。 

 

2.3 東西向攻擊

網路實現了容器之間、容器與外部之間的通訊,以及應用之間的互動,但在虛擬化的容器網路環境中,其網路安全風險較傳統網路更復雜、嚴峻。以Docker環境為例,它支援BridgeOverlayMacvlan等網路,儘管實現方式不同,但有一個共同和普遍的問題:如果容器之間未進行有效隔離和控制,則一旦攻擊者控制某臺主機或某臺容器,可以以此為跳板,攻擊同主機或不同主機上的其他容器,也就是常提到的東西向攻擊,甚至有可能形成拒絕服務攻擊。

 

2.4 執行環境未加固

作為容器的載體和編排管理軟體,主機和容器編排平臺等執行環境也是容器安全的重要因素之一。如前所述,主機上的容器並未實現完全隔離,如果主機未進行安全加固,一旦攻擊者發起提權攻擊,將會控制主機上其他容器。對於不安全的容器編排平臺同樣如此,某汽車製造企業就曾深受其害,由於其公有云環境中的K8S Master節點未設定密碼保護,攻擊者在盜取訪問許可權後,使用K8S叢集挖掘加密貨幣。

 

3. 容器安全應對舉措

LXC開始,容器就利用了大部分Linux通用的安全技術,它們構成了容器安全的基礎。面對新挑戰,無論傳統的安全加固,還是新的映象組成分析,映象、容器技術、網路和主機等不同層面的安全措施,都將有助於提升容器安全性。

 

3.1 Linux核心安全機制

Linux通用的安全技術包括名稱空間(Namespace)、控制組(Cgroups)、系統許可權(Capability)、強制訪問控制(MAC)系統以及安全計算(Seccomp)等。一個好的容器平臺,應該具備這些能力,下文將聚焦前三種能力。

 

名稱空間(Namespace:本質上容器是由各種名稱空間組成的,它們為容器提供了基礎隔離,讓每個容器擁有獨立的程式ID、網路棧、根目錄、記憶體、使用者名稱和主機名。

雲原生時代,如何“玩轉”容器安全?

容器是名稱空間的組合

 

控制組(Cgroups:控制組負責實現資源審計和限制,讓每個容器公平的分享主機資源,並設定了限制,以免單個容器過度消耗資源,影響到主機系統和其他容器執行,也可以防止拒絕服務攻擊。

 

雲原生時代,如何“玩轉”容器安全?

2 控制組限制容器可使用的資源

 

系統許可權(CapabilityRoot使用者擁有全部的許可權,以Root身份執行容器很危險;但如果以非Root身份在後臺執行容器的話,由於缺少許可權會處處受限。系統許可權機制可以提供細粒度的許可權訪問控制,控制容器執行所需的Root使用者許可權,即使攻擊者取得了Root許可權,也不能獲得主機的較高許可權,可以限制進一步的破壞。

 

雲原生時代,如何“玩轉”容器安全?

3 系統許可權控制容器許可權

 

3.2 安全容器

Linux通用安全技術為容器提供了基礎隔離,但未實現100%隔離。安全容器透過增加額外的隔離層可以進一步增加容器的安全性。它是一種容器執行時技術,為容器應用提供一個完整的作業系統執行環境(常常是 Linux ABI),將應用的執行與宿主機作業系統隔離開,避免應用直接訪問主機資源,從而可以在容器主機之間或容器之間提供額外的保護。

 

gVisorKata Containers是兩個代表性的安全容器實現,其中Kata Containers透過使用硬體虛擬化,利用輕量級的虛擬機器為容器提供隔離,每一個Container/Pod執行於獨立的虛擬機器上,他們不再從主機核心上獲取相應所有的許可權,從而使Kata ContainersVM一樣能提供強隔離性。

雲原生時代,如何“玩轉”容器安全?

4 Kata Containers結構及原理

 

3.3 映象安全分析

作為容器執行的基礎,容器映象的安全在整個容器安全生態中佔據著重要位置。容器映象由若干層映象疊加而成,透過映象倉庫分發和更新。因此,可以從映象構建安全、倉庫安全以及映象分發安全三方面實現映象安全。

 

映象構建安全:在構建映象時,驗證所依賴映象的完整性和來源,只安裝必要的軟體包,使用恰當的指令,縮小攻擊面;並利用加密技術,保護好密碼、令牌、金鑰和使用者機密資訊等。  

 

映象倉庫安全:映象倉庫分為公共映象倉庫和私有映象倉庫,使用公共映象倉庫的映象時,使用官方釋出最新版本的映象,對下載的映象要經過漏洞掃描評估,並保持定時更新。對於私有映象倉庫,一方面保持倉庫自身的安全性,例如在使用時要配置相應的安全證書,另一方面使用映象過程中,利用使用者訪問許可權控制確保互動過程的安全性。

 

映象分發安全:在映象下載和上傳時,利用數字簽名和Https來保障容器映象的完整性和機密性,抵禦中間人攻擊等威脅。

 

3.4 微隔離

網路的基本防護手段是隔離和訪問控制,容器網路防護可使用容器環境自身安全機制或第三方微隔離產品。對於K8S網路,其自身安全策略對每個Pod的入口強制執行訪問控制,從而能夠隔離高風險的微服務,但Pod內容器間通訊和離開Pod的出口流量無法控制。第三方微隔離產品可是比K8S更詳細地記錄出入網路連線、深入檢測網路中威脅和攻擊,以及檢測資料洩露,實現七層微隔離和網路視覺化。

 

3.5 執行環境加固

利用安全基線對容器主機和K8S進行安全檢查和加固,將會進一步增加容器的安全性。CIS釋出的Docker 基線已成為Linux主機配置和Docker主機加固的最佳實踐。透過建立一個特權容器,將Docker主機安全配置與CIS 基線進行對比,可以發現安全問題和實施加固。同樣,CIS也釋出了K8S 基線,傳統的漏洞掃描工具、獨立的容器安全產品(Aqua SecurityNeuVector)和私有維護人員已經在GitHub上釋出了指令碼,可實現自動化的K8S安全檢查。

 

4. 容器安全實踐

隨著DevOps興起,軟體開發人員與運維人員之間緊密合作,透過自動化流程來完成軟體開發、測試、釋出和維護,整個過程更加快捷、頻繁和可靠,縮短了軟體上線時間,減少了很多重複性和人工工作。現在,針對容器安全風險,已經形成了多種安全控制措施,如何將它們融入到DevOps中高效保護應用系統,是容器安全實踐需要考慮的首要問題。

 

為此,我們秉承DevSecOps理念,提出了容器全生命週期安全保護方案,該方案利用容器安全管理系統,透過容器編排技術將安全容器部署於容器環境中,進行持續的檢測和分析,實現容器環境的資源視覺化管理、映象風險管理、容器執行時安全管理、合規性檢測和微服務API風險管理,最終保障容器在構建、部署和執行整個生命週期的安全。

 

4.1 總體架構

容器安全防護方案採用模組化和分層設計,透過與容器執行環境進行對接,實時獲取容器環境中的映象和容器等物件的相關資訊,利用各種安全能力進行監控和分析,進行統一的安全管理,最後透過圖形化方式為使用者展示容器環境的安全態勢。

 

雲原生時代,如何“玩轉”容器安全?

5 容器安全防護架構

 

安全管理層:負責安全管理功能,包括容器環境的資產管理、策略管理和安全能力管理等,透過安全能力適配將各種管理資訊下發給各種安全能力,以及收集各種安全資訊,經集中分析和處理後,集中對使用者展示容器環境的主機、容器、映象和網路等物件的安全狀態。

 

安全能力層:負責提供具體安全能力,為容器環境提供安全保護,安全能力涉及系統安全掃描、映象檔案分析、惡意檔案分析、入侵檢測和微隔離等。

 

執行環境層:負責提供容器映象、容器編排管理等功能,以及執行應用程式的容器,並與容器能力層進行互動,共同實現容器安全防護。

 

4.2 容器全生命週期保護

根據容器安全防護架構,本方案將各種安全能力與DevOps流水線相結合,從持續整合/持續部署和執行時進行安全防護,為容器提供構建、部署和執行的全生命週期保護,最終實現應用系統的安全執行。

 

雲原生時代,如何“玩轉”容器安全?

6 容器全生命週期保護

 

4.2.1 構建安全

在應用程式構建階段,透過與CI/CD流水線整合,分析構建映象時所使用的命令和配置引數,還原映象檔案構建過程,掌握命令使用的敏感操作,以及分析映象檔案是否包含密碼、令牌、金鑰和使用者機密資訊等敏感資訊。同時,分析映象的軟體組成,發現映象檔案中包含的惡意檔案、病毒和木馬,以及所使用的依賴庫和元件存在的安全漏洞,避免帶病交付。

 

4.2.2 部署安全

分析映象無風險後,映象被提交至映象倉庫。在該階段,將檢查容器環境的映象倉庫配置,確保使用加密方式連線映象倉庫。透過與K8S聯動,當映象倉庫中新增映象或使用映象建立容器時,自動化校驗映象簽名或MD5值,確保映象來源可信且未被篡改,一旦發現映象來源不可信或被篡改,禁止使用該映象建立容器。

 

4.2.3 執行安全

當確認映象安全後,進入到容器執行階段。在該階段利用系統安全掃描能力,基於DockerK8S CIS 基線,對主機和容器編排工具K8S進行合規性檢查,檢查範圍包括主機安全配置、Docker守護程式配置、Docker守護程式配置檔案、容器映象和構建、容器執行安全和Docker安全操作等,確保容器執行環境安全。

 

同時,利用微隔離對容器進行網路隔離,透過入侵檢測能力實時監測容器執行狀態,監測物件包括容器內執行程式(如netlink socketperf eventeBPF)和檔案系統,以及主機環境的許可權提升和破壞容器隔離性等行為。當發現容器執行異常時,利用訪問控制機制限制容器進一步的行為和通訊。

 

結語

伴隨著雲原生應用發展,企業透過微服務來交付應用系統的比例在增加,容器安全也將不僅僅是容器自身和容器環境安全,將延伸到微服務安全和應用安全,企業在應用雲原生技術時,應整體考慮容器安全,讓安全與雲原生相融合,更好的保護應用系統。

相關文章