Agence web » Actualités du digital » Que sont les espaces de noms Linux et à quoi servent-ils?

Que sont les espaces de noms Linux et à quoi servent-ils?

que-sont-les-espaces-de-noms-linux-et-a-quoi-6024573

Les espaces de noms Linux sont la technologie sous-jacente des technologies de conteneurs comme Docker. Il s’agit d’une fonctionnalité du noyau Linux qui permet au système de restreindre les ressources que voient les processus conteneurisés et qui garantit qu’aucun d’entre eux ne peut interférer avec un autre.

Que sont les espaces de noms?

Lorsque vous exécutez de nombreux processus et applications différents sur un seul serveur, comme c'est le cas avec des outils de déploiement tels que Kubernetes, il est important que chaque processus soit isolé, principalement pour la sécurité.

Un conteneur ne devrait pas être en mesure de prendre le contrôle des ressources d’un autre, car si ce conteneur est alors compromis, il pourrait compromettre l’ensemble du système. Cette méthode d'attaque est similaire au fonctionnement du bogue CPU Meltdown; les différents threads d'un processeur doivent être isolés les uns des autres. De même, les processus exécutés sur différents systèmes virtuels (conteneurs) doivent être isolés des autres conteneurs.

Les espaces de noms réalisent cet isolement au niveau du noyau. Semblable au fonctionnement du chroot de l'application, qui emprisonne un processus dans un répertoire racine différent, les espaces de noms séparent les autres aspects du système. Il existe sept espaces de noms disponibles:

  • Monter, ou mnt. Très similaire à chroot, l'espace de noms Mount partitionne virtuellement le système de fichiers. Les processus exécutés dans des espaces de noms de montage séparés ne peuvent pas accéder aux fichiers en dehors de leur point de montage. Comme cela se fait au niveau du noyau, c'est beaucoup plus sûr que de changer le répertoire racine avec chroot.
  • Processus, ou pid. Sous Linux, les premiers processus apparaissent en tant qu'enfants de PID 1, qui forme la racine de l'arborescence des processus. L'espace de noms de processus coupe une branche de l'arborescence PID et n'autorise pas l'accès plus haut dans la branche. Les processus dans les espaces de noms enfants auront en fait plusieurs PID – le premier représentant le PID global utilisé par le système principal, et le deuxième PID représentant le PID dans l'arborescence des processus enfants, qui redémarrera à partir de 1.
  • Communication interprocessus, ou ipc. Cet espace de noms contrôle si les processus peuvent ou non communiquer directement entre eux.
  • Réseau, ou net. Cet espace de noms gère les périphériques réseau qu'un processus peut voir. Cependant, cela ne configure rien automatiquement pour vous. Vous devrez toujours créer des périphériques réseau virtuels et gérer la connexion entre les interfaces réseau globales et les interfaces réseau enfants. Un logiciel de conteneurisation comme Docker a déjà compris cela et peut gérer le réseau pour vous.
  • Utilisateur. Cet espace de noms permet aux processus d'avoir une «racine virtuelle» dans leur propre espace de noms, sans avoir un accès root réel au système parent. Il partitionne également les informations UID et GID, de sorte que les espaces de noms enfants peuvent avoir leurs propres configurations utilisateur.
  • UTS. Cet espace de noms contrôle les informations de nom d'hôte et de domaine et permet aux processus de penser qu'ils s'exécutent sur des serveurs nommés différemment.
  • Groupe C est une autre fonctionnalité du noyau très similaire aux espaces de noms. Les groupes de contrôle permettent au système de définir des limites de ressources (CPU, mémoire, espace disque, trafic réseau, etc.) pour un groupe de processus. Il s'agit d'une fonctionnalité utile pour les applications conteneurisées, mais elle ne fait aucun type d '«isolation des informations» comme le feraient les espaces de noms. le espace de noms cgroup est une chose distincte, et contrôle uniquement les groupes de contrôle qu'un processus peut voir, et ne l'affecte pas à un groupe de contrôle spécifique.

