Tetragon – 盯向內核的眼睛
一. 簡介
1.1
什么是eBPF?
eBPF(extended Berkeley Packet Filters)起源于BPF, 是一套通用執行引擎,提供了直通Linux內核的可編程通用能力。自Linux內核3.18版本后BPF擴展了 Berkeley 數據包過濾器等一系列特性,此后版本被稱為eBPF,而之前的版本則被區分為cBPF。如圖1 所示,由于新特性的加持,eBPF的架構設計得到更新,eBPF也注定在更多場景中發揮更大的價值,同時也由于eBPF比cBPF執行得更快等原因,cBPF在新的內核中也基本被廢棄[1]。

圖1 eBPF架構圖
1.2
eBPF有哪些應用場景?
由于eBPF具備從用戶態到內核級史無前例的深度覆蓋能力,不難想象,其應用領域也將是顛覆性的。關于這方面,官方也大致給出了如圖2所示的4類應用場景[2]:

圖2 eBPF應用場景
1.2.1
安全防護
如利用系統調用過濾并且結合網絡過濾阻斷惡意的調用動作或者丟棄惡意和非預期的流量,這個正好是檢測或防護類產品的本質操作,這些操作直接作用于原對象,無需多余備份,其處理效率是傳統手段很難達到的。正因為如此,綠盟科技創新研究院孵化的創新方案(云原生API網關)在做網絡優化技術實施時也包含這一技術。
1.2.2
調用追蹤
通過創建內核探測或用戶探測可以在內核或用戶應用程序的幾乎任何位置附加 eBPF 程序,結合整體的信息,用戶程序到內核級別的上下文追蹤將不是那么困難。
當然,筆者認為要想做到一個通用的追蹤模型還有一段路程去走,例如Containiq的聯合創始人兼首席技術官Matt Lenhard在一篇分布式追蹤的文章里也描述到他們基于元數據關聯進行追蹤時,盡管在整個Kubernetes 集群中的調用追蹤關聯性很好,但lambda 函數調用相關性追蹤在不改動請求頭的情況下很難關聯等問題[3]。
1.2.3
網絡編排
優化網絡過濾器的內部 BPF 指令集處理是eBPF的最初設計目標,由此可見eBPF在網絡技術中的亮眼地位。Hook在網絡驅動特定位置,優化最佳路徑,加上先天無需包復制即可進行數據包過濾,這對網絡編排具有得天獨厚的優勢。此領域不得不提的是Isovalent公司一手打造出的開源項目-Cilium ,將 eBPF技術融入 Kubernetes,成為云原生的革命性技術。
1.2.4
數據監控
正如官方介紹,基于eBPF的數據監控,不依賴于系統應用的數據,其直指內核,這意味著更加透明和實時的數據審計。
二. 為什么要聊Tetragon ?
第一,Tetragon是一款基于 eBPF技術的運行時安全實施和可觀察性開源工具。多年來一直是 Isovalent Cilium Enterprise的一部分,2022年5月 Tetragon決定將其開源。了解到以上開源背景,相信不少朋友也會和筆者一樣對其多關注一點。
第二,Tetragon 僅做到了可視化和動作執行,留下更多深思的空間。這相當于是“削了皮的土豆”, 從土豆種植到土豆收獲以及清洗削皮有完整的指導,對于接下來是炒土豆絲還是土豆片,亦或是雕花等等完全交給大家去發掘。
三. Tetragon部署
理論上Tetragon 可以部署到任何內核支持BTF的系統內,這里包括虛擬機、容器或K8s集群等方式部署。如圖3所示,在K8s環境中,Tetragon以DaemonSet的方式部署在集群中的每個節點上。通過配置文件看到Tetragon目前是以特權容器方式運行,筆者以為特權運行會增加整個環境的不安全風險,是否有其他更小權限的方案(如SYS_BPF_ADMIN等)值得去實踐和思考。除特殊說明外,本文稍后涉及部署位置的討論均默認在K8s集群內進行。

