eBPF
/ ee-bee-PEE-eff /
eBPF 是一項技術,讓你能安全地在作業系統核心內部執行小型的自訂程式,而不必改寫核心或重開機。一般而言核心程式碼是神聖不可侵犯的——那裡的一個錯誤可能毀掉一切,所以你不能隨意注入自己的程式。eBPF 就像給一位受信任的訪客一個位於引擎室深處、上鎖且受監管的沙盒:他們可以把一支事先檢查過的小程式掛到選定的位置,觀看發生了什麼、甚至塑造行為,但可被證明絕不會四處亂走、弄壞東西。
它的運作方式,是把一個小巧的虛擬機器與一個驗證器結合起來。你寫一支小程式(常用來觀察事件),在核心願意執行它之前,一個核心內的驗證器會靜態檢查該程式是安全的:它不能無限迴圈、不能讀取任意記憶體,並且一定會終止。唯有通過檢查,它才被允許掛到一個掛鉤上——一個網路封包抵達、一次系統呼叫被發出、一個函式被進入、一個追蹤點被觸發——並在那精確的時刻執行,把資料記入使用者空間工具可讀取的共享映射(map)。最早的 BPF 只過濾網路封包;擴充版的 BPF(eBPF)把它推廣為用於追蹤、效能分析、網路與安全政策的安全可程式化。現代的追蹤工具、快速網路與負載平衡,以及執行期安全監視器,愈來愈多建立在它之上。
誠實的定位是:eBPF 體現了一個前沿觀念——讓核心可程式化、可擴充,同時靠驗證而非靠信任來保持安全。那份安全是真實的,但有其界限——它保證程式不會讓核心當機或卡死、會待在自己的沙盒內,但不保證你寫的東西正確,也不保證它不增加開銷。而且 eBPF 是刻意受限的(無無界迴圈、運算受限),正是為了讓驗證器能證明它安全;它是一種受約束、可檢查的語言,而非在核心裡執行任意程式碼的途徑。
想找出哪些行程開啟最多檔案,你把一支小巧的 eBPF 程式掛到 open 系統呼叫上。每當任何程式呼叫 open,你的程式碼就在核心中執行,並在一個以行程名稱為鍵的共享映射裡把計數器加一。一個使用者空間工具讀取該映射,印出最嚴重的幾名——全程不改核心、幾乎沒有開銷。
一支經驗證的迷你程式在核心內部、安全地、於該事件的確切時刻執行。
「經驗證為安全」不代表「正確」。驗證器保證一支 eBPF 程式不會讓核心當機或卡死、會待在沙盒內——但無法保證你的邏輯正確,也無法保證程式不增加可量測的成本。