Différences
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 | ||
lxc [Le 24/12/2018, 00:05] 91.219.236.171 |
lxc [Le 11/09/2022, 12:09] (Version actuelle) moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
====== LXC ====== | ====== LXC ====== | ||
- | **LXC** est l'acronyme de l'anglicisme **LinuX Containers**, est un système de [[virtualisation|virtualisation]], utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau. Le conteneur apporte une virtualisation de l'environnement d'exécution (processeur, mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de « machine virtuelle ». | + | **LXC** est l'acronyme de l'anglicisme **LinuX Containers**, est un système de [[virtualisation|virtualisation]], utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau. Le conteneur apporte une virtualisation de l'environnement d'exécution (processeur, mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de « machine virtuelle ». |
Veillez à ne pas confondre **LXC** et [[:LXD|LXD]], en effet, [[:LXD|LXD]] est une surcouche logicielle à **LXC**. [[:LXD|LXD]] est développé par Canonical pour simplifier la manipulation de vos conteneurs. | Veillez à ne pas confondre **LXC** et [[:LXD|LXD]], en effet, [[:LXD|LXD]] est une surcouche logicielle à **LXC**. [[:LXD|LXD]] est développé par Canonical pour simplifier la manipulation de vos conteneurs. | ||
Ligne 18: | Ligne 18: | ||
===== Création de notre premier container LXC (root) ===== | ===== Création de notre premier container LXC (root) ===== | ||
<note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | <note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | ||
+ | |||
Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | ||
Ligne 31: | Ligne 32: | ||
Generation complete. | Generation complete. | ||
Creating SSH2 RSA key; this may take some time ... | Creating SSH2 RSA key; this may take some time ... | ||
- | 2048 SHA256:oZjCPZs+eRqXx2y3WCX3sNR+fnxQypD1887jGnQ0jD8 root@mysweethome (RSA) | + | 2048 SHA256:oZjCPZs+eRqXx2y3WCX3sNR+fnxQypD1887jGnQ0jD8 root@home (RSA) |
Creating SSH2 DSA key; this may take some time ... | Creating SSH2 DSA key; this may take some time ... | ||
- | 1024 SHA256:fCNCpbXq4Z7KYZ0Xdztu9ti+u4rijgWg/nZ46M0A3HY root@mysweethome (DSA) | + | 1024 SHA256:fCNCpbXq4Z7KYZ0Xdztu9ti+u4rijgWg/nZ46M0A3HY root@home (DSA) |
Creating SSH2 ECDSA key; this may take some time ... | Creating SSH2 ECDSA key; this may take some time ... | ||
- | 256 SHA256:AT1ceBEITRDgga9czOlupGrRUT7T1DKl3PD0k9ZXlyU root@mysweethome (ECDSA) | + | 256 SHA256:AT1ceBEITRDgga9czOlupGrRUT7T1DKl3PD0k9ZXlyU root@home (ECDSA) |
Creating SSH2 ED25519 key; this may take some time ... | Creating SSH2 ED25519 key; this may take some time ... | ||
- | 256 SHA256:BPcu2IHpyQoHIvpjIgzPMgaGDrz1TAaUlUnLrwznGXs root@mysweethome (ED25519) | + | 256 SHA256:BPcu2IHpyQoHIvpjIgzPMgaGDrz1TAaUlUnLrwznGXs root@home (ED25519) |
invoke-rc.d: could not determine current runlevel | invoke-rc.d: could not determine current runlevel | ||
invoke-rc.d: policy-rc.d denied execution of start. | invoke-rc.d: policy-rc.d denied execution of start. | ||
Ligne 159: | Ligne 160: | ||
<code bash>sudo lxc-stop -n container_xenial</code> | <code bash>sudo lxc-stop -n container_xenial</code> | ||
- | Et ensuite, nous passons à la destruction : | + | Et ensuite, nous passons à la destruction : |
<code bash>sudo lxc-destroy -n container_xenial</code> | <code bash>sudo lxc-destroy -n container_xenial</code> | ||
Ligne 169: | Ligne 170: | ||
Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le sub**g**id ainsi que le subg**u**id de notre utilisateur courant : | Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le sub**g**id ainsi que le subg**u**id de notre utilisateur courant : | ||
<code bash> | <code bash> | ||
- | cat /etc/sub{g,u}id | grep $USER | + | grep -h $USER /etc/sub{g,u}id |
</code> | </code> | ||
Ligne 284: | Ligne 285: | ||
</code> | </code> | ||
- | Vous noterez qu'il y'a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : | + | Vous noterez qu'il n'y a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : |
<code bash>lxc-start -n container_unprivileged</code> | <code bash>lxc-start -n container_unprivileged</code> | ||
Ligne 365: | Ligne 366: | ||
<code bash>lxc-stop -n container_unprivileged</code> | <code bash>lxc-stop -n container_unprivileged</code> | ||
- | Et ensuite, nous passons à la destruction : | + | Et ensuite, nous passons à la destruction : |
<code bash>lxc-destroy -n container_unprivileged</code> | <code bash>lxc-destroy -n container_unprivileged</code> | ||
Ligne 389: | Ligne 390: | ||
<code bash>sudo -i && cd /home/$USER/.local/lxc/nom_de_votre_container/</code> | <code bash>sudo -i && cd /home/$USER/.local/lxc/nom_de_votre_container/</code> | ||
- | Ensuite, nous utilisons la commande [[tar|tar]] avec son option **--numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. | + | Ensuite, nous utilisons la commande [[tar|tar]] avec son option **%%--%%numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. |
<code bash>GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> | <code bash>GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> | ||
Ligne 421: | Ligne 422: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
<code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> | <code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> | ||
Ligne 431: | Ligne 432: | ||
=== Pour une utilisation unprivileged === | === Pour une utilisation unprivileged === | ||
- | <note tip>Nous aborderons ici, que la restauration de votre backup précédemment créé. | + | <note tip>Nous n'aborderons ici, que la restauration de votre backup précédemment créé. |
Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | ||
</note> | </note> | ||
Ligne 456: | Ligne 457: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
<code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> | <code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> | ||
Ligne 494: | Ligne 495: | ||
<code bash>sudo((container unprivileged ou non?)) lxc-snapshot -r snapX -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non?)) lxc-snapshot -r snapX -n nom_de_mon_container</code> | ||
- | |||
- | ===== Iptables (utilisation basique) et bridge ===== | ||
- | |||
- | Vous trouverez ici, une esquisse d'un script [[:iptables]], pour faire fonctionner votre container LXC. Il est bien entendu à ajouter aux règles que **vous avez déjà**, et à exécuter depuis votre [[wpfr>Hôte_(informatique)|machine hôte]] !. Cette esquisse est surtout utile si vous avez **un [[wpfr>Pare-feu_(informatique)|firewall]] d'actif**((8-).)), sinon((m(:-X.)), vous devez juste activer le port forwarding((echo 1 > /proc/sys/net/ipv4/ip_forward)), et **configurer le fichier lxc-net comme ci-bas**. Nous noterons aussi, que nous pouvons encore être plus restrictif, mais cette configuration semble adéquate pour un [[wpfr>Luser|profane]]((Et c'est pas péjoratif ce script est qu'une ébauche.)). | ||
- | |||
- | Nous devons aussi, absolument [[:installation_logiciel|installer le package]] [[apt>dnsmasq-base]], qui est, logiquement déjà installé sur votre machine. Et ensuite configurer LXC pour qu'il utilise la technologie [[wpfr>Pont_(réseau)|bridge]]. | ||
- | |||
- | Veuillez [[:tutoriel:comment_modifier_un_fichier|éditer le fichier]] **/etc/default/lxc-net**, pour avoir comme résultat final : | ||
- | |||
- | <code> | ||
- | USE_LXC_BRIDGE="true" | ||
- | </code> | ||
- | |||
- | Nous devons ensuite redémarrer notre service **lxc-net** : | ||
- | |||
- | <code>sudo systemctl restart lxc-net</code> | ||
- | |||
- | Pour vérifier que tout est ok : | ||
- | |||
- | <code>ip -4 -o a show lxcbr0</code> | ||
- | Retournera par exemple : | ||
- | <code> | ||
- | 3: lxcbr0 inet 10.0.3.1/24 scope global lxcbr0\ valid_lft forever preferred_lft forever | ||
- | </code> | ||
- | |||
- | Et voici le script [[:iptables]] : | ||
- | |||
- | <file bash iptables_lxc> | ||
- | #!/bin/bash | ||
- | ## Créé par BeAvEr. | ||
- | ### Merci d'utiliser FIXME au sein du dokuwiki francophone Ubuntu au besoin, | ||
- | ### ou d'apporter votre contribution sur ce script, ici même. | ||
- | #### Merci de garder un aspect "humain" au script. | ||
- | ##### Le tout étant d'avoir juste les règles basiques, pour qu'un Luser/Profane/Néophyte, puisse utiliser LXC | ||
- | ##### de manière **"relativement"** sécurisé. | ||
- | ##### (Pouvoir ping, apt-update, et cetera, et dans cet ordre là, depuis son container, pas plus). | ||
- | |||
- | # Nous activons le port forwarding, pour pouvoir communiquer à l'intérieur de notre container. | ||
- | |||
- | echo 1 > /proc/sys/net/ipv4/ip_forward | ||
- | |||
- | # Règles iptables. | ||
- | ## Dans notre exemple, **veth0** est le nom de notre interface pour notre container. | ||
- | ### Pour pouvoir spécifier le nom d'une interface, merci de renseigner votre fichier **config** | ||
- | ### de **votre container**, avec l'option -> lxc.network.name = veth0. | ||
- | |||
- | #### beaver@mysweethome:~$ ip a |grep veth0 | ||
- | #### 7: veth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### link/ether xx:xx:xx:xx:e8:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | ||
- | |||
- | #### beaver@mysweethome:~$ ip a |grep eth | ||
- | #### 5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### inet 10.0.x.x/24 brd 10.0.X.255 scope global eth0 | ||
- | |||
- | #### beaver@mysweethome:~$ ip a |grep lxcbr0 | ||
- | #### 4: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### inet 10.0.x.1/24 scope global lxcbr0 | ||
- | |||
- | #### LXC | ||
- | iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT | ||
- | iptables -A FORWARD -i lxcbr0 -o eth0 -j ACCEPT | ||
- | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | ||
- | iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE | ||
- | iptables -A FORWARD -s 10.0.3.0/24 -o eth0 -j ACCEPT | ||
- | iptables -A FORWARD -d 10.0.3.0/24 -o lxcbr0 -j ACCEPT | ||
- | |||
- | #### dnsmasq-dhcp DHCPDISCOVER(lxcbr0) | ||
- | ### sudo systemctl status lxc-net : | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPDISCOVER(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPOFFER(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPREQUEST(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPACK(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 nom_de_mon_container | ||
- | ### lxc-ls --fancy | ||
- | ### NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
- | ### nom_de_mon_container RUNNING 0 - 10.0.3.58 - | ||
- | |||
- | iptables -I INPUT -i lxcbr0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT | ||
- | |||
- | exit 0 | ||
- | </file> | ||
- | |||
---- | ---- | ||
Ligne 583: | Ligne 503: | ||
* https://wiki.debian.org/EvgeniGolov/LXC | * https://wiki.debian.org/EvgeniGolov/LXC | ||
* https://askubuntu.com/questions/340055/lxc-container-no-outgoing-traffic | * https://askubuntu.com/questions/340055/lxc-container-no-outgoing-traffic | ||
+ | * https://lxc-webpanel.github.io/ | ||
---- | ---- | ||
Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. | Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. |