Ok, grazie alle persone che hanno sottolineato il sistema delle capacità e CAP_NET_BIND_SERVICE
capacità. Se si dispone di un kernel recente, è effettivamente possibile utilizzarlo per avviare un servizio come non root ma associare porte basse. La risposta breve è che lo fai:
setcap 'cap_net_bind_service=+ep' /path/to/program
E poi in qualsiasi momento program
viene eseguito successivamente avrà il CAP_NET_BIND_SERVICE
capacità. setcap
è nel pacchetto debian libcap2-bin
.
Ora per gli avvertimenti:
- Sarà necessario almeno un kernel 2.6.24
- Questo non funzionerà se il tuo file è uno script. (vale a dire, usa una riga #! per lanciare un interprete). In questo caso, per quanto ho capito, dovresti applicare la capacità all'eseguibile dell'interprete stesso, il che ovviamente è un incubo per la sicurezza, poiché qualsiasi programma che utilizza quell'interprete avrà la capacità. Non sono riuscito a trovare un modo pulito e semplice per aggirare questo problema.
- Linux disabiliterà LD_LIBRARY_PATH su qualsiasi
program
che ha privilegi elevati comesetcap
osuid
. Quindi se il tuoprogram
utilizza il proprio.../lib/
, potresti dover considerare un'altra opzione come il port forwarding.
Risorse:
- pagina man
- capabilities(7). Leggilo a lungo se hai intenzione di utilizzare le funzionalità in un ambiente di produzione. Ci sono alcuni dettagli davvero complicati su come le capacità vengono ereditate attraverso le chiamate exec() che sono dettagliate qui.
- pagina man di setcap
- "Bind ports below 1024 without root on GNU/Linux":il documento che per primo mi ha indirizzato verso
setcap
.
Nota:RHEL lo ha aggiunto per la prima volta nella v6.
Puoi eseguire un reindirizzamento della porta. Questo è ciò che faccio per un server dei criteri Silverlight in esecuzione su una macchina Linux
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300
Il modo standard è renderli "setuid" in modo che si avviino come root, e poi buttino via quel privilegio di root non appena si sono collegati alla porta ma prima che inizino ad accettare connessioni ad essa. Puoi vedere buoni esempi di ciò nel codice sorgente per Apache e INN. Mi è stato detto che Lighttpd è un altro buon esempio.
Un altro esempio è Postfix, che utilizza più demoni che comunicano tramite pipe, e solo uno o due di essi (che fanno ben poco se non accettare o emettere byte) vengono eseguiti come root e gli altri vengono eseguiti con privilegi inferiori.