Projekt bpftime vyvíjí implementaci eBPF v uživatelském prostoru

Je představen projekt bpftime, který vyvíjí runtime a virtuální stroj pro spouštění obslužných rutin eBPF v uživatelském prostoru. Bpftime umožňuje eBPF trasování a programy pro zásah do procesů běžet zcela v uživatelském prostoru s využitím funkcí, jako je uprobe a programové zachycování systémových hovorů. Je třeba poznamenat, že odstraněním zbytečných přepínání kontextu může bpftime dosáhnout desetinásobného snížení režie ve srovnání s používáním funkcí uprobe a uretprobe poskytovaných linuxovým jádrem. Kromě toho bpftime výrazně zjednodušuje ladění, může být potenciálně použit na systémech bez linuxového jádra a nevyžaduje zvýšená oprávnění potřebná k načtení aplikace eBPF do jádra. Kód projektu je napsán v C/C++ a je distribuován pod licencí MIT.

Zachycování systémových volání a integrace kontrol uprobe je realizována pomocí techniky přepisování spustitelného kódu (binary rewriting), ve které jsou volání systémových volání, vstupních bodů a lokálních funkcí nahrazena přechodem na ladicí obslužné programy prostřednictvím úpravy strojového kódu spouštěcí aplikace, což je mnohem efektivnější než organizování zachycení pomocí uprobe na úrovni jádra Linuxu.

Podporovány jsou operace nahrazení nebo změny funkcí, připojení handlerů (háčků) a filtrů, přesměrování, blokování nebo nahrazení parametrů systémového volání, zachycení vstupních a výstupních bodů funkcí a také nahrazení handleru na libovolném offsetu v kódu. Bpftime lze připojit k jakémukoli běžícímu procesu v systému, aniž by bylo nutné jej restartovat nebo znovu sestavit. Náhrada bpftime do procesů může být provedena pro běžící procesy přes ptrace a pro načítání přes LD_PRELOAD.

Jako součást bpftime se vyvíjí běhové prostředí, které umožňuje připojit programy eBPF k systémovým voláním a trasovacím bodům uprobe; virtuální stroj eBPF s JIT pro izolované provádění programů eBPF na úrovni uživatelského procesu (dodatečně je podporována kompilace AOT); proces na pozadí pro interakci s jádrem a organizování kompatibility se subsystémem uprobe jádra (bpftime podporuje režim načítání eBPF do uživatelského prostoru z jádra pro organizaci spolupráce s programy eBPF v jádře, používá se například pro zpracování kprobe nebo nastavení síťových filtrů).

Virtuální stroj eBPF je navržen jako zásuvná knihovna a poskytuje API podobné ubpf, což umožňuje jeho použití k integraci funkčnosti eBPF do jiných projektů. Pro souhrnnou agregaci dat z několika procesů je podporováno vytváření společných eBPF map umístěných ve sdílené paměti. Spolu s bpftime lze použít standardní handlery eBPF napsané pro použití v jádře a pro sestavení lze použít standardní nástroje na bázi clang a libbpf.

Pomocí bpftime lze v uživatelském prostoru spouštět sledovací systémy, jako je BCC, bpftrace a Deepflow. Ukázali jsme například použití skriptu sslsniff z rámce BCC k analýze a ukládání šifrovaného provozu v nginx. V provedených testech se výkon nginx sníží o 58 % při provádění sslsniff na straně jádra a o 12.3 % při přesunu handleru do uživatelského prostoru.

Architektura trasování procesů využívající původní eBPF v jádře:

Projekt bpftime vyvíjí implementaci eBPF v uživatelském prostoru

Architektura sledování uživatelského prostoru pomocí bpftime:

Projekt bpftime vyvíjí implementaci eBPF v uživatelském prostoru

Hybridní režim, ve kterém bpftime spolupracuje s eBPF v jádře, například při instalaci síťových filtrů nebo přesunu jednotlivých handlerů do uživatelského prostoru:

Projekt bpftime vyvíjí implementaci eBPF v uživatelském prostoru

Budoucí plány zahrnují: schopnost nahradit výjimky (Fault Injection); hot patching (Hot Patching) pro změnu logiky provozu nebo opravu chyb v binárních sestavách; vytvoření modulu pro Nginx, který umožňuje vytvářet rozšíření pomocí programů eBPF (například pro dynamický výběr trasy, ukládání do mezipaměti, aplikaci bezpečnostních politik a vyrovnávání zátěže); rozšíření možností subsystému FUSE (například vytvoření rozšíření FS pro cachování nebo řízení přístupu v podobě programů eBPF).

Zdroj: opennet.ru

Přidat komentář