logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
doc:autres:vm:lxc:mode-utilisateur [09/12/2015 14:49]
captnfab créée
doc:autres:vm:lxc:mode-utilisateur [22/12/2015 18:38]
cemoi [Préparation]
Ligne 6: Ligne 6:
   * Suivi : {{tag>​en-chantier à-tester}}   * Suivi : {{tag>​en-chantier à-tester}}
     * Création par [[user>​captnfab]] 09/12/2015     * Création par [[user>​captnfab]] 09/12/2015
-    * Testé par <​...> ​le <...> FIXME +    * Testé par captnfab ​le 09/12/2015 
-  * Commentaires sur le forum : [[url Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME+  * Commentaires sur le forum : [[https://​debian-facile.org/​viewtopic.php?​pid=151771#​p151771 ​ici]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
 **Nota :** **Nota :**
Ligne 15: Ligne 15:
 ===== Introduction ===== ===== Introduction =====
  
-Si vos conteneurs LXC doivent contenir des serveurs sensibles aux attaques, vous ne voudriez pas qu'un serveur compromis compromette tout le reste du système. Ne pas donner les privilèges super-utilisateur au conteneur permet ​d'​éviter cela.+Si vos conteneurs LXC doivent contenir des serveurs sensibles aux attaques, vous ne voudriez pas qu'un serveur compromis compromette tout le reste du système. Ne pas donner les privilèges super-utilisateur au conteneur permet ​de limiter ce risque.
  
 ===== Installation ===== ===== Installation =====
  
 Les outils de gestion lxc : Les outils de gestion lxc :
-<code root>​apt-get install lxc cgroup-bin</​code>​+<code root>​apt-get install lxc cgmanager uidmap</​code>​
  
 D'​autres outils normalement présents par défaut : D'​autres outils normalement présents par défaut :
Ligne 28: Ligne 28:
 <code root>​apt-get install less</​code>​ <code root>​apt-get install less</​code>​
  
-===== Utilisation ​=====+===== Préparation ​=====
  
 Nous allons créer un conteneur Test, qui appartiendra à l'​utilisateur lxcuser-test,​ et accèdera au réseau via le pont lxcbr0. Nous allons créer un conteneur Test, qui appartiendra à l'​utilisateur lxcuser-test,​ et accèdera au réseau via le pont lxcbr0.
- 
- 
-==== Préparation ==== 
- 
 Cette opération sera à répéter pour chaque utilisateur devant pouvoir créer un ou plusieurs conteneurs. C'est la seule partie du tutoriel qui doit nécessairement être effectuée en root. Cette opération sera à répéter pour chaque utilisateur devant pouvoir créer un ou plusieurs conteneurs. C'est la seule partie du tutoriel qui doit nécessairement être effectuée en root.
  
-=== Création et configuration de l'​utilisateur ===+==== Création et configuration de l'​utilisateur ​====
  
- ​* ​Création de l'​utilisateur+=== Création de l'​utilisateur ​===
 <code root>​adduser --disabled-password lxcuser-test</​code>​ <code root>​adduser --disabled-password lxcuser-test</​code>​
  
-<note info>​L'​option ''​--disabled-password''​ n'est pas obligatoire,​ elle permet simplement de s'​assurer que la connexion par mot de passe est impossible via ssh.</​note>​+<note info>​L'​option ''​%%-%%-disabled-password''​ n'est pas obligatoire,​ elle permet simplement de s'​assurer que la connexion par mot de passe est impossible via ssh.</​note>​ 
 +<note important>​Comme vous devrez vous connecter à cet utilisateur via ssh, je vous conseille de créer dès maintenant une paire de clefs via ssh-keygen, et de rajouter la clef publique aux clefs autorisées pour cet utilisateur.</​note>​
  
- ​* ​Identification d'une plage d'​uid/​gid libre+=== Identification d'une plage d'​uid/​gid libre ===
 <code user>cat /​etc/​subuid</​code>​ <code user>cat /​etc/​subuid</​code>​
 Exemple : Exemple :
Ligne 63: Ligne 60:
 Dans notre exemple, on considèrera que le fichier /etc/subgid est identique au fichier /​etc/​subuid,​ ce qui est en général le cas. Dans notre exemple, on considèrera que le fichier /etc/subgid est identique au fichier /​etc/​subuid,​ ce qui est en général le cas.
  
-  * Affectation des sous-{u,​g}id à l'​utilisateur+=== Affectation des sous-{u,​g}id à l'​utilisateur ​===
 Nous allouons alors les sous-uid et sous-gid à l'​utilisateur test via la commande (**à modifier en fonction de vos propres ''/​etc/​sub{u,​g}id''​ !**) : Nous allouons alors les sous-uid et sous-gid à l'​utilisateur test via la commande (**à modifier en fonction de vos propres ''/​etc/​sub{u,​g}id''​ !**) :
-<code root>​usermod lxcuser-test --add-sub-uids 624288:624288 --add-sub-gids 624288:​624288</​code>​+<code root>​usermod lxcuser-test --add-subuids ​624288-689823 ​--add-subgids 624288-689823</​code>​
  
-=== Création et configuration de l'​accès au pont réseau ===+==== Création et configuration de l'​accès au pont réseau ​====
  
-  * Création du pont+=== Création du pont ===
 <code root>​brctl addbr lxcbr0</​code>​ <code root>​brctl addbr lxcbr0</​code>​
- +(Penser à automatiser sa création, par exemple via le fichier ''/​e/​n/​interfaces''​ ou via Network-Manager) 
-  ​* ​On autorise l'​utilisateur lxcuser-test à connecter une interface //​ethernet//​ virtuelle au port (vous pouvez augmenter ce nombre selon vos besoins, fichier à créer) :+=== Accès === 
 +On autorise l'​utilisateur lxcuser-test à connecter une interface //​ethernet//​ virtuelle au port (vous pouvez augmenter ce nombre selon vos besoins, fichier à créer) :
 <code text /​etc/​lxc/​lxc-usernet>​ <code text /​etc/​lxc/​lxc-usernet>​
 lxcuser-test veth lxcbr0 1 lxcuser-test veth lxcbr0 1
 </​code>​ </​code>​
  
-==== Création du conteneur ====+==== Configuration cgroups ==== 
 + 
 +Ceci n'est pas nécessaire sous Ubuntu, qui intègre des patchs spéciaux pour que ça marche d'​entrée de jeu (mais cause des problèmes dans d'​autres situations, comme par exemple l'​utilisation d'un noyau RT.) 
 + 
 +Créons les fichiers suivants :​ 
 +<code bash /​usr/​local/​etc/​lxc-cgroups-users>​ 
 +# Liste des utilisateurs pouvant lancer des lxc 
 +LXCUSERS="​lxcuser-test"​ 
 +</​code>​ 
 + 
 +<code bash /​usr/​local/​sbin/​prepare-lxc-cgroups>​ 
 +#​!/​bin/​bash 
 + 
 +source /​usr/​local/​etc/​lxc-cgroups-users 
 + 
 +echo 1 > /​sys/​fs/​cgroup/​cpuset/​cgroup.clone_children 
 +echo 1 > /​proc/​sys/​kernel/​unprivileged_userns_clone 
 + 
 +for u in $LXCUSERS do 
 +  cgm create all $u 
 +  cgm chown all $u $(id -u $u) $(id -g $u) 
 +done 
 +</​code>​ 
 + 
 +<code ini /​etc/​systemd/​system/​lxc-cgroups.service>​[Unit] 
 +Description=Préparation cgroups pour lxc 
 +After=local-fs.target cgmanager.service 
 +Requires=cgmanager.service 
 + 
 +[Service] 
 +Type=oneshot 
 +RemainAfterExit=yes 
 +ExecStart=/​usr/​local/​sbin/​prepare-lxc-cgroups 
 + 
 +[Install] 
 +WantedBy=multi-user.target</​code>​ 
 + 
 +<code root>​chmod a+x /​usr/​local/​sbin/​prepare-lxc-cgroups 
 +systemctl enable /​etc/​systemd/​system/​lxc-cgroups.service</​code>​ 
 +===== Création du conteneur ====
 + 
 +Il existe plusieurs méthodes pour installer une Debian/​Ubuntu/​Whatever dans un dossier. L'​ennui est que la plupart requiert les droits super-utilisateurs pour lancer debootstrap. 
 +Ceci-dit, cette opération n'est a priori à faire qu'une fois, et l'​alternative n'est pas forcément réjouissante. Nous présentons les deux possibilités les plus intéressantes. 
 + 
 +==== Méthode template download ==== 
 + 
 +Le code à faire en tant qu'​utilisateur est à faire en tant que ''​lxcuser-test''​. 
 + 
 +=== Configuration des options par défaut === 
 + 
 +Dans le dossier ''​~lxcuser-test/​.config/​lxc/''​ (probablement à créer), créer un fichier ''​default.conf''​ contenant la configuration suivante :​ 
 +<code ini ~lxcuser-test/​.config/​lxc/​default.conf>​lxc.network.type = veth 
 +lxc.network.link = lxcbr0 
 +lxc.network.flags = up 
 +# À compléter pour définir une adresse mac 
 +#​lxc.network.hwaddr = 00:​16:​3e:​xx:​xx:​xx 
 +lxc.id_map = u 0 624288 65536 
 +lxc.id_map = g 0 624288 65536</​code>​ 
 +Remplacer //624288// sur les deux dernières lignes par les valeurs du premier sous-uid/​gid alloué à l'​utilisateur. 
 + 
 +<code user>​lxc-create -t download -n test -- -d debian</​code>​ 
 + 
 +==== Méthode root + chown ==== 
 + 
 +<code user>​mkdir -p ~/​.local/​share/​lxc</​code>​ 
 + 
 +<code root>​lxc-create -t debian -n test -- -d debian 
 +mv /​var/​lib/​lxc/​test ~lxcuser-test/​.local/​share/​lxc/​ 
 +chown lxcuser-test ~lxcuser-test/​.local/​share/​lxc/​test{,/​*} 
 +find ~lxcuser-test/​.local/​share/​lxc/​test/​rootfs/​ -exec sh -c 'chown $(echo $(stat -c %u "​{}"​)+624288 | bc):$(echo $(stat -c %g "​{}"​)+624288 | bc) "​{}"'​ \; 
 +</​code>​ 
 +En remplaçant 624288 par les numéro initiaux des plages de sous-uid/​gid respectifs de votre user. 
 +===== Utilisation du conteneur ===== 
 + 
 +<code user>cgm movepid all $USER $$ 
 +lxc-start -n test -d</​code>​ 
 + 
 +Attention, la première commande peut renvoyer une erreur tout en fonctionnant correctement,​ donc ne pas utiliser ''&&''​. 
 +===== FAQ / Problèmes rencontrés ===== 
 +Messages d'​erreur rencontrés en lançant les différentes commandes du tuto, ou encore journalctl -xe 
 + 
 +  * ''​lxc_container:​ Failed to chown /​dev/​pts/​X''​ 
 +Vérifier que le paquet ''​uidmap''​ est bien installé 
 +Vérifier que ''/​proc/​sys/​kernel/​unprivileged_userns_clone''​ et ''/​sys/​fs/​cgroup/​cpuset/​cgroup.clone_children''​ sont bien à ''​1''​ 
 + 
 +  * ''​pam_unix(sudo:​auth):​ conversation failed'',​ ''​pam_unix(sudo:​auth):​ auth could not identify password for [lxcuser-test]''​ 
 +Vérifier que l'on s'est bien connecté en tant que lxcuser-test via PAM (par exemple via ssh et non-pas par su/sudo) 
 + 
 +  * ''​ERROR ​   lxc_cgfs - Permission denied - Could not create cgroup '/​test'​ in '/​sys/​fs/​cgroup/​perf_event'​.'',​ ''​lxc_container:​ cgfs.c: lxc_cgroupfs_create:​ 956 Permission denied - Could not create cgroup '/​lxc'​ in '/​sys/​fs/​cgroup/​cpuset'​.''​ 
 +Vérifier que nous ne sommes pas à la racine dans les cgroups listés dans ''/​proc/​self/​cgroup''​ 
 +Exemple de config problématique : 
 +<​code>​8:​perf_event:/​ 
 +7:blkio:/ 
 +… 
 +1:​name=systemd:/​user.slice/​user-1001.slice/​session-42.scope</​code>​ 
 + 
 +Vous devriez plutôt obtenir quelque chose comme 
 +<​code>​8:​perf_event:/​lxcuser1/​ 
 +7:​blkio:/​lxcuser1/​ 
 +… 
 +1:​name=systemd:/​user.slice/​user-1001.slice/​session-42.scope</​code>​ 
 + 
 +Ce problème survient quand libpam-systemd (qui ajoute automatiquement les nouvelles connexions aux bons cgroups) n'est pas installé, où quand les cgroups users ne sont pas créés dans les différents contrôleurs,​ ce qui est le comportement par défaut sous Debian, mais pas sous Ubuntu. Reportez-vous à la partie du tuto sur les cgroups si vous avez des soucis. 
 + 
 +  * ''​lxc_container:​ cgmanager.c:​ lxc_cgmanager_enter:​ 698 call to cgmanager_move_pid_sync failed: invalid request''​ 
 +Muh ? Visiblement,​ problème avec une version cgmanager trop récente (stretch/​sid et non jessie) 
 + 
 +  * ''​lxc_start - failed to create the configured network''​ 
 +Vérifier que le mode de connexion renseigné dans ''/​etc/​lxc/​lxc-usernet''​ existe bien. 
 + 
 +  * Vérifier que tous les dossiers parents du dossier ''​rootfs''​ sont bien exécutables par Others (ou au moins par le min de la plage de sous-uid correspondante).
  
-==== Utilisation du conteneur ​====+===== Sources =====
  
 +  * https://​www.mail-archive.com/​lxc-devel@lists.linuxcontainers.org/​msg01660.html
 +  * https://​www.stgraber.org/​2014/​01/​17/​lxc-1-0-unprivileged-containers/​
 +  * http://​unix.stackexchange.com/​questions/​170998/​how-to-create-user-cgroups-with-systemd
 +  * http://​www.linuxquestions.org/​questions/​linux-kernel-70/​lxc-unprivileged-container-in-debian-jessie-cgroups-permissions-4175540174/​
 +  * http://​www.equiscentrico.com.ar/​2015/​05/​unprivileged-lxc-en-debian-jessie.html
doc/autres/vm/lxc/mode-utilisateur.txt · Dernière modification: 18/11/2020 20:51 par captnfab

Pied de page des forums

Propulsé par FluxBB