容器安全和安全運行時的重要性
容器徹底改變了我們開發和部署應用程序的方式,提供了封裝應用程序及其依賴項的輕量級和可移植環境。但我們如何保證它們的安全呢?
需要解決的關鍵之一是容器運行時 - 負責啓動和管理容器的軟件。
雖然 Docker 和 Containerd 等容器運行時被廣泛使用,但它們與主機操作系統的緊密耦合可能會帶來風險。在本文中,我們將深入探討容器運行時的工作原理、爲什麼緊密耦合的運行時會在攻擊者逃離容器時導致主機接管,以及使用 gVisor 和 Kata Containers 等安全容器運行時的重要性。
瞭解容器運行時
容器運行時編排容器、管理其生命週期並將其與主機和其他容器隔離。通過利用命名空間和 cgroup 等 Linux 內核功能,運行時圍繞容器創建安全邊界。
然而,傳統的運行時與主機的內核緊密相關,這存在潛在的安全漏洞。如果攻擊者設法逃離容器,該攻擊者就可獲取對底層主機操作系統的未經授權的訪問,從而危及整個系統的安全。
緊密耦合的容器運行時繼承了主機操作系統的安全態勢和攻擊面。運行時或主機內核中的任何漏洞及其利用都會成爲攻擊者的潛在切入點。
在多租戶環境或運行不受信任的工作負載時,這種風險尤其嚴重。爲了減輕這種威脅,使用安全的容器運行時(例如 gVisor 和 Kata Containers)至關重要。
這類安全容器運行時提供了額外的隔離和安全層,採用創新技術來增強容器化工作負載的安全性。例如,gVisor 使用用戶空間內核實現,而 Kata Containers 則通過輕量級虛擬機實現。這些安全運行時將容器與主機操作系統隔離,防止攻擊者未經授權訪問底層基礎設施,並降低主機接管的風險。
當下主流的一些容器運行時介紹
容器運行時提供了創建、部署和執行容器運行所需的工具和庫。這些容器運行時處理諸如創建和管理容器映像、容器的啓動和停止、資源隔離、網絡和安全性等任務。它們構成了容器化技術的基礎,對於跨不同計算環境一致運行應用程序至關重要。以下是一些最流行的容器運行時。
Docker
Docker 是一種廣泛使用的容器運行時,可爲構建、打包和運行容器提供完整的生態系統。它包括管理容器生命週期的 Docker 引擎和提供與容器交互的命令行界面的 Docker CLI。
在底層,Docker 使用 runC 作爲默認的底層容器運行時。runC 基於開放容器計劃 (OCI) 運行時規範生成和管理容器。
Containerd
Containerd 是由 Docker 開發的開源容器運行時,側重於提供穩定、高性能和可移植的強大運行時。Ccontainerd 旨在作爲容器編排系統的核心組件,可以與 Kubernetes 等更上層的編排平臺集成。
與 Docker 類似,Containerd 使用 runC 作爲默認的底層容器運行時來創建和管理容器。
runC
runC 由 OCI 開發,是一個符合 OCI 運行時規範的輕量級底層運行時,通過在隔離的沙箱中啓動容器來提供基本的容器執行環境。Docker 和 Containerd 都利用 runC 的功能來處理容器生命週期管理、進程隔離、文件系統掛載和其他底層容器操作。
CRI-O
CRI-O 是專爲 Kubernetes 設計的輕量級容器運行時。它實現了 Kubernetes 容器運行時接口(CRI),併爲 Kubernetes 與容器交互提供了接口。CRI-O 在底層使用 runc 和 Containerd 等技術。
安全容器運行時:gVisor 和 Kata Containers
gVisor 是 Google 開發的開源容器運行時,使用輕量級用戶空間內核 “Sandbox” 爲容器提供安全的執行環境。
gVisor 不是直接在主機內核上運行容器,而是在隔離的沙箱中運行容器,增加了額外的安全和隔離層。沙箱攔截來自容器的系統調用,並應用自身的類內核實現,提供針對內核級漏洞的防禦機制。
Kata Containers 開源項目將輕量級虛擬機 (VM) 與容器運行時相結合,採用硬件虛擬化技術爲每個容器進程啓動單獨的 VM,提供容器之間的強隔離。
每個虛擬機都運行一個極簡的輕量級客戶操作系統,例如精簡版 Linux 內核。Kata Containers 旨在保證容器的性能優勢,同時提升虛擬機的安全性和工作負載隔離。
gVisor 和 Kata Containers 都解決了與傳統容器運行時相關的某些安全問題,有助於降低容器逃逸攻擊的風險,在某些情形下,攻擊者可利用容器運行時或內核中的漏洞獲得對主機系統的未經授權的訪問。通過添加額外的隔離和安全控制層,這些運行時強化了對容器化工作負載提供的保護。
gVisor 和 Kata Containers 並不相互排斥;事實上,它們可以一起使用,Kata Containers 可使用 gVisor 作爲其運行時,這種組合通過將虛擬機層面的隔離優勢與 gVisor 所提供的額外安全措施相結合,進一步增強了安全性和隔離性。
這些安全容器運行時在運行不受信任或潛在易受攻擊的工作負載的情況下特別有用,例如在多租戶環境中或處理不受信任的第三方代碼時。
在安全運行時中運行容器
使用 gVisor 和 Kata Containers 等安全運行時可以顯著增強對主機系統的保護。主要安全優勢如下:
-
增強隔離:gVisor 和 Kata Containers 在容器和主機系統之間提供了額外的隔離層。這種隔離有助於防止容器逃逸攻擊並限制容器內安全漏洞的影響。
-
內核級保護:gVisor 和 Kata Containers 都可以防禦內核級漏洞。gVisor 自身已實現類內核接口,可攔截來自容器的系統調用並執行安全策略。Kata Containers 採用硬件虛擬化技術可在具有內核實例的獨立虛擬機中運行容器,將這些獨立虛擬機與主機內核隔離。
-
縱深防禦:通過將這些運行時的安全機制與其他最佳安全實踐(例如強大的訪問控制、網絡分段和圖像掃描等)相結合,可提升容器部署的安全性。
-
兼容性和互操作性:gVisor 和 Kata Containers 都可與 Kubernetes 等容器編排平臺配合使用,用戶藉助這些技術的安全優勢,無需對現有容器化應用程序或部署流程進行重大更改。
請注意,雖然 gVisor 和 Kata Constianers 提升了安全性,但由於額外的隔離層,它們可能會帶來一些性能開銷。因此,實際部署時仍需要對特定用例和性能要求進行評估,以確定所提供的安全優勢是否超過任何潛在的性能影響。
在安全容器運行時中運行微服務
微服務架構通常涉及在同一基礎設施上運行的多個獨立服務。通過在安全容器運行時中運行每個微服務,可以確保它們彼此隔離。
這有助於防止容器逃逸、權限升級和內核級漏洞。一旦發生安全漏洞或故障,安全容器運行時還可幫助限制安全危機的擴散,防止事態進一步升級。
用戶還可通過容器運行時爲每個微服務分配特定的資源(例如 CPU、內存和存儲),確保資源的公平分配。這可以防止資源爭用問題,否則惡意行爲者可能會利用資源爭用問題來降低其他微服務的性能或穩定性。
要在安全容器運行時中運行微服務,需要執行以下步驟:
-
選擇安全容器運行時
評估不同的安全容器運行時(例如 gVisor 和 Kata Containers),並選擇最能滿足需求的一種。考慮安全功能、性能影響、與現有基礎設施的兼容性以及社區支持等因素。
-
安全構建容器鏡像
使用受信任的基礎鏡像,定期更新依賴項並掃描鏡像是否存在漏洞。實施安全的鏡像註冊並強制執行鏡像簽名以驗證鏡像的真實性。
-
安全配置
以適當的安全設置配置容器運行時,可能包括啓用隔離功能、應用資源限制、設置容器網絡策略和控制對主機系統資源的訪問等。遵循容器運行時文檔提供的安全準則。
-
實施嚴格的訪問控制
爲容器化微服務實施強大的訪問控制。這包括限制容器權限、對容器編排平臺採用基於角色的訪問控制 (RBAC) 以及保護容器運行時 API。
-
持續監控和記錄
實施監控和日誌記錄解決方案來跟蹤容器化微服務的行爲。監控可疑活動、異常行爲和潛在的安全事件。集中式日誌記錄和分析有助於高效地檢測和響應安全事件。
-
定期更新和打補丁
通過應用安全補丁和更新來使容器運行時保持最新,確保擁有最新的安全改進和錯誤修復。
-
運行安全測試
對容器化微服務定期進行安全評估和滲透測試,這有助於識別容器運行時配置和應用程序代碼中的漏洞和潛在弱點。
gVisor 的架構
gVisor 主要包括兩大組件:Sentry 和 Gofer。
Sentry
Sentry(不要與同名的 Sentry 監控平臺混淆)代表容器化應用程序負責攔截和服務系統調用。它充當類似內核的接口,但不會將調用直接轉發到主機內核。
相反,Sentry 在其自己的隔離環境中爲這些請求提供服務,可在正在運行的微服務和主機之間提供一層隔離。Sentry 會進行自己的有限系統調用,這些調用與安全執行的 seccomp 規則密切相關。
Gofer
Gofer 是 gVisor 的組件,負責協調文件系統操作。當容器化應用程序需要訪問主機文件系統時,Sentry 會將這些請求轉發給 Gofer。
然後,Gofer 使用主機,代表應用程序執行必要的文件系統操作,通過防止從容器內直接訪問主機文件系統,引入了額外的隔離層。
gVisor 使用名爲 runsc(runsc 沙箱)的進程來代替 runc 作爲底層容器運行時。runsc 專爲 gVisor 設計,充當容器運行時和 gVisor 組件(Sentry 和 Gofer)之間的接口。
它處理容器生命週期管理、進程隔離和其他底層容器操作。 runsc 與 Sentry 和 Gofer 交互,爲 gVisor 中的容器化應用程序提供安全的執行環境。
Kata Containers 的架構
Kata Containers 通過將每個容器或 Pod 封裝在自己的專用 VM 中的方法提供了額外的保護層,因爲每個 VM 都有自己的內核,該內核僅包含容器工作負載所需的服務,從而減少了潛在的攻擊面。
除增強安全性之外,Kata Containers 還優先考慮性能和資源效率。Kata Containers 提倡最小程度佔用空間,這對於那些在安全需求與高效資源利用率之間尋求平衡的組織來說頗具吸引力。
Kata Containers 旨在與現有的容器化應用程序和部署基礎設施兼容,使組織能夠採用安全的運行時功能,而無需進行重大修改。
用戶通過將 Kata Containers 視爲集羣的安全運行時,可從其出色的隔離性、輕量資源佔用和增強的安全性中受益,使其成爲部署敏感或不可信工作負載的絕佳選擇。
配置 gVisor 以實現容器安全
以下是用於創建_ RuntimeClass_ 對象和利用 gVisor 作爲容器運行時的 pod 清單文件的代碼示例。
在此示例中,創建了一個名爲 gvisor 的 RuntimeClass,指定容器運行時處理程序爲 “runsc”,該命令用於與 gVisor 交互。
在 gvisor-pod.yaml 文件中,定義了一個名爲 gvisor-pod 的 Pod。runtimeClassName 字段指定該 Pod 使用 “gvisor”RuntimeClass,對應於 gVisor 容器運行時。
容器部分可定義容器配置,包括要使用的容器名稱和鏡像(將 “your-image” 替換爲實際鏡像名稱)。
準備好 gvisor.yaml 和 gvisor-pod.yaml 文件後,可以使用以下命令創建 RuntimeClass 並部署 pod。
這些命令將爲 gVisor 創建 _RuntimeClass_對象,並使用 gVisor 作爲容器運行時來部署 pod。
請注意,務必確保在 Kubernetes 集羣上正確安裝和配置 gVisor,以使這些配置正常工作。
以下是用於創建 RuntimeClass 對象和利用 Kata Containers 作爲容器運行時的 pod 清單文件的代碼演示。
在上面的示例中,定義了一個名爲 kata 的 RuntimeClass,指定容器運行時處理程序爲 “kata-runtime”,對應於 Kata Containers 運行時。
kata-pod.yaml 文件中定義了一個名爲 kata-pod 的 Pod。runtimeClassName 字段指定該 Pod 應使用 kata RuntimeClass,對應於 Kata Containers 運行時。
容器部分可定義容器配置,包括容器名稱和要使用的容器鏡像(將 “your-image” 替換爲實際鏡像名稱)。
準備好 kata.yaml 和 kata-pod.yaml 文件後,可以使用以下命令創建 RuntimeClass 並部署 pod:
這些命令將爲 Kata Containers 創建 RuntimeClass 對象並部署 Pod,使用 Kata Containers 作爲容器運行時。
請確保在 Kubernetes 集羣上正確安裝和配置 Kata Containers,以使這些配置按預期工作。
Kubernetes RuntimeClass 功能的優勢
Kubernetes 中的 RuntimeClass 功能高度靈活,用戶可根據特定需求和安全策略選擇不同的容器運行時,爲集羣中的不同工作負載定義和選擇合適的運行時。
以下是使用 RuntimeClass 的主要優勢和用例:
-
工作負載隔離: 不同的工作負載可能有不同的安全需求,通過 RuntimeClass,您可選擇最合適的運行時,爲每個工作負載提供所需的隔離和安全級別。
例如,對於安全敏感型工作負載,可使用 gVisor 或 Kata Containers 等更輕量級、更高效的容器運行時;對於其他工作負載則使用標準運行時,如 Docker 或 containerd。
-
自定義運行時:RuntimeClass 能夠在 Kubernetes 環境中集成和使用自定義容器運行時。如果您已經開發或採用定製的運行時來滿足需求,可爲其定義 RuntimeClass 並用於特定工作負載。
-
性能優化: 不同容器運行時的性能各有不同,通過使用 RuntimeClass,您可爲每個工作負載選擇最合適的運行時以優化性能。例如,對於需要更高資源利用率和更快啓動時間的工作負載,可選擇 gVisor 或 Kata Containers 等輕量級運行時。
-
合規和安全策略: 組織通常有特定的安全策略或合規性要求,規定用於某些工作負載的運行時。RuntimeClass 讓您可通過爲需要遵守特定安全準則的工作負載配置適當的運行時來執行這些策略。
-
動態運行時切換:RuntimeClass 還支持爲正在運行的工作負載動態切換運行時。這種靈活性使您可按需切換運行時,從而適應不斷變化的工作負載需求或高效應對安全事件。
部署安全運行時的最佳實踐
瞭解何時以及如何使用安全容器運行時對於規劃安全的 Kubernetes 環境至關重要。以下是根據特定需求部署安全運行時的一些選項和注意事項。
在集羣中的每個 Pod 上使用安全運行時。一種方法是使用安全容器運行時(例如 gVisor 或 Kata Containers)作爲集羣中所有 Pod 的默認運行時,這可確保集羣中運行的所有工作負載的一致且強大的隔離,無論其信任級別如何。
通過默認使用安全運行時,可爲整個環境提供額外的保護層。
在安全容器中運行不受信任的或第三方應用程序。在運行不受信任的或第三方應用程序時,安全運行時尤爲重要。通過使用 gVisor 或 Kata Containers 的運行時在安全容器中部署這些應用程序,可以降低潛在風險並將其與底層主機系統隔離。
此方法有助於保護主機和其他工作負載免受來自不可信代碼可的潛在漏洞或惡意活動的影響。
在默認的 runC 運行時中部署自研應用程序。如果企業或組織內部開發了值得信賴的應用程序並且經過了嚴格的安全審查,可以選擇在默認的 runC 運行時中運行。這種方法承認可信應用程序可能不需要安全運行時提供的額外隔離。
然而,爲這些應用程序實施適當的安全實踐(例如容器加固和漏洞掃描)至關重要。
考慮具體需求和環境。是否部署安全容器運行時應基於具體需求、安全要求和風險評估。評估數據敏感性、監管合規性、威脅形勢和環境整體安全態勢等因素。
此外,還應考慮使用安全運行時產生的性能開銷和對資源使用的影響,因爲與標準運行時相比,它們可能會帶來一些額外的開銷。
本文翻譯自英文文章:
https://thenewstack.io/container-security-and-the-importance-of-secure-runtimes/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/h4xqGhbjFvwKXgQAXlFZlA