Déposer Les Permissions Root En Python
J'aimerais avoir un programme en Python commencer à écouter sur le port 80, mais après que les exécuter sans les permissions root. Est-il un moyen de chute de racine ou pour obtenir le port 80 sans elle?
- stackoverflow.com/questions/413807/...
- Sur moderne Linux vous avez seulement besoin de la capacité de CAP_NET_BIND_SERVICE to bind to port 80, vous N'avez PAS besoin d'être root, pas même au démarrage de l'application. Capacités est une norme POSIX, 1003.1 e, qui est un partitionnement de la toute puissante les privilèges de root dans un ensemble de privilèges distincts. Voir: python-cap-ng Et /sbin/setcap, /sbin/getcap (ce sont les équivalents des chmod setuid, et ls –l)
- Pour Python2 et peut-être d'autres interprètes, acquérir des capacités est la partie que vous voulez être prudent avec -- libcap-ng peut lettrines, mais il ne veut pas leur accorder. Cette réponse à la question Ian référencé est un moyen assez sûr pour vous prodiguer un cap à un moment pour des projets spécifiques: stackoverflow.com/a/21895123/1724577
InformationsquelleAutor Jeremy Banks | 2010-04-23
Vous devez vous connecter pour publier un commentaire.
Vous ne serez pas en mesure d'ouvrir un serveur sur le port 80 sans les privilèges de root, c'est une restriction au niveau de l'OS. Donc, la seule solution est de supprimer les privilèges de root après avoir ouvert le port.
Voici une solution possible à abandonner les privilèges de root en Python: Abandon des privilèges en Python. C'est une bonne solution en général, mais vous devrez aussi ajouter
os.setgroups([])
à la fonction afin de s'assurer que le groupe d'appartenance de l'utilisateur root n'est pas conservé.J'ai copié et nettoyer un peu le code, et retiré de la journalisation et les gestionnaires d'exception, donc il est laissé à vous de gérer
OSError
correctement (il sera générée lorsque le processus n'est pas autorisé à passer son effectif UID ou GID):/root
et pas/home/uid_name
, et que uid_name de ne pas être en mesure de faire quelque chose avec~/
, qui sera ensuite l'étendre à/root/
. Cela peut affecter les modules tels que matplotlib qui stocker des données de configuration dans le répertoire d'ACCUEIL.authbind
semble être la bonne façon de gérer ce problème.Je recommande d'utiliser
authbind
pour démarrer votre programme en Python, de sorte qu'aucun de il a à exécuter en tant que root.https://en.wikipedia.org/wiki/Authbind
authbind
- goo.gl/fxFde6 - Remplacer NodeJS avec ce que vous voulez (ex: python)/etc/authbind/byport/80
.Ce n'est pas une bonne idée de demander à l'utilisateur de saisir son nom d'utilisateur et de groupe à chaque fois que j'ai besoin d'abandonner ses privilèges. Voici une version légèrement modifiée de Tamás du code qui va abandonner ses privilèges et de passer à l'utilisateur qui a lancé la commande sudo. Je suis en supposant que vous utilisez sudo (si non, utilisez Tamás du code).
SUDO_USER=someone
mais c'est un hack. Il est beaucoup plus fréquent pour les démons pour lancer en tant que root, ne le privilège de travail dont ils ont besoin pour mettre les choses en place, puis goutte à "personne" ou un utilisateur spécifié par l'intermédiaire de leur configuration pour leur emploi de jour.systemd peut faire pour vous, si vous commencez votre programme via systemd, systemd peut main de la déjà ouverte socket d'écoute à elle, et il peut également activer votre programme lors de la première connexion. et vous n'avez même pas besoin de daemonize il.
Si vous allez aller avec la version autonome de l'approche, vous avez besoin de la capacité de CAP_NET_BIND_SERVICE (vérifier les capacités de l'homme page). Cela peut être fait sur un programme par programme avec le bon outil en ligne de commande, ou faire part de votre demande (1) être suid root (2) (3) écouter le port (4) la suppression des privilèges et des capacités immédiatement.
Rappelez-vous que suid root programmes venu avec beaucoup de considérations de sécurité (propre et sécurisé environnement, umask, les privilèges, les rlimits, toutes ces choses sont des choses que votre programme est nécessaire de configurer correctement). Si vous pouvez utiliser quelque chose comme systemd, le tout pour mieux ensuite.
La plupart de ce travail, sauf si vous avez besoin de demander la prise après quelques autres trucs que vous ne voulez pas être super-utilisateur.
J'ai fait un projet appelé tradesocket il y a un moment. Il vous permet de passer en arrière de sockets sur un système posix entre les processus. Ce que je fais est spin-off d'un processus au début qui reste de super-utilisateur, et le reste du processus descend dans les autorisations et les demandes de la prise de l'autre.
Voici une nouvelle adaptation de Tamás réponse, avec les modifications suivantes:
python-prctl
module à goutte Linux capacités à une liste de capacités à préserver.sudo
).HOME
.(Je suis relativement nouveau à l'aide de cette fonctionnalité, cependant, j'ai peut-être raté quelque chose. Il pourrait ne pas fonctionner sur les anciens noyaux (<3.8) ou les grains avec le système de fichiers capacités désactivé.)
Il peut être utilisé comme suit: