使用Cilium增強Istio|通過Socket感知BPF程序
- 2019 年 12 月 6 日
- 筆記

原文地址:https://cilium.io/blog/2018/08/07/istio-10-cilium/ 作者:Cilium 譯者:甄中元 校對:宋凈超
8月1日凌晨,Istio 1.0發佈,已生產就緒! Cilium社區感謝所有Istio貢獻者為此付出的巨大努力。我們很幸運能夠參與社區活動,為Istio做出貢獻,並幫助一些用戶通過Istio和Cilium進行生產部署。如果您有興趣在深入了解技術細節之前了解Istio + Cilium的用戶故事,請考慮閱讀HP FitStation團隊(最大的Cilium + Istio用戶之一)發佈的以下Istio博客: Istio是惠普FitStation平台的遊戲規則的改變者。
本博客將介紹BPF和Cilium如何增強Istio的一些細節:
- 增強安全
- 使用socket感知BPF程序為多容器pod提供最小權限
- 防止受損的sidecar代理和繞過sidecar協議
- 使用BPF強制所有應用程序流量經過sidecar代理
- 開啟Istio對外部服務的支持
- 使用socket感知BPF程序和kTLS提供TLS鏈接加密的可視化和控制管理
- 性能
- 高效網絡和socket重定向加速istio性能
Cilium是什麼?
Cilium是一個開源軟件,用於透明保護在使用Kubernetes、Docker和Mesos等Linux容器管理平台部署的應用程序服務之間的網絡和API連接。
Cilium的基礎是一種名為BPF的新Linux內核技術,這使得能夠在Linux自身內動態植入強大的安全性,可見性和網絡控制邏輯。除了提供傳統的網絡級安全性之外,BPF的靈活性還可以在API和進程級別上實現安全性,以保護容器或容器內的通信。由於BPF在Linux內核中運行,因此無需對應用程序代碼或容器配置進行任何更改便可以應用和更新Cilium安全策略。
有關Cilium的更詳細的介紹,請參閱Cilium簡介部分。
Istio是什麼?
Istio提供了一種通過負載均衡、服務間身份驗證、監控等且沒有侵入性創建部署服務網絡的簡便方法。可以通過在整個環境中部署特殊的sidecar代理來添加對服務的支持,該代理攔截微服務之間的所有網絡通信,使用Istio的控制平面功能進行配置和管理。

您可以在Istio文檔中閱讀有關Istio概念和架構的更多信息。
Istio高效網絡
Istio和Cilium之間最基本的協作形式是Cilium CNI插件通過將所有sidecar代理連接在一起並通過提供代理和Istio控制平面之間的連接,為Istio提供網絡連接。Cilium還確保Istio託管服務可以與不受Istio管理的pod進行通信。
下圖說明了Istio控制平面、sidecar代理和CNI插件如何相互疊加:

在這種模式下,所有Istio系統組件都受益於Cilium在Linux內核中基於BPF的高效網絡功能。BPF是網絡和數據包過濾技術(如iptables等)的替代方案。您可以在以下博客文章中找到有關BPF推動這一轉變的原因的更多信息:為什麼內核社區用BPF替換iptables?
Socket級別重定向加速Istio和Envoy
Istio服務網格架構要求將參與服務網格的所有pod的出站和入站請求的所有網絡流量都要重定向到sidecar代理。Sidecar代理將終止所有TCP連接並執行諸如遙測、重試、路由、雙向TLS之類的服務和代表服務的授權,並使用輔助所謂的上游TCP連接來到達目的地服務,這正是服務之間支持雙向TLS,沒有代碼侵入性原因所在。然而,當使用標準的基於IP的工具(如iptables)實現重定向時,這種重定向可能會很費事,因為必須多次遍歷整個TCP/IP堆棧。

Cilium充分使用了一個叫sockmap的令人興奮的BPF功能。它允許過濾和重定向,基於套接字級別,使Cilium可以socket感知。此socket是應用程序用於發送和接收網絡流量的接口。這允許在相同節點上實質上短路TCP socket,從而以完全透明的方式大幅加速應用程序和服務網格的sidecar代理的通信速度。應用程序和sidecar代理都不需要以任何方式進行修改。如果您有興趣了解有關此用例的更多信息,請參閱位於奧斯汀的KubeCon 2018上的演示文稿——使用CIlium加速Envoy、Istio和Linux內核(錄像、幻燈片)。
用Cilium增強Istio安全性
Cilium與Istio整合,以增強Istio的安全性。我們來看看Istio提供的安全屬性:
- 雙向TLS:如果發送者由Istio控制,則能夠驗證發件人的身份。這可以保護服務免受來自非法源服務欺騙IP地址的攻擊請求。它還可以在Istio管理的所有服務之間啟用基於TLS/SSL的加密。
- 授權:能夠授權請求,包括過濾元數據(如HTTP協議字段,IP尋址和身份信息)以及調用其他授權插件(例如,執行令牌驗證)。
LEVEL 1: 保護不受支持的協議和受損的sidecar(Cilium 1.0)
所需的第一個基本保護級別是將安全策略應用於Istio不支持的所有網絡協議,包括UDP、ICMP和所有IPv6流量。任何此類流量都會繞過sidecar代理,從而通過Istio強制執行任何最終安全策略。無論協議如何,Cilium將pod之外所有網絡流量應用L3/L4安全策略。如果遇到不支持的協議,則將丟棄該數據包。

