In questo momento sto usando cap_net_bind_service MY_USERNAME
in /etc/security/capability.conf.
Ora devo solo impostare cap_net_bind_service+i
sull'interprete del mio linguaggio di scripting preferito per poter aggiungere CAP_NET_BIND_SERVICE
all'efficace impostato tramite libcap[-ng].
Funziona bene, ma mi chiedo se c'è un modo per ottenere la stessa cosa senza impostare alcun limite sul binario dell'interprete. Anche se non è un grosso problema (altri account utente non hanno il limite quindi non possono usarlo anche con il bit impostato sul binario dell'interprete) è alquanto fastidioso poiché devo reimpostare il flag ogni volta che l'interprete è aggiornato.
Risposta accettata:
Di solito, le capacità vengono ereditate dai bambini. Come indicato nella manpage :
Un figlio creato tramite fork(2) eredita copie dei set di capacità del genitore.
Il problema con gli script è che non sono direttamente eseguibili. Il kernel passa attraverso un elenco di controlli (il codice del kernel si trova in fs/binfmt_*.c). Uno di questi è "binfmt_script.c", che controlla la prima riga per uno shebang, quindi chiama il vero interprete (quello nello shebang) con il tuo script come argomento. In quanto tale, viene chiamato l'interprete standard/comune e legge semplicemente il tuo script come un argomento.
Ciò significa che dovrai impostare la funzionalità sull'interprete, non sullo script.
Lo stesso vale per suid
bit e altri flag speciali.
Quindi o fai una copia del tuo interprete, imposta le funzionalità che desideri su di esso (controlla anche che nessuno possa accedervi tramite chmod/chown) e chiami questo interprete copiato nel tuo shebang.
Puoi anche eseguire setcap logica nel tuo script.