Il n'existe aucun moyen pour un processus non privilégié (Python ou autre) d'élever ses propres privilèges. C'est en quelque sorte la pierre angulaire d'avoir tout ce truc d'utilisateurs privilégiés/non privilégiés. En ce qui concerne les sockets raw, à partir de la page de manuel raw(7) :
Seuls les processus avec un ID utilisateur effectif de 0 ou la capacité CAP_NET_RAW sont autorisés à ouvrir des sockets bruts.
L'ID utilisateur de 0 signifie root. Voir ici pour plus d'informations sur les sockets bruts sous Linux.
Comme indiqué dans la réponse/les commentaires de Faust, vous ne pourrez pas définir directement la capacité CAP_NET_RAW pour votre programme python, car il s'agit d'un script exécuté par l'interpréteur Python, mais il peut y avoir des solutions sur le Web qui peuvent contourner cette limitation.
Comme vous l'avez noté, les sockets bruts nécessitent des privilèges plus élevés qu'un utilisateur ordinaire. Vous pouvez contourner ce problème de deux manières :
- Activer le bit SUID pour le fichier avec une commande comme
chmod +s file
et définissez son propriétaire surroot
avecchown root.root file
. Cela exécutera votre script en tant que root, quel que soit l'utilisateur effectif qui l'a exécuté. Bien sûr, cela pourrait être dangereux si votre script a un défaut. - Définir la capacité CAP_NET_RAW sur le fichier donné avec une commande telle que
setcap cap_net_raw+ep file
. Cela lui donnera uniquement les privilèges requis pour ouvrir un socket brut et rien d'autre.
MODIFIER :
Comme l'a souligné @Netch, les solutions données ne fonctionneront avec aucun langage interprété (comme Python). Vous aurez besoin d'un "hack" pour le faire fonctionner. Essayez de googler pour "Python SUID", vous devriez trouver quelque chose.