- 安全化非IPv4/TCP協議: Cilium在pod之外提供安全策略,對於協議不受支持、重定向或由於某些其他原因而失敗,將完全阻止或應用細粒度的安全規則到任何繞過代理的流量。
- 防止受損的sidecar:sidecar代理本身不受Istio安全規則的約束。受損的sidecar可以不受限制地訪問網絡。它還可以操縱自己的安全規則以變得更加寬鬆。除了Istio之外,Cilium還允許定義服務級別安全策略,並確保受損的sidecar代理只能以最小權限運行。
LEVEL2: 安全的多容器Pod(正在開發中)
Level 1 安全級別以pod、service為級別保護服務網格。它不提供容器內部的任何安全性,例如用於應用容器和sidecar容器之間的通信。
Level 2 安全級別通過使用socket感知BPF程序在socket級別提供分段,在同一個pod中引入容器和進程之間的分段。

- 強制所有應用流量流經sidecar: 通過使用socket感知BPF策略,Cilium可以確保應用程序的所有通信都必須通過sidecar進行入站和出站連接。保證應用程序容器本身不能從pod外部接收連接,或者在不通過sidecar代理的情況下向pod外部發出請求。
- Pod中的最小安全權限:通過使用socket感知BPF程序鎖定容器內部和進程級別的通信,其中一個容器中的安全漏洞不再導致整個容器被泄露。這尤其重要,因為sidecar容器可以直接訪問pod中的任何其他容器,並且可以訪問潛在的敏感信息。
有趣的事實
支持socket的BPF程序不僅限於基於IP的socket。安全策略也可以擴展到涵蓋UNIX域socket。
外部服務的TLS可見性(正在開發中)
Istio依賴於對應用程序協議層(如HTTP)的可見性,以提供諸如基於URI的路由,基於HTTP頭的授權和API請求級別遙測和跟蹤等功能。通過將雙向TLS與Istio Citadel管理的證書相互應用,可以在未加密的服務之間保持應用程序流量並在源服務器和目標服務的sidecar代理之間執行TLS加密來實現此可見性。

這適用於網格內部服務之間的連接。與網格之外的服務的通信幾乎由應用程序本身進行TLS加密保證,以便在不可信的互聯網上保護通信。

Linux的kTLS(內核TLS)工作原理最初是由Facebook的Dave Watson提出。它包括將數據的對稱加密從應用程序中的SSL庫遷移到Linux內核中的socket功能。這項工作的最初動機是純粹的性能優化,因為使用kTLS比SSL庫快3-4%。這對於經過SSL靜態數據的提供者有足夠的興趣去繼續。這項工作已經合併,並且可以在最新的Linux內核中使用。結合在Linux socket層注入的BPF程序的功能,kTLS實現了數據的透明可見性,否則此時已加密。

我們仍在研究這個功能,但有一個初始的功能原型,證明了獲得可見性和控制數據的概念,這些數據通常是在應用程序本身中進行TLS加密的。下一步是將此數據提供給sidecar,以便在與外部服務的連接上釋放Istio。

在沒侵入應用程序的情況下kTLS是如何實現透明化的?
公平地說,應用程序使用的SSL庫必須感知kTLS,並且用戶必須選擇系統級別的行為。在應用程序運行時升級SSL版本和啟動可視化一樣簡單,沒有侵入應用程序。由於可見性是在socket級別獲得的,這也意味着應用程序在排隊後無法再更改此數據。如果數據用於授權請求,則這一點至關重要。
概要
- 增強Istio安全
- pod中最小權限:通過使用socket感知BPF程序鎖定容器內部和進程級別的通信,其中一個容器中的安全漏洞不再導致整個容器被泄露。
- 安全化非IPv4/TCP協議:目前,Istio僅支持TCP和IPv4。任何其他協議(如UDP或IPv6)都將繞過sidecar代理和任何Istio安全規則,Cilium將通過完全阻止這些協議或應用細粒度的安全規則來介入。
- 防止受損的sidecar:sidecar代理本身不受Istio安全規則的約束。受損的sidecar可以不受限制地訪問網絡。它還可以操縱自己的安全規則以變得更加寬鬆。除了Istio之外,Cilium還允許定義服務級別安全策略,並確保受損的邊車代理只能以最小的權限運行。
- 前置應用流量經過sidecar:通過使用socket感知BPF策略,Cilium可以確保應用程序的所有通信都必須通過sidecar進行入站和出站連接。保證應用程序容器本身不能從pod外部接收連接,或者在不通過sidecar代理的情況下向pod外部發出請求。
- 外部服務
- 使用SSL為Istio加密鏈接:與群集外部服務的TCP連接通常是TLS加密的,並且Istio無法檢查此類連接的HTTP頭。通過利用kTLS集成到內核中的BPF,Cilium將能夠提供對TLS加密數據的可見性和控制管理。
- 性能
- 高效網絡:Istio需要一個CNI插件來提供pod之間的網絡連接。Cilium實現了CNI插件接口,並利用BPF在sidecar代理和Istio控制平面之間提供高效的數據路徑。
- socket重定向加速Istio:通過使用socket感知BPF程序在Linux socket級別執行流量重定向,Cilium可以加速流量重定向到sidecar代理。這允許繞過很費事的TCP/IP堆棧遍歷而且對應用程序或sidecar代碼沒有侵入性。