Non esiste un modo per un processo senza privilegi (Python o altro) di elevare i propri privilegi. È una specie di pietra angolare per avere tutta questa cosa tra utenti privilegiati e non privilegiati. Per quanto riguarda i raw socket, dalla pagina di manuale raw(7):
Solo i processi con un ID utente effettivo pari a 0 o la funzionalità CAP_NET_RAW possono aprire socket raw.
L'ID utente 0 indica root. Vedi qui per informazioni sui raw socket su Linux.
Come sottolineato nella risposta / nei commenti di Faust, non sarai in grado di impostare direttamente la funzionalità CAP_NET_RAW per il tuo programma Python, poiché si tratta di uno script che viene eseguito dall'interprete Python, ma potrebbero esserci soluzioni sul Web che possono aggirare questa limitazione.
Come hai notato, i raw socket richiedono privilegi più elevati rispetto a quelli di un utente normale. Puoi aggirare questo problema in due modi:
- Attivando il bit SUID per il file con un comando come
chmod +s file
e imposta il suo proprietario suroot
conchown root.root file
. Questo eseguirà il tuo script come root, indipendentemente dall'utente effettivo che lo ha eseguito. Ovviamente questo potrebbe essere pericoloso se il tuo script ha qualche difetto. - Impostazione della funzionalità CAP_NET_RAW sul file specificato con un comando come
setcap cap_net_raw+ep file
. Questo gli darà solo i privilegi richiesti per aprire un raw socket e nient'altro.
MODIFICA:
Come sottolineato da @Netch, le soluzioni fornite non funzioneranno con nessun linguaggio interpretato (come Python). Avrai bisogno di qualche "hack" per farlo funzionare. Prova a cercare su Google per "Python SUID", dovresti trovare qualcosa.