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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:autres:vm:lxc:mode-utilisateur [23/12/2015 11:33] captnfab [Création du conteneur] |
doc:autres:vm:lxc:mode-utilisateur [12/07/2018 10:39] captnfab [Préparation] |
||
---|---|---|---|
Ligne 4: | Ligne 4: | ||
* Niveau requis : {{tag>avisé}} | * Niveau requis : {{tag>avisé}} | ||
* Commentaires : //Des conteneurs sécurisés.// | * Commentaires : //Des conteneurs sécurisés.// | ||
- | * Suivi : {{tag>en-chantier à-tester}} | + | * Suivi : {{tag>}} |
* Création par [[user>captnfab]] 09/12/2015 | * Création par [[user>captnfab]] 09/12/2015 | ||
* Testé par captnfab le 09/12/2015 | * Testé par captnfab le 09/12/2015 | ||
+ | * Testé et mis à jour par captnfab le 17/06/2018 | ||
* 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 !)) | * 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 !)) | ||
Ligne 20: | Ligne 21: | ||
Les outils de gestion lxc : | Les outils de gestion lxc : | ||
- | <code root>apt-get install lxc cgmanager uidmap</code> | + | <code root>apt-get install lxc uidmap</code> |
D'autres outils normalement présents par défaut : | D'autres outils normalement présents par défaut : | ||
Ligne 30: | Ligne 31: | ||
===== Préparation ===== | ===== 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. |
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. | ||
Ligne 41: | Ligne 42: | ||
<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> | <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 === | + | Nous devons ensuite nous assurer qu'une plage de sous-uid/sous-gid a été affectée à l'utilisateur. |
+ | |||
+ | === Identification et affectation d'une plage d'uid/gid libre === | ||
<code user>cat /etc/subuid</code> | <code user>cat /etc/subuid</code> | ||
Exemple : | Exemple : | ||
Ligne 56: | Ligne 59: | ||
Voir le man <code user>man subuid</code> | Voir le man <code user>man subuid</code> | ||
+ | Si lxcuser-test **n'apparaît pas dans la liste**, alors on va l'ajouter, sinon, passer directement au paragraphe suivant. | ||
Dans notre exemple, le premier uid de libre est le 558752+65536=624288, donc notre utilisateur utilisera la plage d'uuid 624288 à 689823 (624288+65535). | Dans notre exemple, le premier uid de libre est le 558752+65536=624288, donc notre utilisateur utilisera la plage d'uuid 624288 à 689823 (624288+65535). | ||
Nous faisons ensuite la même opération pour les gid, en consultant /etc/subgid. | Nous faisons ensuite la même opération pour les gid, en consultant /etc/subgid. | ||
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 === | ||
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-subuids 624288-689823 --add-subgids 624288-689823</code> | <code root>usermod lxcuser-test --add-subuids 624288-689823 --add-subgids 624288-689823</code> | ||
Ligne 76: | Ligne 79: | ||
==== Configuration cgroups ==== | ==== Configuration cgroups ==== | ||
+ | Il faut activer certaines fonctionnalités des cgroups pour que l'on puisse lancer les conteneurs utilisateurs. | ||
- | 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.) | + | Vérifier que le fichier ''/sys/fs/cgroup/cpuset/cgroup.clone_children'' est bien à 1 par défaut sur le système. |
+ | <code root>cat /sys/fs/cgroup/cpuset/cgroup.clone_children</code> | ||
- | Créons les fichiers suivants : | + | Créer le fichier de configuration de sysctl suivant : |
- | <code bash /usr/local/etc/lxc-cgroups-users> | + | <code ini /etc/sysctl.d/40-lxc-userns.conf> |
- | # Liste des utilisateurs pouvant lancer des lxc | + | kernel.unprivileged_userns_clone=1 |
- | LXCUSERS="lxcuser-test" | + | net.bridge.bridge-nf-call-arptables=0 |
+ | net.bridge.bridge-nf-call-iptables=0 | ||
+ | net.bridge.bridge-nf-call-ip6tables=0 | ||
</code> | </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 | ||
- | systemctl start lxc-cgroups</code> | ||
===== Création du conteneur ===== | ===== 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''. | Le code à faire en tant qu'utilisateur est à faire en tant que ''lxcuser-test''. | ||
Ligne 138: | Ligne 111: | ||
<code user>lxc-create -t download -n test -- -d debian</code> | <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. | ||
===== Configuration du conteneur ===== | ===== Configuration du conteneur ===== | ||
Ligne 154: | Ligne 116: | ||
Le fichier de configuration ''~/.local/share/lxc/test/config'' doit ressembler à ça : | Le fichier de configuration ''~/.local/share/lxc/test/config'' doit ressembler à ça : | ||
<code ini ~/.local/share/lxc/test/config> | <code ini ~/.local/share/lxc/test/config> | ||
+ | # Template used to create this container: /usr/share/lxc/templates/lxc-download | ||
+ | # Parameters passed to the template: -d debian | ||
+ | # Template script checksum (SHA-1): 01d100d3f1129082777c82a0e3a66adcaeb5c37f | ||
# For additional config options, please look at lxc.container.conf(5) | # For additional config options, please look at lxc.container.conf(5) | ||
+ | |||
+ | # Uncomment the following line to support nesting containers: | ||
+ | #lxc.include = /usr/share/lxc/config/nesting.conf | ||
+ | # (Be aware this has security implications) | ||
+ | |||
+ | # À compléter pour définir une adresse mac | ||
# Distribution configuration | # Distribution configuration | ||
lxc.include = /usr/share/lxc/config/debian.common.conf | lxc.include = /usr/share/lxc/config/debian.common.conf | ||
lxc.include = /usr/share/lxc/config/debian.userns.conf | lxc.include = /usr/share/lxc/config/debian.userns.conf | ||
- | lxc.arch = x86_64 | + | lxc.arch = linux64 |
- | + | ||
- | lxc.autodev = 0 | + | |
# Container specific configuration | # Container specific configuration | ||
Ligne 167: | Ligne 136: | ||
lxc.id_map = g 0 624288 65536 | lxc.id_map = g 0 624288 65536 | ||
lxc.rootfs = /home/lxcuser-test/.local/share/lxc/test/rootfs | lxc.rootfs = /home/lxcuser-test/.local/share/lxc/test/rootfs | ||
- | #lxc.mount = /home/lxcuser-test/.local/share/lxc/test/fstab | + | lxc.rootfs.backend = dir |
lxc.utsname = test | lxc.utsname = test | ||
Ligne 175: | Ligne 144: | ||
lxc.network.link = lxcbr0 | lxc.network.link = lxcbr0 | ||
#lxc.network.hwaddr = 00:16:3e:xx:xx:xx</code> | #lxc.network.hwaddr = 00:16:3e:xx:xx:xx</code> | ||
- | |||
- | <note warning>Les options lxc.network.* doivent être cohérentes avec ce qui a été indiqué dans ''/etc/lxc/lxc-usernet'' : | ||
- | <code>lxcuser-test veth lxcbr0 1</code> | ||
- | </note> | ||
- | |||
Les droits des dossiers doivent ressembler à cela : | Les droits des dossiers doivent ressembler à cela : | ||
<code user>ls -lhd /home{,/lxcuser-test{,/.local{,/share{,/lxc{,/test}}}}}</code> | <code user>ls -lhd /home{,/lxcuser-test{,/.local{,/share{,/lxc{,/test}}}}}</code> | ||
<code>drwxr-xr-x 5 root root 4,0K déc. 17 00:07 /home | <code>drwxr-xr-x 5 root root 4,0K déc. 17 00:07 /home | ||
- | drwxr-xr-x 3 lxcuser lxcuser 4,0K déc. 17 00:56 /home/lxcuser-test | + | drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc. 17 00:56 /home/lxcuser-test |
- | drwxr-xr-x 3 lxcuser lxcuser 4,0K déc. 17 00:56 /home/lxcuser-test/.local | + | drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc. 17 00:56 /home/lxcuser-test/.local |
- | drwxr-xr-x 3 lxcuser lxcuser 4,0K déc. 19 13:49 /home/lxcuser-test/.local/share | + | drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc. 19 13:49 /home/lxcuser-test/.local/share |
- | drwxr-xr-x 3 lxcuser lxcuser 4,0K déc. 19 13:53 /home/lxcuser-test/.local/share/lxc | + | drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc. 19 13:53 /home/lxcuser-test/.local/share/lxc |
- | drwxrwx--x 3 lxcuser lxcuser 4,0K déc. 19 13:51 /home/lxcuser-test/.local/share/lxc/test</code> | + | drwxrwx--x 3 624288 lxcuser-test 4,0K déc. 19 13:51 /home/lxcuser-test/.local/share/lxc/test</code> |
- | (Le o+x est le point crucial ici.) | + | |
<code user>ls -lh /home/lxcuser-test/.local/share/lxc/test</code> | <code user>ls -lh /home/lxcuser-test/.local/share/lxc/test</code> | ||
<code>total 8,0K | <code>total 8,0K | ||
- | -rw-r--r-- 1 lxcuser lxcuser 488 déc. 19 13:51 config | + | -rw-r--r-- 1 lxcuser-test lxcuser-test 488 déc. 19 13:51 config |
- | -rw-r--r-- 1 lxcuser lxcuser 0 déc. 19 13:51 fstab | + | -rw-r--r-- 1 lxcuser-test lxcuser-test 0 déc. 19 13:51 fstab |
- | drwxr-xr-x 22 624288 624288 4,0K déc. 19 13:51 rootfs</code> | + | drwxr-xr-x 22 624288 624288 4,0K déc. 19 13:51 rootfs</code> |
- | (Vérifier les propriétaires suivant ses propres sous-uid/sous-gid.) | + | |
+ | Vérifier les propriétaires suivant ses propres sous-uid/sous-gid. | ||
+ | Vérifiez bien les droits de lecture/écriture/exécution pour l'utilisateur, le groupe et les autres. | ||
===== Utilisation du conteneur ===== | ===== Utilisation du conteneur ===== | ||
- | <code user>cgm movepid all $USER $$ | + | * Création |
- | lxc-start -n test -d</code> | + | <code user>lxc-start -n test -d</code> |
+ | |||
+ | * Shell | ||
+ | <code user>lxc-attach --set-var PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -n test</code> | ||
+ | |||
+ | <note info>Sans l'option ''--clear-env'', vous conservez les variables d'environnement de votre utilisateur. Ce n'est en général pas gênant, mais ces variables incluent aussi le PATH… Cependant, clear-env enlève aussi des variables intéressantes comme TERM. Pour ne pas vous retrouver avec un shell root avec un path utilisateur (ne contenant pas sbin) ce qui peut facilement générer des erreurs, ou un terminal mal configuré, utilisez l'option ''--set-var''.</note> | ||
- | Attention, la première commande peut renvoyer une erreur tout en fonctionnant correctement, donc ne pas utiliser ''&&''. | ||
===== FAQ / Problèmes rencontrés ===== | ===== FAQ / Problèmes rencontrés ===== | ||
Messages d'erreur rencontrés en lançant les différentes commandes du tuto, ou encore journalctl -xe | 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'' | + | * ''lxc_container: Failed to chown /dev/pts/X'', ''lxc_start - start.c:lxc_init:445 - Failed to shift tty into container'' |
Vérifier que le paquet ''uidmap'' est bien installé | 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'' | Vérifier que ''/proc/sys/kernel/unprivileged_userns_clone'' et ''/sys/fs/cgroup/cpuset/cgroup.clone_children'' sont bien à ''1'' |