Déployer un environnement jetable avec un conteneur LXC
RetourIl m’arrive souvent, par manque de temps, de lancer des tests sur ma machine. Ces tests finissent par rendre mon système instable au fil du temps.
De plus, les CTF et autres challenges sont souvent particuliers, il est donc parfois intérèssant d’avoir un environnement jetable qui puisse être remonté rapidement.
Bien entendus une VM aurait fait l’affaire mais elle inclut un plus grand overhead.
Installation de LXC
Sur Debian, voici ce que j’ai installé :
sudo apt-get install lxc lxctl lxc-templates bridge-utils
Déploiement de notre conteneur
Ici mon conteneur se nomme debian
On commence par lister les templates disponibles :
ls /usr/share/lxc/templates
lxc-alpine lxc-centos lxc-fedora lxc-oracle lxc-sshd
lxc-altlinux lxc-cirros lxc-gentoo lxc-plamo lxc-ubuntu
lxc-archlinux lxc-debian lxc-openmandriva lxc-slackware lxc-ubuntu-cloud
lxc-busybox lxc-download lxc-opensuse lxc-sparclinux
Dans mon cas, je pars sur un debian :
lxc-create -n deb -t debian
-n représente le nom du conteneur
-t représente le template choisis
L’initialisation peu prendre un peut de temps, patientez et prenez un café.
On va maintenant lancer notre conteneur :
sudo lxc-start -n debian
lxc-start: tools/lxc_start.c: main: 366 The container failed to start.
lxc-start: tools/lxc_start.c: main: 368 To get more details, run the container in foreground mode.
lxc-start: tools/lxc_start.c: main: 370 Additional information can be obtained by setting the --logfile and --logpriority options.
Oups ! une erreur s’est produite. Cette erreur provient du fait que l’interface réseau spécifié par notre fichier de configuration est mauvaise.
Mon fix consiste a me brancher sur le bridge par défaut créé par virt-manager :
sudo vi /var/lib/lxc/debian/config
# Modifier la ligne suivante :
lxc.network.link = br0
# avec cette ligne :
lxc.network.link = virbr0
Puis relancer le conteneur.
Autres possibilités:
Décommentez la ligne suivent dans /etc/sysctl.conf
:
# Décommentez la prochaine ligne pour activer le "packet forwarding" pour IPv4
net.ipv4.ip_forward=1
Insérez les lignes suivantes dans /etc/network/interfaces
:
auto lxc-bridge-nat
iface lxc-bridge-nat inet static
bridge_ports none
bridge_fd 0
bridge_maxwait 0
address 192.168.100.1
netmask 255.255.255.0
up iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Enfin on modifie le fichier de configuration en conséquence :
sudo vi /var/lib/lxc/debian/config
# Modifier la ligne suivante :
lxc.network.link = br0
# avec cette ligne :
lxc.network.link = lxc-bridge-nat
On vient ici de créer un bridge puis un NAT, ce dernier va nous permettre d’accéder a internet depuis le conteneur.
On se lance !
Voici un workflow classique sur LXC :
# On liste les conteneurs
sudo lxc-ls
# On lance notre LXC
sudo lxc-start -n debian
# On attache un prompt au LXC
sudo lxc-attach -n debian
# Une fois finis, on coupe le conteneur
sudo lxc-stop -n debian
# Si on le souhaite on le supprime
sudo lxc-destroy debian
Limitation des ressources allouées au conteneur
On va éditer notre fichier de configuration (/var/lib/lxc/debian/config) et on y ajoute ces lignes en fin de fichier :
lxc.cgroup.memory.limit_in_bytes = 250M
lxc.cgroup.cpuset.cpus = 0
Ici on assigne le CPU numéro 0 au conteneur et enfin on limite la ram alloué a 250 Mb.
On vérifie :
# nombre de cpu du conteneur
root@debian:/> cat /proc/cpuinfo | grep "processor" | wc -l
1
# Ram alloué
root@debian:/> free -h
total used free shared buff/cache available
Mem: 250M 5.9M 236M 171M 8.1M 236M
Swap: 8.0G 0B 8.0G
Comme on le voit, ici on a bien la limitation souhaitée.
Exemple de configuration type :
# Networking
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 00:FF:AA:00:00:01
lxc.network.ipv4 = 192.168.122.110/24
lxc.network.ipv4.gateway = 192.168.122.1
#RootFS
lxc.rootfs = /var/lib/lxc/debi/rootfs
lxc.rootfs.backend = dir
# Limitation of the host ressource usage
lxc.cgroup.memory.limit_in_bytes = 250M
lxc.cgroup.cpuset.cpus = 0
# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
# Container specific configuration
lxc.tty = 4
lxc.utsname = debi
lxc.arch = amd64
Edit du 17/10/2019
Il semble que sur les derniéres versions de Ubuntu la signature GPG des templates fonctionne mal. Il existe néanmoins une solution vraiment pratique car elle télécharge directement une image suivant vos besoins :
jugu@WORKSTATION:~$ sudo lxc-create -n zetta_pgsql -t download
Setting up the GPG keyring
Downloading the image index
---
DIST RELEASE ARCH VARIANT BUILD
---
debian bullseye s390x default 20191017_05:24
debian buster amd64 default 20191017_05:24
debian buster arm64 default 20191017_06:13
debian buster armel default 20191017_05:40
debian buster armhf default 20191017_05:24
debian buster i386 default 20191017_05:24
funtoo 1.3 i386 default 20191017_16:45
gentoo current amd64 default 20191017_16:07
gentoo current armhf default 20191017_16:07
gentoo current i386 default 20191017_16:07
---
Distribution:
debian
Release:
buster
Architecture:
amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created a Debian buster amd64 (20191017_05:24) container.
To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.
L’option download
permet de choisir depuis une liste d’images ce qui offre un grand choix de distribution/architectures.
Note: Cela me donne envie de tester un conteneur Kali !
Conclusion
On à vue ici qu’il etait possible de créer un conteneur rapidement et que cette technique est parfois plus adapté qu’une machine virtuelle dans le cadre de CTF.
Pour ma part, cette technique fait désormais partie de ma boite à outils spécifiques aux CTF.
Retour