圖3 K8s環境中Tetragon部署方式
四. Tetragon功能特性
相對于傳統技術,Tetragon基于eBPF提供了如文件、套接字、二進制名稱、命名空間/函數等豐富的過濾器,直接在內核中應用過濾器,不必花銷繁重的上下文切換和喚醒等資源。值得關注的是開源工具本身并沒有內置跟蹤哪些函數和應用哪些過濾器,在目錄中僅提供了部分的場景示例,這為后期的功能擴展和自定義跟蹤提供了較大的靈活性。除此之外Tetragon的兩個主打功能(可視化和實時執行)也是值得繼續發掘和延伸的。
4.1
可視化
基于eBPF技術Tetragon 很容易對內核子系統進行觀測,包括文件系統訪問、網絡數據訪問,以及系統調用層的事件。如圖4所示[4], Tetragon可以做到對集群感知,也就是說針對集群內的活動上下文事件將體現集群特性,例如命名空間和 pod。看到此處,筆者不禁聯想到此技術在集群安全取證產品上也會有無限的發揮空間。

圖4 K8s環境中Tetragon 的監控數據
對于可視化來說,如圖5所示,Tetragon 中通過網絡過濾和運行時過濾的聯合,對于特定的單體對象(如文件、函數等)很容易展示出其上下文的關聯。Isovalent官方博客中描述其是“智能的”,不可否認,對于單個數據鏈可視化的深度來說,上下文的信息是比較豐富的,但離智能似乎還有一段路要走。筆者認為,如何將整個系統中無數的調用鏈進行關聯,以形成“血管網絡圖譜”、如何對調用鏈路的分類乃至異常特征的自動標注,以達到異常調用鏈路聯想的效果,這是走向“智能”的一條道路。

圖5 某橫向移動可視化
Tetragon借助eBPF技術可以做到對網絡、運行時、敏感文件以及云原生生態鏈組件信息等進行檢測,這充分體現了eBPF的強大之處,但正因為如此,應用eBPF技術到攻擊面將是更加可怕的,正如美團信息安全團隊所表達的憂慮[5],Tetragon也是使用eBPF的相關接口,如果環境已經有惡意程序對eBPF的結果進行偽裝,那么以上所有的可視化上下文將無法發現問題。借用其羅列的取證思路,提前結合系統層和用戶態的信息進行比對將是一種最直接的解決方法。這里筆者還想到的是:在eBPF用戶空間程序層利用第三方可信組件(注意這里不使eBPF本身變復雜)提供簽名驗證(如結合類似Sigstore + In-toto保證供應鏈組件的調用來源可信+調用內容可信),以此保證加載程序的合法性來避免此類的攻擊是否是一種較好的解決思路呢?
4.2
實時執行
如圖6所示[6],Tetragon支持來自多層級的安全策略機制,如通過用戶層、CRD和JSON API 等第三方應用層或 OPA等系統層注入安全策略,當然也可以在內核層預制規則。當策略被觸發時,實時對下一步操作做出響應,如攔截等。而這些響應動作直接在內核中對事件做出反應,而不是將事件發送到用戶空間代理,這極大地縮短了上下游的響應鏈。

圖6 Tetragon策略架構
Tetragon提供基于多層的策略抽象代理,面向用戶態的操作者可以輕松地定義規則配置,達到從上至下的實時管控效果。需要注意的是,這也面臨同樣的問題,如果環境已經被惡意利用eBPF技術攻擊, 那Tetragon的實時執行結果將可能是被篡改的。
五. 總結
由于筆者本身對eBPF攻擊和防御技術的認識有限,本文僅依托開源組件Tetragon對eBPF技術做一些淺簡的思考,如有不妥之處,觀點僅代表筆者本人,同時也歡迎有興趣的同學后臺聯系我們一起交流學習,更多深層次的eBPF技術剖析后期將會由此方向的研究同學進行分享。