eBPF 技術已成為現代系統設計與網路安全中不可或缺的組成部分。本文從 eBPF 的安全機制切入,探討其如何透過安全 HOOK 保護核心物件,並深入解析不同 BPF 程式型別、地圖型別和相關函式,例如 bpf_map_lookup_elem
、bpf_map_delete_element
等。同時,本文也介紹了 BCC、BPFTool、BPFTrace 等工具,幫助開發者更好地利用 eBPF。最後,透過 Sysdig 和 Flowmill 的實際應用案例,展示 eBPF 在網路監控和可觀察性方面的優勢,以及如何利用 eBPF 提升系統效能和安全性。
3. security_bpf_prog
當核心傳回一個eBPF程式的檔案描述符時,此HOOK會被觸發,進行安全檢查,以確保只有具有適當許可權的程式才能存取eBPF程式。
4. security_bpf_map_alloc
此HOOK負責初始化對映中的安全欄位,確保對映的安全性。
5. security_bpf_map_free
此HOOK負責清除對映中的安全欄位,確保對映的安全性。
6. security_bpf_prog_alloc
此HOOK負責初始化eBPF程式中的安全欄位,確保程式的安全性。
7. security_bpf_prog_free
此HOOK負責清除eBPF程式中的安全欄位,確保程式的安全性。
這些安全HOOK的設計宗旨是提供對eBPF物件的個別保護,以確保只有具有適當許可權的程式才能執行對映和程式相關的操作。這樣可以有效地防止未經授權的存取和操作,提高eBPF的安全性。
內容解密:
以上所述的安全HOOK是eBPF安全機制的重要組成部分,它們透過對eBPF系統呼叫、對映和程式進行安全檢查和初始化、清除安全欄位等方式,確保eBPF的安全性。開發人員可以透過這些HOOK來實作自定義的安全檢查和控制,進一步提高eBPF的安全性。
flowchart TD A[security_bpf] --> B[security_bpf_map] B --> C[security_bpf_prog] C --> D[security_bpf_map_alloc] D --> E[security_bpf_map_free] E --> F[security_bpf_prog_alloc] F --> G[security_bpf_prog_free]
圖表翻譯:
上述Mermaid圖表展示了eBPF安全HOOK之間的邏輯關係。首先,security_bpf
HOOK會被觸發,然後根據不同的情況,會分別觸發 security_bpf_map
和 security_bpf_prog
HOOK。這兩個HOOK會分別對對映和程式進行安全檢查。接下來,會觸發 security_bpf_map_alloc
和 security_bpf_prog_alloc
HOOK,初始化對映和程式中的安全欄位。最後,會觸發 security_bpf_map_free
和 security_bpf_prog_free
HOOK,清除對映和程式中的安全欄位。這個過程確保了eBPF物件的安全性。
實際應用案例
在實施新技術時,首要考慮的是其實際應用案例。因此,我們存取了一些最令人興奮的 BPF 專案的創作者,分享他們的想法。
Sysdig eBPF 神模式
Sysdig 公司在 2017 年開始使用 eBPF,當時的 Linux 核心版本是 4.11。Sysdig 原本使用核心模組來提取和處理核心資料,但隨著使用者基數增加和更多公司開始實驗,公司認識到這是一個限制因素。因此,Sysdig 決定使用 eBPF 程式來實作相同的功能。這樣不僅可以擺脫核心模組的限制,也可以利用 eBPF 的其他功能,例如使用使用者空間探測器(user probes)來附加 eBPF 程式到特定的執行點。
Sysdig 的 eBPF 架構如圖 9-1 所示。核心實作是一組自定義的 eBPF 程式,負責核心儀表化。這些程式使用最近版本的 Clang 和 LLVM 編譯,將高階 C 程式碼轉換為 eBPF bytecode。每個執行點都有一個對應的 eBPF 程式,目前已經附加到以下靜態追蹤點:
- 系統呼叫入口路徑
- 系統呼叫出口路徑
- 程式內容切換
- 程式終止
- 小頁錯誤和大頁錯誤
- 程式訊號傳遞
每個程式都會接收執行點資料(例如系統呼叫引數),並開始處理。處理過程取決於系統呼叫型別。對於簡單的系統呼叫,引數會被複製到一個 eBPF 地圖中,用於臨時儲存,直到整個事件框架形成。對於更複雜的呼叫,eBPF 程式包含邏輯來轉換或增強引數,使得 Sysdig 應用程式可以完全利用這些資料。
Flowmill
Flowmill 是一個觀察性啟動公司,源自一個學術研究專案 Flowtune,由 Jonathan Perry 長官。Flowtune 研究如何在擁塞的資料中心網路中有效地排程個別封包。Flowmill 最終改編了這項技術,以觀察、彙總和分析分散式應用程式中每個元件之間的連線,以提供服務之間互動作用的準確檢視、識別流量率、錯誤或延遲中 статистически 顯著的變化。
Flowmill 使用 eBPF 核心探測器來追蹤每個開啟的 socket 並定期捕捉作業系統計量。這是一個複雜的過程,因為需要同時儀表化新的連線和已經開啟的連線。此外,還必須處理現有的連線和新的連線。
網路監控與可觀察性:eBPF 的應用
在網路監控和可觀察性方面,eBPF 提供了一種高效且強大的工具,讓開發者能夠深入瞭解系統的行為和效能。透過使用 eBPF,開發者可以收集到關於網路流量、連線、通訊端等的詳細資訊,從而實作對系統的全面監控和分析。
Flowmill 的 eBPF 實踐
Flowmill 是一家使用 eBPF 技術來實作網路監控和可觀察性的公司。它們的方法是透過在核心中插入 eBPF 程式,來收集網路流量和連線的相關資料。這些資料可以用來計算各種指標,例如網路吞吐量、延遲、封包丟失率等。
Flowmill 的 eBPF 實踐包括以下幾個方面:
- 通訊端監控:Flowmill 使用 eBPF 來監控通訊端的建立、連線、斷開等事件。這些事件可以用來計算通訊端的使用率、連線數量等指標。
- 網路流量監控:Flowmill 使用 eBPF 來監控網路流量,包括 TCP 和 UDP 流量。這些資料可以用來計算網路吞吐量、延遲、封包丟失率等指標。
- 容器監控:Flowmill 使用 eBPF 來監控容器的網路流量和連線。這些資料可以用來計算容器的網路使用率、連線數量等指標。
eBPF 的優勢
eBPF 有以下幾個優勢:
- 高效:eBPF 可以在核心中執行,從而避免了使用者空間和核心空間之間的切換,提高了效率。
- 靈活:eBPF 可以用於各種不同的場景,包括網路監控、安全性、效能最佳化等。
- 可擴充套件:eBPF 可以輕鬆地擴充套件到多核處理器和大規模的系統中。
BPF 概述
BPF(Berkeley Packet Filter)是一種 Linux 核心中的架構,最初用於封包過濾,後來演變成了一種強大的程式設計介面,允許開發人員在核心空間中執行自定義程式。BPF 的歷史可以追溯到 1992 年,其主要目的是提供一個高效的方式來過濾和處理網路封包。
BPF 程式型別
BPF 提供了多種不同的程式型別,包括:
- Socket Filter:這是最早的 BPF 程式型別,用於過濾網路封包。
- Kprobe:這種程式型別允許開發人員在核心函式中插入探針,從而可以監視和分析內核的行為。
- Tracepoint:這種程式型別提供了一種方法,允許開發人員在特定的核心事件發生時執行自定義程式。
- XDP:這種程式型別允許開發人員在網路介面卡(NIC)上執行自定義程式,以實作高效的封包處理。
BPF 工具和技術
BPF 提供了多種工具和技術來支援開發人員的工作,包括:
- BPF Compiler Collection (BCC):這是一套工具集合,提供了多種 BPF 相關工具,包括編譯器、偵錯程式和分析工具。
- BPFTool:這是一個命令列工具,提供了多種功能,包括顯示 BTF 資訊、檢視 BPF 地圖和檢視 BPF 程式。
- BPFTrace:這是一個高階的追蹤工具,允許開發人員使用簡單的語言定義追蹤任務,並在核心中執行它們。
BPF 實際應用
BPF 在多種領域中有著廣泛的應用,包括:
- 網路安全:BPF 可以用於實作網路入侵檢測系統、防火牆和其他安全相關功能。
- 效能最佳化:BPF 可以用於監視和分析系統的效能瓶頸,從而幫助開發人員最佳化系統的效能。
- 雲端計算:BPF 可以用於實作雲端計算中的網路功能虛擬化和安全功能。
BPF 未來發展
隨著技術的不斷發展,BPF 的應用領域將會不斷擴大,包括:
- 人工智慧:BPF 可以用於實作人工智慧相關功能,例如機器學習和深度學習。
- 物聯網:BPF 可以用於實作物聯網中的網路功能和安全功能。
- 邊緣計算:BPF 可以用於實作邊緣計算中的網路功能和安全功能。
圖表翻譯:
graph LR A[BPF] -->|實作|> B[網路安全] A -->|實作|> C[效能最佳化] A -->|實作|> D[雲端計算] A -->|實作|> E[人工智慧] A -->|實作|> F[物聯網] A -->|實作|> G[邊緣計算]
內容解密:
以上內容介紹了 BPF 的概述、程式型別、工具和技術,以及其實際應用和未來發展。BPF 是一個強大的程式設計介面,允許開發人員在核心空間中執行自定義程式,其應用領域包括網路安全、效能最佳化、雲端計算等。隨著技術的不斷發展,BPF 的應用領域將會不斷擴大。
BPF 程式設計中的地圖和查詢功能
在 BPF(Berkeley Packet Filter)程式設計中,地圖(map)是一種重要的資料結構,允許您儲存和查詢資料。這篇文章將介紹 BPF 中的地圖和查詢功能,包括 bpf_map_create
、bpf_map_lookup_elem
、bpf_map_delete_element
等。
BPF 地圖型別
BPF 提供了多種地圖型別,包括:
BPF_MAP_TYPE_ARRAY
:陣列地圖,適合儲存固定大小的資料。BPF_MAP_TYPE_ARRAY_OF_MAPS
:地圖陣列,允許您儲存多個地圖。BPF_MAP_TYPE_CGROUP_STORAGE
:cgroup 儲存地圖,適合儲存 cgroup 相關資料。BPF_MAP_TYPE_CPUMAP
:CPU 地圖,允許您儲存 CPU 相關資料。
BPF 地圖操作
BPF 提供了多種地圖操作函式,包括:
bpf_map_create
:建立一個新的地圖。bpf_map_lookup_elem
:查詢地圖中的元素。bpf_map_delete_element
:刪除地圖中的元素。bpf_map_lookup_and_delete
:查詢並刪除地圖中的元素。
bpf_map_lookup_elem 函式
bpf_map_lookup_elem
函式允許您查詢地圖中的元素。它的原型如下:
int bpf_map_lookup_elem(void *map, void *key, void *value);
其中,map
是地圖指標,key
是鍵值,value
是值指標。
bpf_map_delete_element 函式
bpf_map_delete_element
函式允許您刪除地圖中的元素。它的原型如下:
int bpf_map_delete_element(void *map, void *key);
其中,map
是地圖指標,key
是鍵值。
bpf_map_lookup_and_delete 函式
bpf_map_lookup_and_delete
函式允許您查詢並刪除地圖中的元素。它的原型如下:
int bpf_map_lookup_and_delete(void *map, void *key, void *value);
其中,map
是地圖指標,key
是鍵值,value
是值指標。
圖表翻譯:
graph LR A[建立地圖] -->|bpf_map_create|> B[查詢元素] B -->|bpf_map_lookup_elem|> C[刪除元素] C -->|bpf_map_delete_element|> D[查詢並刪除] D -->|bpf_map_lookup_and_delete|> E[結束]
這個流程圖展示了 BPF 中的地圖操作流程,從建立地圖到查詢並刪除元素。
BPF 地圖型別概覽
在 Linux 中,BPF(Berkeley Packet Filter)提供了一種強大的方法來擴充套件和自定義核心行為。BPF 地圖(BPF Maps)是 BPF 程式中的一個關鍵元件,允許資料在使用者空間和核心空間之間進行交換。不同的 BPF 地圖型別提供了各種不同的功能和用途。
BPF 地圖型別列表
以下是部分 BPF 地圖型別及其對應的編號:
- BPF_MAP_TYPE_DEVMAP: 編號 39
- BPF_MAP_TYPE_HASH: 編號 33
- BPF_MAP_TYPE_HASH_OF_MAPS: 編號 39
- BPF_MAP_TYPE_LPM_TRIE: 編號 38
- BPF_MAP_TYPE_LRU_HASH: 編號 38
- BPF_MAP_TYPE_LRU_PERCPU_HASH: 編號 38
- BPF_MAP_TYPE_PERCPU_ARRAY: 編號 37
- BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: 編號 40
- BPF_MAP_TYPE_PERCPU_HASH: 編號 37
- BPF_MAP_TYPE_PERF_EVENT_ARRAY: 編號 36
- BPF_MAP_TYPE_PROG_ARRAY: 編號 34
- BPF_MAP_TYPE_QUEUE: 編號 41
- BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: 編號 41
- BPF_MAP_TYPE_SOCKHASH: 編號 40
- BPF_MAP_TYPE_SOCKMAP: 編號 40
每種地圖型別的用途
- BPF_MAP_TYPE_DEVMAP: 用於網路卡裝置對映。
- BPF_MAP_TYPE_HASH: 一種基本的雜湊表對映,適合快速查詢和儲存資料。
- BPF_MAP_TYPE_HASH_OF_MAPS: 一種雜湊表的雜湊表,允許更複雜的資料結構。
- BPF_MAP_TYPE_LPM_TRIE: 最長字首匹配 Trie,適用於路由查詢等場景。
- BPF_MAP_TYPE_LRU_HASH 和 BPF_MAP_TYPE_LRU_PERCPU_HASH: Least Recently Used (LRU) 雜湊表,提供快取機制。
- BPF_MAP_TYPE_PERCPU_ARRAY 和 BPF_MAP_TYPE_PERCPU_HASH: 每 CPU 的陣列和雜湊表,最佳化多 CPU 環境下的效能。
- BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: 每 CPU 的 cgroup 儲存,適用於控制群組的資源管理。
- BPF_MAP_TYPE_PERF_EVENT_ARRAY: 效能事件陣列,用於收集系統效能資料。
- BPF_MAP_TYPE_PROG_ARRAY: 程式陣列,允許動態載入和執行 BPF 程式。
- BPF_MAP_TYPE_QUEUE: 佇列對映,實作先進先出(FIFO)的資料處理。
- BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: 可重複使用的埠 socket 陣列,適用於負載平衡和網路程式設計。
- BPF_MAP_TYPE_SOCKHASH 和 BPF_MAP_TYPE_SOCKMAP: socket 雜湊表和對映,用於網路通訊端的管理。
每種 BPF 地圖型別都有其特定的用途和優點,可以根據具體的應用需求選擇合適的型別來實作高效的資料處理和系統擴充套件。
BPF 程式設計與相關函式
在 BPF(Berkeley Packet Filter)程式設計中,瞭解不同型別的對映(map)及其應用是非常重要的。以下將介紹幾種常見的對映型別和相關函式。
BPF_MAP_TYPE_STACK
BPF_MAP_TYPE_STACK
是一種堆積疊對映型別,用於儲存和管理堆積疊幀(stack frames)。這種對映型別的編號為 42。
BPF_MAP_TYPE_STACK_TRACE
BPF_MAP_TYPE_STACK_TRACE
是一種堆積疊追蹤對映型別,用於記錄和分析程式的執行堆積疊。這種對映型別的編號為 37 和 63。
BPF_MAP_TYPE_XSKMAP
BPF_MAP_TYPE_XSKMAP
是一種 XSK 對映型別,用於管理 XDP(Express Data Path)通訊端。這種對映型別的編號為 40。
bpf_map_update_elem 函式
bpf_map_update_elem
函式用於更新對映元素。它可以與 BPF_F_LOCK
旗標一起使用,以實作對對映的鎖定和解鎖操作。例如,在使用佇列對映(queue maps)時,可以使用 BPF_F_LOCK
旗標來鎖定對映,以確保執行緒安全。
BPF_OBJ_GET 命令
BPF_OBJ_GET
命令用於取得 BPF 物件的檔案描述符。
BPF_PERF_OUTPUT 宏
BPF_PERF_OUTPUT
宏用於輸出效能資料。
BPF_PIN_FD 命令
BPF_PIN_FD
命令用於針對 BPF 物件的檔案描述符進行 pin 操作。
BPF_PROG_TEST_RUN 命令
BPF_PROG_TEST_RUN
命令用於測試執行 BPF 程式。
BPF_PROG_TYPE_SOCKET_FILTER 型別
BPF_PROG_TYPE_SOCKET_FILTER
型別用於通訊端過濾器程式。它的編號為 92,通常用於通訊端過濾和封包處理。
BPF_PROG_TYPE_XDP 型別
BPF_PROG_TYPE_XDP
型別用於 XDP 程式。XDP 是一種高效能的網路處理框架,用於實作高效的封包處理和轉發。
bpf_redirect_map 函式
bpf_redirect_map
函式用於重定向對映。
bpf_spin_lock 函式
bpf_spin_lock
函式用於鎖定 spin 鎖。
bpf_spin_unlock 函式
bpf_spin_unlock
函式用於解鎖 spin 鎖。
BPF_STACK_TRACE 宏
BPF_STACK_TRACE
宏用於記錄堆積疊追蹤資訊。
BPF_STMT 和 BPF_JUMP 宏
BPF_STMT
和 BPF_JUMP
宏用於定義 BPF 指令和跳轉陳述式。這些宏是用於構建 BPF 程式的基本單元。
透過瞭解和使用這些函式和宏,開發人員可以建立高效和功能豐富的 BPF 程式,實作網路封包處理、安全監控和效能最佳化等功能。
BPF 相關技術與應用
從技術架構視角來看,eBPF 從最初的封包過濾功能演進至今,已成為一個功能強大且應用廣泛的核心技術。本文深入探討了 eBPF 的安全機制、實際應用案例、網路監控與可觀察性、程式設計中的地圖和查詢功能、以及相關的技術與應用。eBPF 提供了多種程式型別和工具,例如 kprobe、tracepoint、XDP,以及 BCC 和 BPFTool 等,讓開發者能夠在核心空間執行自定義程式,實作網路安全、效能最佳化、雲端計算等多種功能。然而,eBPF 的程式設計也存在一定的挑戰,例如需要深入理解核心機制和 BPF 程式設計模型。對於重視系統效能和安全性的企業,eBPF 提供了創新的解決方案,值得深入研究和應用。技術團隊應著重於掌握 eBPF 程式設計的核心概念和技巧,才能充分釋放其潛力。隨著技術的持續發展,預計 eBPF 將在更多領域發揮關鍵作用,例如人工智慧、物聯網和邊緣計算等。