cap_net_raw - avagy mezei juzer es a tcpdump

Sziasztok!
Nyers ethernet programozassal kapcs problema: fejleszteshez jo lenne, hogyha egy adott juzer is letre tudjon hozni PF_PACKET osztalyu socket-eket. Kerdes, hogy az ehhez szukseges CAP_NET_RAW `capatiblity`-t hogyan es/vagy hol kell tarsitani a megf. felhasznalohoz? Mondjuk bele'p a juzer, es onnantol kezdve neki ilyene ugy van...
szerk: igen, mindezt linux (debian) alatt, gondolom konfig-szinten ez elegge rendszer-specifikus.
koszonettel, A.

Hozzászólások

Én csak RBAC rendszerek (Grsecurity, RSBAC, LIDS) esetén tudom a lehetőségét, hogy ezeket szabályozni lehet. Az átlagos unix userland nem tudom milyen lehetőséget ad erre.

Esetleg ez érdekes lehet.

Üdv:
Dw.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Esetleg ez érdekes lehet.
Igen, teljesen jogos, igy is meg lehet fogalmazni a problemat: ``mit kell beallitani ahhoz hogy egy adott mezei juzer is tudja futtatni a

tcpdump

-ot?''

Az persze hatarozottan jo lenne hogy ne kelljen hozza (semmi extra, se setuid-os, se semmilyen) progit inditani, hanem maga a login-folyamat tarsitja ezt hozza. vagy ha pid-hez is tarsithato es orokolheto, akkor egy setuid-os bash_profile is teljesen jo. barmi csak menjen :]

Van egy olyan, hogy "pam_cap" modul. Ennek nézz utána szerintem. Nem tudok róla többet sajnos, mert egyszer kellett majdnem, és csak a neve maradt meg. Hasonlít a pam_limits-hez, szal az /etc/security alatt valami fileban tudsz capabilityket osztani userekhez/csoportokhoz.

Igen, ez felig sikerult is. Tehat a getpcaps latja is, hogy a juzerem altal inditott processznek (shell) van cap_net_raw+i (inherit) capability-je. viszont valamiert ki kell adni ezt a varazs-parancsot, hogy


setcap cap_net_raw+ei /ez/a/program/amit/inditok

es csak akkor mukodik. igy viszont a fejlesztes kicsit macerasabb, mert ha ujraforditom a programot, akkor ez a capability amit a setcap beallit, elveszik. ujra root, stb, ami meg faraszto, pont ezt akarnank elkerulni...

de ezt nem ertem teljesen. ha a processznek van egy inheritalodo capability-je, akkor miert kell kulon me'g file-szinten is megmondani, hogy ez menjen, az meg ne...?

Itt találtam, szerintem ez okozhatja a jelenséget amit írsz:

"Files have capabilities. Conceptually they have the same three bitmaps that processes have, but to avoid confusion we call them by other names. Only executable files have capabilities, libraries on't have capabilities (yet). The three sets are called the allowed set, the forced set, and the effective set.

The allowed set indicates what capabilities the executable is allowed to receive from an execing process. This means that during exec(), the capabilities of the old process are first masked against a set which indicates what the process gives away (the inheritable set of the process), and then they are masked against a set which indicates what capabilities the new process image is allowed to receive (the allowed set of the executable)."

Hm, lehet hogy ez a file-rendszer szintu dolog megkerulhetetlen...?

The inheritable capabilities are the capabilities of the current process that should be inherited by a program executed by the current process. The permitted set of a process is masked against the inheritable set during exec(). Nothing special happens during fork() or clone(). Child processes and threads are given an exact copy of the capabilities of the parent process.

Alapesetben szerintem nem kerülhető meg.

Viszont azt a függvényt ami ezt intézi az LSM jó esetben exportálja (tipp: bprm_secure_exec (???)), amit a security modulok overrideolhatnak. Azaz: meg kéne nézni, hogy a különböző security modulok (SELinux, AppArmor, LIDS, TOMOYO, SMACK, stb.) és nem LSM-en keresztüli RBAC rendszerek esetén figyeli-e a file alapú capabilityket.

Annyit megnéztem, hogy alapból Ubuntun a getcap az /usr/sbin/tcpdumpra üres stringgel tér vissza, azaz elvben itt nincs magán a fileon capability állítva, csak az apparmor profilban, szóval elképzelhetőnek tartom, hogy pl AppArmort (vagy más security rendszert) használva megoldhatóvá válik a problémád ...

getcap az /usr/sbin/tcpdumpra üres stringgel tér vissza, azaz elvben itt nincs magán a fileon capability állítva
azert jo hogy nem minden juzer tudja futtani a tcpdump-ot :]

egyebkent ebben az esetben a rendszer egyszeruen setuid-ozza a progit, oszt annyi. lasd pl:

ping

. ott is kell nyilvan cap_net_raw, oszt azokat az opciokat amiket a mezei juzer azert megsem annyira jo hogyha bevet (lasd pl flood ping), azokat egyszeruen kezzel ellenorzi.