使用Cilium加強Istio—經過Socket感知BPF程序

本博客將介紹BPF和Cilium如何加強Istio的一些細節,主要關注Istio的安全性,開啓Istio對外部服務的支持和性能部分。linux

原文地址:cilium.io/blog/2018/0… git

譯者:甄中元github

審覈:宋淨超安全

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社區信息

社區官網:www.servicemesher.com

Slack:servicemesher.slack.com 須要邀請才能加入,有志於加入ServiceMesher社區爲Service Mesh做出貢獻的同窗能夠聯繫我。

Twitter: twitter.com/servicemesh…

更多Service Mesh諮詢請掃碼關注微信公衆號ServiceMesher。

相關文章
相關標籤/搜索