Nemrég megnéztem, hogy hol tart az eweOS fejlesztés és láttam, hogy immáron BPF enabled az új kernel, illetve a régi is és egy kis kitekintés után az Arch, Fedra, OpenSUSE és sok egyéb disztró is kapcsolgatja ezt a bizonyos funkciót, ami egy kezdőnek okozhat némi fejtörést.

Gondoltam készítek egy kis összefoglalót a témában.

🛡️ Tehát mi az az LSM?

Az LSM (Linux Security Modules) egy keretrendszer a Linux kernelben, amely lehetővé teszi, hogy különféle biztonsági modulok közvetlenül a kernel döntéshozatali folyamataiba kapcsolódjanak be, pl.:

  • fájl hozzáférés

  • hálózati kapcsolatok

  • processzek létrehozása

  • jogosultságok ellenőrzése

🧩 Mi az LSM hook?

Egy LSM hook egy olyan pont a kernelben (általában egy függvényhívás), ahol egy LSM modul „be tud szólni”, és például azt mondhatja:

„Ez a folyamat nem nyithatja meg ezt a fájlt!” vagy
„Ez a socket kapcsolat tiltott!”

🔧 Példák LSM hook-okra:

Hook neve Mire vonatkozik
inode_permission Ellenőrzi, hogy egy fájl elérhető-e az adott művelethez (olvasás, írás)
task_create Új folyamat indításának engedélyezése vagy tiltása
socket_connect Engedélyezheti vagy megtagadhatja egy hálózati kapcsolat létrehozását
bpf eBPF programok betöltésének ellenőrzése

📦 Milyen LSM-ek használják ezeket?

  • SELinux: MAC-alapú (Mandatory Access Control) rendszer, policy alapon dönt.

  • AppArmor: Profile -alapú, egyszerűbb, de szintén LSM hook -okon keresztül működik.

  • Landlock: Újabb, eBPF -szerű sandboxoló rendszer.

  • BPF-based LSM: Új lehetőség az LSM hook-okat eBPF programmal kezelni (pl. saját biztonsági policy kódolása futásidőben).

🛡️ Mi a BPF?

A BPF (Berkeley Packet Filter) eredetileg egy mechanizmus volt, amit a UNIX rendszerekben fejlesztettek ki a hálózati csomagok szűrésére – például arra, hogy a tcpdump csak az adott port vagy IP cím forgalmát figyelje.

A BPF célja az volt, hogy hatékonyan és biztonságosan szűrje a hálózati forgalmat a kernel szintjén, mielőtt az bekerülne a felhasználói térbe – ez csökkentette a terhelést és növelte a teljesítményt.

Honnan jött és hogyan fejlődött?

  1. Kezdeti BPF (klasszikus BPF):

    • Csak hálózati csomagszűrésre alkalmas.

    • Statikus, korlátozott, nem bővíthető funkciók.

  2. eBPF (extended BPF):

    • A Linux kernel továbbfejlesztette a BPF-et egy általános célú, sandboxolt virtuális géppé.

    • Most már nemcsak hálózathoz, hanem teljesítményelemzéshez, biztonsághoz, nyomkövetéshez stb. is használható.

Hogyan működik?

  • A BPF programokat bytecode formájában a kernelbe töltheted.

  • Ezeket a verifikátor ellenőrzi: nem lehet végtelen ciklus, memóriasértés stb.

  • A program egy hook ponthoz kapcsolódik (pl. rendszerhívás, hálózati esemény).

  • A kernel ezután futtatja a BPF programot, amikor az adott esemény megtörténik.

BPF típus Funkció Állapot
Klasszikus BPF Hálózati csomagszűrés Elavult / korlátozott
eBPF Általános célú programok kernel szintű futtatása Modern, aktívan használt

🛡️ Mi az eBPF?

Az eBPF (extended Berkeley Packet Filter) egy fejlett technológia a Linux kernelben, amely lehetővé teszi, hogy felhasználói térből származó kis programokat futtassunk biztonságosan és hatékonyan a kernel térben — anélkül, hogy kernel modult kellene írni vagy újraindítani a rendszert.

