LXC

Exigences

Dépendances matérielles:

Dépendances supplémentaires pour lxc-attach:

Dépendances supplémentaires pour les conteneurs non privilégiés:

Bibliothèques recommandées:

Installation

Dans la plupart des cas, vous trouverez des versions récentes de LXC disponibles pour votre distribution Linux. Soit directement dans le référentiel de packages de la distribution, soit via un canal de backport.

Pour votre première expérience LXC, nous vous recommandons d'utiliser une version récente prise en charge, telle qu'une récente version de correction de bogues de LXC 4.0.

Si vous utilisez Ubuntu, nous vous recommandons d'utiliser Ubuntu 18.04 LTS comme hôte de conteneur. Les versions de correctifs de bogues LXC sont disponibles directement dans le référentiel des packages de distribution peu de temps après la publication et celles-ci offrent une expérience en amont propre (non corrigée).

Ubuntu est également l'une des rares (sinon la seule) distributions Linux à venir par défaut avec tout ce qui est nécessaire pour des conteneurs LXC sûrs et non privilégiés.

Sur un tel système Ubuntu, l'installation de LXC est aussi simple que:

sudo apt-get install lxc

ou

sudo snap install lxd

Votre système aura alors toutes les commandes LXC disponibles, tous ses modèles ainsi que la liaison python3 si vous souhaitez écrire un script LXC.

Créer des conteneurs non privilégiés en tant qu'utilisateur

Les conteneurs non privilégiés sont les conteneurs les plus sûrs. Ceux-ci utilisent une carte d'uid et de gid pour allouer une gamme d'uids et de gids à un conteneur. Cela signifie que l'uid 0 (racine) dans le conteneur est en fait quelque chose comme uid 100000 en dehors du conteneur. Donc, si quelque chose se passe mal et qu'un attaquant parvient à s'échapper du conteneur, il se retrouvera avec autant de droits qu'un utilisateur nul.

Malheureusement, cela signifie également que les opérations courantes suivantes ne sont pas autorisées:

Pour cette raison, la plupart des modèles de distribution ne fonctionneront tout simplement pas avec ceux-ci. Au lieu de cela, vous devez utiliser le modèle de «téléchargement» qui vous fournira des images prédéfinies des distributions qui sont connues pour fonctionner dans un tel environnement.

Maintenant, tout ce qui suit suppose un système Ubuntu récent ou une autre distribution Linux qui offre une expérience similaire (noyau récent, version récente de shadow, cgmanager et allocation par défaut uid / gid).

Tout d'abord, vous devez vous assurer que votre utilisateur a une carte uid et gid définie dans / etc / subuid et / etc / subgid. Sur les systèmes Ubuntu, une allocation par défaut de 65536 uids et gids est donnée à chaque nouvel utilisateur du système, vous devriez donc déjà en avoir un. Sinon, vous devrez utiliser usermod pour vous en donner un.

La prochaine étape est / etc / lxc / lxc-usernet qui est utilisée pour définir le quota de périphériques réseau pour les utilisateurs non privilégiés. Par défaut, votre utilisateur n'est pas autorisé à créer de périphérique réseau sur l'hôte, pour changer cela, ajoutez:

your-username veth lxcbr0 10

Cela signifie que "votre-nom d'utilisateur" est autorisé à créer jusqu'à 10 périphériques veth connectés au pont lxcbr0.

Cela fait, la dernière étape consiste à créer un fichier de configuration LXC.

Ces valeurs doivent correspondre à celles trouvées dans / etc / subuid et / etc / subgid, les valeurs ci-dessus sont celles attendues pour le premier utilisateur sur un système Ubuntu standard.

Juste avant de créer votre premier conteneur, vous devez probablement vous déconnecter et vous reconnecter, ou même redémarrer votre machine pour vous assurer que votre utilisateur est placé dans les bons groupes de contrôle. (Ceci n'est requis que si cgmanager n'a pas été installé sur votre machine avant d'installer LXC.)

Et maintenant, créez votre premier conteneur avec:

lxc-create -t download -n my-container

Le modèle de téléchargement vous montrera une liste de distributions, de versions et d'architectures parmi lesquelles choisir. Un bon exemple serait "ubuntu", "bionic" (18.04 LTS) et "i386".

Quelques secondes plus tard, votre conteneur sera créé et vous pourrez le démarrer avec:

lxc-start -n my-container -d

Vous pouvez ensuite confirmer son statut avec:

lxc-info -n my-container

lxc-ls -f

Et obtenez une coquille à l'intérieur avec:

lxc-attach -n my-container

L'arrêter peut être fait avec:

lxc-stop -n my-container

Et enfin le retirer avec:

llxc-destroy -n my-container

Créer des conteneurs non privilégiés en tant que root

Pour exécuter un conteneur non privilégié à l'échelle du système (c'est-à-dire un conteneur non privilégié démarré par root), vous devrez suivre uniquement un sous-ensemble des étapes ci-dessus.

Plus précisément, vous devez allouer manuellement une plage uid et gid à la racine dans / etc / subuid et / etc / subgid. Et puis définissez cette plage dans /etc/lxc/default.conf en utilisant des entrées lxc.idmap similaires à celles ci-dessus.

Et c'est tout. Root n'a pas besoin de quota de périphériques réseau et utilise le fichier de configuration globale afin que les autres étapes ne s'appliquent pas.

Tout conteneur que vous créez en tant que root à partir de ce moment sera exécuté sans privilège.

Création de conteneurs privilégiés

Les conteneurs privilégiés sont des conteneurs créés par root et s'exécutant en tant que root.

Selon la distribution Linux, ils peuvent être protégés par certaines baisses de capacités, profils d'apparmeur, contexte selinux ou politiques seccomp, mais en fin de compte, les processus s'exécutent toujours en tant que root et vous ne devez donc jamais donner accès à root dans un conteneur privilégié à une partie non fiable.

Si vous devez encore créer des conteneurs privilégiés, c'est assez simple. Ne faites simplement aucune des configurations décrites ci-dessus et LXC créera des conteneurs privilégiés.

Donc:

sudo lxc-create -t download -n privileged-container

Crée un nouveau conteneur privilégié "conteneur privilégié" sur votre système en utilisant une image du modèle de téléchargement.