No hay forma de que un proceso sin privilegios (Python u otro) eleve sus propios privilegios. Es una especie de piedra angular de tener todo este asunto de usuarios privilegiados/no privilegiados. Con respecto a los sockets sin formato, desde la página del manual raw(7):
Solo los procesos con una identificación de usuario efectiva de 0 o la capacidad CAP_NET_RAW pueden abrir sockets sin formato.
ID de usuario de 0 significa raíz. Consulte aquí para obtener información sobre sockets sin procesar en Linux.
Como se señaló en la respuesta / comentarios de Faust, no podrá configurar directamente la capacidad CAP_NET_RAW para su programa python, debido a que es un script que ejecuta el intérprete de Python, pero puede haber soluciones en la web que pueden superar esta limitación.
Como notó, los sockets sin procesar requieren privilegios más altos que los que tiene un usuario normal. Puede evitar este problema de dos maneras:
- Activar el bit SUID para el archivo con un comando como
chmod +s file
y establece su propietario enroot
conchown root.root file
. Esto ejecutará su script como root, independientemente del usuario efectivo que lo ejecutó. Por supuesto, esto podría ser peligroso si su script tiene algún defecto. - Configurar la capacidad CAP_NET_RAW en el archivo dado con un comando como
setcap cap_net_raw+ep file
. Esto le otorgará solo los privilegios necesarios para abrir un socket sin formato y nada más.
EDITAR:
Como señaló @Netch, las soluciones dadas no funcionarán con ningún lenguaje interpretado (como Python). Necesitarás algún "truco" para que funcione. Intenta buscar en Google para "Python SUID", debería encontrar algo.