lxc kan geintalleerd worden op praktish alle distributies met de lxc
package.
Als root maken we een debian bookworm container aan met de naam "loempiashop".
root@r-mint ~# lxc-create --name loempiashop --template download -- --dist debian --release bookworm --arch 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 bookworm amd64 (20241014_05:24) container.
To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.
De bestanden van de container kunnen worden gevonden in /var/lib/lxc/loempiashop/
.
root@r-mint ~# ll /var/lib/lxc/loempiashop/
total 4.0K
-rw-r----- 1 root root 811 Oct 14 17:21 config
drwxr-xr-x 1 root root 132 Oct 14 07:28 rootfs/
De website bestanden kunnen simpelweg het rootfs ingekopieerd worden.
root@r-mint ~# mkdir -p /var/lib/lxc/loempiashop/rootfs/var/www/html/
root@r-mint ~# cp -r /home/rein/projects/loempiashop/srv/* /var/lib/lxc/loempiashop/rootfs/var/www/html/
root@r-mint ~# ll /var/lib/lxc/loempiashop/rootfs/var/www/html/
total 52K
-rw-r--r-- 1 root root 3.2K Oct 14 18:06 admin.php
drwxr-xr-x 1 root root 44 Oct 14 18:06 assets/
-rw-r--r-- 1 root root 2.0K Oct 14 18:06 cart.php
-rw-r--r-- 1 root root 737 Oct 14 18:06 delete_item.php
-rw-r--r-- 1 root root 182 Oct 14 18:06 delete_review.php
-rw-r--r-- 1 root root 700 Oct 14 18:06 header.php
drwxr-xr-x 1 root root 136 Oct 14 18:06 images/
-rw-r--r-- 1 root root 1.3K Oct 14 18:06 index.php
-rw-r--r-- 1 root root 19 Oct 14 18:06 info.php
-rw-r--r-- 1 root root 2.8K Oct 14 18:06 item.php
-rw-r--r-- 1 root root 1.3K Oct 14 18:06 login.php
-rw-r--r-- 1 root root 88 Oct 14 18:06 logout.php
-rw-r--r-- 1 root root 279 Oct 14 18:06 mysql.php
-rw-r--r-- 1 root root 1.6K Oct 14 18:06 register.php
-rw-r--r-- 1 root root 475 Oct 14 18:06 submit_review.php
Om de box iets moeilijker te maken voeg ik dit toe aan admin.php
:
<?php
if (isset($_SESSION['user'])) {
$user = $conn->query("SELECT name, admin FROM users WHERE id = ".$_SESSION['user'])->fetch_assoc();
if ($user['admin'] != 1) {
header("HTTP/1.1 400 Bad Request");
echo "Not allowed";
exit();
}
} else {
header("HTTP/1.1 400 Bad Request");
echo "Not allowed";
exit();
}
?>
De container verwacht een bridge genaamd lxcbr0
en deze moet aangemaakt worden door lxc-net
.
De makkelijkste manier om dit te doen is een configuratieebstand voor lxc-net maken en dan de lxc-net.service
starten.
root@r-mint ~# echo 'USE_LXC_BRIDGE="true"' > /etc/default/lxc-net
root@r-mint ~# systemctl start lxc-net
root@r-mint ~# ip a
...
17: lxcbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
valid_lft forever preferred_lft forever
inet6 fc11:4514:1919:810::1/64 scope global
valid_lft forever preferred_lft forever
De container staat nu uit:
root@r-mint ~# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
loempiashop STOPPED 0 - - - false
De container starten en een shell openen:
root@r-mint ~# lxc-start loempiashop
root@r-mint ~# lxc-attach loempiashop
root@loempiashop:~#
In een shell in de container installeren we alle packages die we willen hebben
root@loempiashop:~# apt update && apt install apache2 mariadb-server php php-mysql curl
En starten we de services:
root@loempiashop:~# systemctl enable --now apache2
root@loempiashop:~# systemctl enable --now mariadb
Eerst kijken we wat het ip van de container is
root@loempiashop:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:19:0e:2c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.3.119/24 metric 1024 brd 10.0.3.255 scope global dynamic eth0
valid_lft 2569sec preferred_lft 2569sec
inet6 fc11:4514:1919:810:216:3eff:fe19:e2c/64 scope global mngtmpaddr noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe19:e2c/64 scope link
valid_lft forever preferred_lft forever
root@loempiashop:~#
Het ip voor deze container is 10.0.3.119
. De meeste php pagina's van de loempiashop zullen crashen omdat de database niet is opgezet, maar je kan bijvoorbeeld al bij de /images
folder:
Op de commandline kunnen we de database opzetten
root@loempiashop:~# mysql -e "CREATE DATABASE loempiashop;"
root@loempiashop:~# mysql -e "CREATE USER 'loempiashop'@'localhost' IDENTIFIED BY 'hunter2';"
root@loempiashop:~# mysql -e "GRANT ALL PRIVILEGES ON loempiashop.* TO 'loempiashop'@'localhost';"
root@loempiashop:~# mysql -u loempiashop -phunter2
<plak database schema>
De website is nu functioneel:
De apache gebruiker www-data
moet schrijfrechten hebben op de /var/www/html/images
folder
root@loempiashop:~# chown :www-data /var/www/html/images
root@loempiashop:~# chmod g+w /var/www/html/images/
We voegen de rein gebruiker toe voor privilige escalation
root@loempiashop:~# useradd -m -p kaassouffle rein
root@loempiashop:~# usermod -aG sudo rein
Stop de container
root@r-mint ~# lxc-stop loempiashop
Er zijn een aantal bestanden aangemaakt door mij
root@r-mint ~# ls -la /var/lib/lxc/loempiashop/rootfs/root/
total 28
drwx------ 1 root root 108 Oct 15 16:43 ./
drwxr-xr-x 1 root root 132 Oct 15 16:47 ../
-rw------- 1 root root 1505 Oct 15 16:47 .bash_history
-rw-r--r-- 1 root root 571 Apr 10 2021 .bashrc
-rw------- 1 root root 11714 Oct 15 16:32 .mysql_history
-rw-r--r-- 1 root root 161 Jul 9 2019 .profile
drwx------ 1 root root 0 Oct 14 07:25 .ssh/
-rw------- 1 root root 1015 Oct 15 16:43 .viminfo
De bestanden die ik perongeluk aangemaakt heb verwijder ik weer:
root@r-mint ~# rm /var/ rm /var/lib/lxc/loempiashop/rootfs/root/{.viminfo,.bash_history,.mysql_history}
Ik verwijder ook de logs van apache en de systemd journal:
root@r-mint ~# rm -rf /var/lib/lxc/loempiashop/rootfs/var/log/apache2/* /var/lib/lxc/loempiashop/rootfs/var/log/journal/443e8d8c67d441d0ae86a574acabc7ae/
root@r-mint ~# tar -cJf loempiashop.tar.xz -C /var/lib/lxc/loempiashop/
root@r-mint ~# ls -lah loempiashop.tar.xz
-rw-r--r-- 1 root root 143M Oct 15 16:58 loempiashop.tar.xz
root@r-mint ~# tar -tf loempiashop.tar.xz --exclude '*/*/*'
./
./rootfs/
./config
Deze tarball kan nu door iemand uitgepakt worden in /var/lib/lxc
en dan kan de container meteen uitgevoerd worden