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.
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.