本部落格將介紹BPF和Cilium如何增強Istio的一些細節,主要關注Istio的安全性,開啟Istio對外部服務的支援和效能部分。
譯者:甄中元
稽核:宋淨超
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程式碼沒有侵入性。
如果您有興趣瞭解更多資訊:
ServiceMesher社群資訊
Slack:servicemesher.slack.com 需要邀請才能加入,有志於加入ServiceMesher社群為Service Mesh作出貢獻的同學可以聯絡我。
Twitter: twitter.com/servicemesh…
更多Service Mesh諮詢請掃碼關注微信公眾號ServiceMesher。