2016-12-03 4 views
0

Est-il possible d'exécuter une méthode en tant qu'utilisateur différent sous Linux (ou SELinux spécifiquement)? Les programmes que j'ai exécutés dans des sandbox individuels, chacun avec un identifiant d'utilisateur et de processus différent. J'ai une situation dans laquelle je dois exécuter une branche de code en tant qu'utilisateur différent et avec un identifiant de processus différent pour empêcher l'accès de la mémoire et de l'espace disque du code qui l'engendre.Est-il possible d'exécuter une branche en tant qu'utilisateur différent dans * nix?

Si ce n'est pas possible, pouvez-vous jeter un peu de lumière sur la quantité de code du noyau qui doit être modifiée pour y parvenir? (Je comprends son aspect subjectif, mais si vous pouvez suggérer quoi et comment y aller, cela sera très utile).

Répondre

0

Protéger certaines ressources des autres codes s'exécutant sur la même machine est précisément ce qui a conduit au processus et à l'invention UID. Si vous recherchez un mécanisme qui ressemble à un simple appel de fonction, je dirais que c'est impossible car cela nécessite que la mémoire soit partagée entre l'appelant et l'appelé. Cependant, l'utilisation de fork/exec (ou des wrappers comme system()) vous donnera une certaine isolation tant que vous manipulez les paramètres/résultats en utilisant des objets système comme paramètres du programme ou des tuyaux. Bien que le fait que l'utilisateur * nix soit destiné à protéger les processus les uns des autres, il est nécessaire qu'une relation explicite soit établie entre deux utilisateurs pour qu'un utilisateur agisse au nom de l'autre.

En fait, vous pouvez:

  • définir une politique de sudoers qui donne le droit à votre premier utilisateur à exécuter une commande (ou une commande particulière) comme le second.
  • utilisez popen() (ou system()) dans votre premier programme pour appeler le code moins privilégié.
  • le cas échéant, transmettre les paramètres et analyser le résultat de stdout

En supplément, vous pouvez utiliser le même binaire pour les deux exécutions, de cette façon, tout le code peut être au même endroit.