Comment puis-je suivre le processus actuel?

Est-il possible d’utiliser un frontal sudo (comme gksudo) pour élever les privilèges du processus actuel ? Je sais que je peux faire ce qui suit:

sudo cat /etc/passwd- 

Mais cela m’intéresse:

 sudo-become-root # magic function/command cat /etc/passwd- 

J’écris en Python. Mon utilisateur est que j’ai un programme qui s’exécute en tant qu’utilisateur, mais peut rencontrer des fichiers à lire / écrire qui sont la propriété de la racine. Je voudrais demander un mot de passe, obtenir les privilèges root, faire ce dont j’ai besoin, puis supprimer de nouveau les privilèges.

Je sais que je pourrais séparer la logique d’administration et la logique autre que l’administration en des processus distincts, puis simplement exécuter le processus d’administration en tant que root (avec certaines communications – policykit / dbus conviendrait bien ici). Mais j’espérais une solution beaucoup plus simple (certes plus risquée).

Je pense à quelque chose comme exécuter ppriv de Solaris via sudo pour ensuite modifier les privilèges du processus en cours. Ce qui ressemble à un aller-retour piraté mais réalisable. Mais pour autant que je sache, Linux ne propose pas ppriv.

(Je suis surpris que ce ne soit pas déjà évident; il semble que ce soit une chose inhabituelle et que cela ne semble pas constituer une faille de sécurité pour permettre une escalade en cours plutôt qu’une escalade d’un nouveau processus.)

Malheureusement, je ne sais pas comment faire ce que vous voulez faire proprement. Je pense que votre meilleur pari est de faire le programme setuid (ou de l’exécuter sous sudo), puis de faire votre sale boulot et de supprimer les permissions, ou bien de supprimer les permissions d’un processus et de garder votre racine. .

Ce que vous recherchez, ce sont les appels à setuid (2) / setreuid (2) / setregid (2) / setgroups (2), mais ils sont tous câblés pour ne pas vous permettre de gagner des privilèges en cours d’invocation. Vous ne pouvez les utiliser que pour “donner” des privilèges, à ma connaissance.

Aptitude a une option “devenir racine”. Vous voudrez peut-être voir ce que l’auteur a fait là-bas.

Si vous voulez gérer correctement les droits d’administration dans un programme, vous pouvez utiliser PolicyKit plutôt que sudo, selon le système d’exploitation sur lequel vous souhaitez exécuter votre programme.

Pour PolicyKit pour Python, voir python-slip .

Sinon, il y a deux façons d’appeler sudo pour qu’il devienne root:

 sudo -s 

vous fera rooter et garder votre environnement actuel (équivalent à sudo su )

 sudo -i 

va vous faire rooter et vous donner l’environnement de root (équivalent à sudo su - )

Une autre manière de résoudre le problème consiste à considérer que vous disposez des droits dont vous avez besoin, et à laisser l’utilisateur du programme choisir comment atsortingbuer les droits à votre programme (en utilisant les groupes sudo / setuid / unix / autre).

Voir aussi cette question sur ServerFault sur le même sujet.

Votre fonction / commande magique pourrait être

 sudo su 
 echo 'echo tee; echo hee'|sudo -s 

La sortie est la suivante:

 tee hee 

Je n’aime pas l’idée de pouvoir exécuter des commandes arbitraires en tant que root d’un processus privilégié inférieur. Cependant, comme vous le voulez, l’une des idées qui vous vient à l’esprit est de conserver un shell restreint à setuid qui ne peut exécuter que les commandes qui vous intéressent. Vous pouvez ensuite utiliser les fonctions subprocess.Popen pour exécuter votre commande en utilisant ce shell restreint qui l’exécutera avec des privilèges élevés.

Je me demande si cela fonctionnerait:

Ajoutez un autre groupe à votre système, installez le script en tant que programme racine et faites en sorte que le fichier sudoers contienne une ligne permettant l’exécution du script par ce groupe. Enfin, ajoutez le groupe à la liste des comptes devant exécuter le script.

Ensuite, le script ne peut être exécuté que par root ou par un compte disposant du groupe spécial du groupe après avoir fourni le mot de passe du compte au début.

Voir le manuel Sudo pour d’autres options.

Vous voulez vous authentifier avec PAM. Il y a un exemple ici .