Par défaut, tout processus que vous exécutez utilise les espaces de noms globaux, et la plupart des processus de votre système le font également, sauf indication contraire.

Utilisation des espaces de noms

Vous pouvez utiliser le lsns commande (ls-namespaces) pour afficher les espaces de noms actuels de votre système. Cette commande doit être exécutée en tant que root, sinon la liste peut être incomplète.

1599084553_989_que-sont-les-espaces-de-noms-linux-et-a-quoi-1833279

Ci-dessus est le lsns sortie d'une nouvelle installation Ubuntu. Chaque espace de noms est répertorié à côté de l'ID de processus, de l'utilisateur et de la commande qui l'ont créé. Les sept espaces de noms sont nés de /sbin/init avec PID 1 sont les sept espaces de noms globaux. Les seuls autres espaces de noms sont mnt espaces de noms pour les démons système, ainsi que le service Livepatch de Canonical.

Si vous travailliez avec des conteneurs, cette liste serait beaucoup plus longue. Vous pouvez générer cette liste au format JSON avec le -J flag, que vous pouvez utiliser beaucoup plus facilement avec un langage de script.

Vous pouvez modifier votre espace de noms actuel avec le nsenter utilitaire. Cette commande vous permet «d'entrer» l'espace de noms d'un autre processus, généralement à des fins de débogage. Il peut en fait exécuter n'importe quelle commande dans cet espace de noms, mais par défaut, il tente simplement de charger un shell (/bin/bash généralement).

Vous spécifiez un ID de processus, puis chaque espace de noms que vous souhaitez saisir:

sudo nsenter -t PID --mount --net --pid  //etc.

Par exemple, en essayant d'entrer l'espace de noms de montage pour kdevtmpfs vous chargera dans cet espace de noms, mais échouera par la suite car il ne peut pas trouver /bin/bash, ce qui signifie en fait que cela a fonctionné, car le répertoire racine apparent a été modifié.

1599084553_332_que-sont-les-espaces-de-noms-linux-et-a-quoi-1644359

Si votre enfant mnt espace de noms inclus /bin/bash, vous pouvez y entrer et charger un shell. Cela peut être fait manuellement mais doit être effectué via des montages de liaison, qui peuvent manipuler l'arborescence de répertoires et lier des fichiers à travers mnt espaces de noms. Cela peut conduire à des cas d'utilisation intéressants, comme faire en sorte que deux processus lisent des contenus différents à partir du même fichier.

Pour créer de nouveaux espaces de noms, vous devez dériver d'un espace existant (généralement global) et spécifier les espaces de noms que vous souhaitez modifier. Ceci est fait avec le unshare commande, qui exécute une commande avec un nouvel espace de noms «non partagé» à partir du maître.

Pour annuler le partage de l'espace de noms du nom d'hôte, utilisez:

sudo unshare -u command

Si la commande est laissée vide, unshare exécute bash par défaut. Cela crée un nouvel espace de noms qui apparaîtra dans lsnsSortie de:

1599084553_502_que-sont-les-espaces-de-noms-linux-et-a-quoi-4921701

Le multiplexeur terminal screen est utilisé ici pour que bash continue à fonctionner en arrière-plan, sinon l'espace de noms disparaîtrait à la fermeture du processus.

À moins que vous ne fassiez de la programmation de très bas niveau, vous n'aurez probablement pas à toucher vous-même aux espaces de noms. Les programmes de conteneurisation comme Docker gèreront les détails pour vous, et dans la plupart des cas où vous avez besoin d'isolement de processus, vous devez simplement utiliser un outil existant. Il est cependant important de comprendre comment les espaces de noms fonctionnent dans le contexte de la conteneurisation, en particulier si vous effectuez une configuration de bas niveau de vos conteneurs Docker ou si vous devez effectuer un débogage manuel.

★★★★★