sala@home:~$

getcap + setcap

A fényképezőgépvezérlő programomban ( pkTriggerCord ) elég alacsony szinten kommunikálok a fényképezőgéppel, ioctl és scsi_generic segítségével lényegében direkt módon érem el a device fájlt ( pl. /dev/sdc ). Egy ideje feltűnt, hogy hiába tűnik úgy hogy van írási és olvasási jogom is /dev/sdc-hez, mégis csak akkor működik a program ha rootként futtatom.

Némi utánaolvasás után rájöttem (valahogy ez eddig nekem kimaradt), hogy egy ideje Linuxban is igen részletesen lehet szabályozni, hogy egy process milyen jogokkal bír, vagyis ha csak egyetlen speciális jogra van szükségünk, akkor nem kell root-ként ( vagy setuid rootként ) futtatni a programot, elég ezt az egyetlen jogot megadni. A jogok listáját itt nézhetjük meg.

Mint kiderült, nekem a CAP_SYS_RAWIO jog kell:

$ getcap pktriggercord-cli
$ setcap CAP_SYS_RAWIO+eip pktriggercord-cli
 $ getcap pktriggercord-cli
 pktriggercord-cli = cap_sys_rawio+eip

Vagyis először lekérdezve látszik, hogy a programnak nincs semmilyen különleges joga, majd miután beállítjuk a CAP_SYS_RAWIO-t a lekérdezés után már látszik a jog. Ezután már nem kell rootként futtatnom a programomat.

  1. megjegyzés: A legtöbb helyen azt írják, a CAP_SYS_RAWIO olyan erős jogosultság, hogy ennyi erővel akár rootként is lehetne futtatni a programot, az sem lenne sokkal nagyobb biztonsági rés.

  2. megjegyzés: Elég alattomos mellékhatás, hogy nem igazán látszik, hogy egy programnak valami különleges jogosultsága van. A setuid bitet mondjuk sokan felismerik, de az alap ls -l nem ír ki semmit amiből látszik a különleges jog. Szerencsére a színes ls piros színnel jelzi ezt.