Právě teď používám cap_net_bind_service MY_USERNAME
v /etc/security/capability.conf.
Teď už jen potřebuji nastavit cap_net_bind_service+i
na interpretu mého oblíbeného skriptovacího jazyka, abych mohl přidat CAP_NET_BIND_SERVICE
na účinné nastavit přes libcap[-ng].
Funguje to dobře, ale zajímalo by mě, jestli existuje způsob, jak dosáhnout stejné věci bez nastavení jakýchkoli omezení binárnímu interpretu. I když to není velký problém (jiné uživatelské účty nemají omezení, takže jej nemohou používat ani s bitem nastaveným na binárním interpretu), je to poněkud nepříjemné, protože musím znovu nastavit příznak pokaždé, když je interpret aktualizováno.
Přijatá odpověď:
Obvykle se schopnosti dědí na děti. Jak je uvedeno v manuálové stránce:
Dítě vytvořené pomocí fork(2) zdědí kopie sad schopností svého rodiče.
Problém se skripty je, že nejsou přímo spustitelné. Jádro prochází seznamem kontrol (kód jádra se nachází na fs/binfmt_*.c). Jedním z nich je „binfmt_script.c“, který zkontroluje, zda první řádek neobsahuje shebang, a poté zavolá skutečného interpreta (ten v shebang) s vaším skriptem jako argumentem. Jako takový je volán standardní/běžný interpret a jednoduše přečte váš skript jako argument.
To znamená, že budete muset nastavit schopnost na interpretu, ne na skriptu.
Totéž platí pro suid
bity a další speciální příznaky.
Buď si tedy vytvoříte kopii svého tlumočníka, nastavíte na něm požadované schopnosti (také zkontrolujte, že k němu nikdo nemá přístup přes chmod/chown) a zavoláte tento zkopírovaný tlumočník ve svém shebangu.
Můžete také provést setcap logiku ve vašem skriptu.