Lényegében az eBPF egy sandboxolt virtuális gép a kernelben.

Mire használják az eBPF-et?

  1. Teljesítményelemzés (performance profiling):
    Eszközök, mint a bcc vagy bpftrace lehetővé teszik valós idejű információk gyűjtését a rendszer működéséről anélkül, hogy jelentősen lelassítanák azt.

  2. Hálózati szűrés és monitoring:
    Az eBPF segítségével hatékony, testreszabható tűzfalak (pl. Cilium) és forgalomelemző rendszerek hozhatók létre.

  3. Biztonsági szabályok érvényesítése:
    Futás közben figyelhetjük, hogy egy folyamat milyen rendszerhívásokat végez (például auditálás, sandboxing).

  4. Programozható obszervabilitás:
    Például meghatározhatjuk, milyen eseményeket figyeljünk meg egy alkalmazásban (fájlműveletek, CPU-használat stb.).

Működési elv:

  • Egy eBPF programot C vagy egy magasabb szintű nyelv segítségével írunk.

  • Ez a program a kernelhez egy adott hook ponthoz (pl. rendszerhívás, hálózati esemény) kapcsolódik.

  • A kernel egy verifikátoron keresztül ellenőrzi, hogy a kód biztonságos (nem csinál végtelen ciklust, nem ír memóriát jogosulatlanul stb.).

  • Ha rendben van, a program bekerül és fut a megfelelő eseménynél.

Példa:

Egy egyszerű eBPF program figyelheti, hogy egy adott folyamat milyen fájlokat nyit meg, és naplózhatja ezeket.

Nézzünk meg egy egyszerű eBPF példát, ami figyeli, hogy egy program milyen fájlokat nyit meg a rendszeren. Ehhez a bpftrace nevű eszközt fogjuk használni, ami egy magas szintű nyelvet biztosít az eBPF programokhoz (hasonló a awk vagy dtrace stílusához).

🛠️ Előkészületek

Először is győződj meg róla, hogy a rendszereden elérhető a bpftrace. Debian/Ubuntu alatt:

sudo apt install bpftrace

📄 Példa: fájlmegnyitások naplózása

A következő bpftrace szkript figyeli a openat rendszerhívást, és kiírja, hogy ki (PID) milyen fájlt nyit meg:

sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("PID %d opened file: %s\n", pid, str(args->filename)); }'

🔍 Mit csinál ez a szkript?

  • tracepoint:syscalls:sys_enter_openat: ez a Linux kernel egy tracepointja, ami akkor aktiválódik, amikor egy program openat() rendszerhívást indít — ez történik minden fájlmegnyitáskor.

  • args->filename: tartalmazza a megnyitni kívánt fájl nevét.

  • pid: az éppen futó folyamat azonosítója.

  • printf(...): kiírja az információt a terminálra.

Lehetőség van egy eBPF programot C-ben megírni és betölteni libbpf vagy bcc segítségével — ez bár mélyebb téma, de nagyobb szabadságot ad.

A BPF hivatalos kernel dokumentáció a legújabb kernelben:
https://www.kernel.org/doc/html/latest/bpf/index.html

Az LSM a kernel doksiban: https://docs.kernel.org/security/lsm.html

GRUB kernel opció a kernel sorban – példa az engedélyezésre:

GRUB_CMDLINE_LINUX="lsm=lockdown,capability,bpf"

Egy kis tutorial kezdőknek:
https://eunomia.dev/tutorials/19-lsm-connect/

EweOS progress report:
https://os.ewe.moe/blog/202503-progress-report

Implementációk:

 


Továbbra is várunk mindenkit nagy szeretettel csevegő oldalunkon élőben:
https://skamilinux.hu/chat/

Aktív fórum témák:
https://skamilinux.hu/phpBB3/search.php?search_id=active_topics