GNU/Linux >> Tutoriels Linux >  >> Linux

Un moyen fiable d'emprisonner les processus enfants à l'aide de `nsenter:` ?

Je sais que les espaces de noms Linux, entre autres choses, peuvent être exploités pour gérer la restriction et l'emprisonnement des processus enfants en toute sécurité sans aucune chance qu'ils soient zombies et vidé sur init . Mais je suis flou sur les détails de mise en œuvre. Comment puis-je utiliser les outils fournis par util-linux comme mount et nsenter surveiller, surveiller et s'assurer que tous les processus lancés sont les descendants directs de l'espace de noms d'un autre processus ?

Réponse acceptée :

Créer un espace de noms PID

La commande correcte à utiliser ici est unshare . Notez que les options nécessaires pour ce faire ne sont disponibles qu'à partir de util-linux 2.23 . L'idée est de créer un nouvel espace de noms PID pour le programme que vous exécutez de sorte que tous ses enfants soient également créés dans cet espace de noms. Vous pouvez exécuter une commande dans un nouvel espace de noms PID simplement en faisant :

sudo unshare -fp some_command

Pour exécuter un shell, omettez simplement la commande. Cela créera un processus qui, avec n'importe lequel de ses enfants, aura un PID comme d'habitude dans l'espace de noms parent (système). Cependant, dans le nouvel espace de noms, il aura un PID de 1 ainsi que certaines des caractéristiques spéciales de init processus. La caractéristique la plus pertinente du point de vue de la surveillance est peut-être que si l'un de ses descendants est orphelin, il sera re-parenté à ce processus plutôt qu'au vrai init processus.

Cela peut être suffisant pour la plupart des cas de surveillance. Comme mentionné précédemment, les processus au sein de l'espace de noms ont tous des PID dans l'espace de noms parent, de sorte que des commandes régulières peuvent être utilisées pour surveiller leur activité. Nous sommes également assurés que si un processus de l'espace de noms devient orphelin, il ne tombera pas des branches de l'arborescence des processus sous le PID du programme de niveau supérieur, ce qui signifie qu'il peut toujours être facilement suivi.

Combiner avec un espace de noms de montage

Cependant, ce que nous ne pouvons pas faire, c'est surveiller le processus par rapport au PID qu'il pense c'est a. Pour cela, et notamment pour pouvoir utiliser le ps commande dans le nouvel espace de noms, vous devez monter un procfs séparé système de fichiers pour l'espace de noms. Cela conduit à son tour à un autre problème puisque le seul emplacement que ps accepte pour procfs est /proc . Une solution serait de créer un chroot jail et montez le nouveau procfs là. Mais il s'agit d'une approche fastidieuse car au minimum, nous aurions besoin de copier (ou au moins de créer un lien physique) tous les fichiers binaires que nous avons l'intention d'utiliser avec toutes les bibliothèques dont ils dépendent vers la nouvelle racine.

En relation :Comment supprimer de manière récursive les autorisations d'exécution des fichiers sans toucher aux dossiers ?

La solution consiste également à utiliser un nouvel espace de noms de montage . Dans ce cadre, nous pouvons monter le nouveau procfs d'une manière qui utilise la vraie racine /proc répertoire, peut être utilisé dans l'espace de noms PID et n'interfère avec rien d'autre. Pour rendre ce processus très simple, le unshare la commande donne le --mount-proc choix :

sudo unshare -fp --mount-proc some_command

Exécute maintenant ps dans les espaces de noms combinés affichera uniquement les processus avec l'espace de noms PID et il affichera le processus de niveau supérieur comme ayant un PID de 1 .

Qu'en est-il de nsenter ?

Comme son nom l'indique, nsenter peut être utilisé pour entrer un espace de noms qui a déjà été créé avec unshare . Ceci est utile si nous voulons obtenir des informations uniquement disponibles à l'intérieur de l'espace de noms à partir d'un script autrement sans rapport. Le moyen le plus simple est d'accéder au PID de tout programme exécuté dans l'espace de noms. Pour être clair, cela doit être le PID du programme cible dans l'espace de noms à partir duquel nsenter est en cours d'exécution (puisque les espaces de noms peuvent être imbriqués, il est possible qu'un même processus ait plusieurs PID). Pour exécuter un shell dans l'espace de noms PID/montage cible, faites simplement :

sudo nsenter -t $PID -m -p

Si cet espace de noms est configuré comme ci-dessus, ps listera désormais uniquement les processus au sein de cet espace de noms.


Linux
  1. Pourquoi le Pgid des processus enfants n'est-il pas le PID du parent ?

  2. Linux - Comment répertorier les espaces de noms sous Linux ?

  3. Empêcher Sigint d'atteindre les processus enfants ?

  4. Comment trouver tous les processus enfants ?

  5. Quel est le moyen le plus simple de SSH en utilisant Python ?

Comment trouver un nom de processus à l'aide d'un numéro PID sous Linux

Construire un conteneur à la main à l'aide d'espaces de noms :l'espace de noms de montage

Exécutez des processus d'arrière-plan sous Linux à l'aide de la commande Screen

Processus UNIX / Linux :fonction C fork()

Un moyen efficace de trouver task_struct par pid

Liste de tous les processus en cours d'exécution sur le serveur à l'aide de PHP