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?
-
Kezdeti BPF (klasszikus BPF):
-
Csak hálózati csomagszűrésre alkalmas.
-
Statikus, korlátozott, nem bővíthető funkciók.
-
-
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?
📄 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 programopenat()
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:
- Arch Linux:
https://github.com/archlinux/svntogit-packages/blob/4615bb2493649ad6fa133f864f94cb95c824f361/trunk/config#L9963 - Fedora:
https://fedorapeople.org/cgit/thl/public_git/kernel.git/tree/kernel-x86_64-fedora.config?h=kernel-5.17.0-0.rc5.20220225git53ab78cd6d5a.106.vanilla.1.fc34&id=e661d91eb909e777a9d28425ef50fcc5ef7fa5ed#n3291 - openSUSE:
https://github.com/openSUSE/kernel-source/commit/c2c25b18721866d6211054f542987036ed6e0a50
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