Skip to content

Instantly share code, notes, and snippets.

@LevitatingBusinessMan
Created October 15, 2024 15:01
Show Gist options
  • Save LevitatingBusinessMan/0d6f81a2ea3fafdc400a678bf0fd29a7 to your computer and use it in GitHub Desktop.
Save LevitatingBusinessMan/0d6f81a2ea3fafdc400a678bf0fd29a7 to your computer and use it in GitHub Desktop.
lxc loempiashop

Een loempiashop box maken met lxc

LXC installatie

lxc kan geintalleerd worden op praktish alle distributies met de lxc package.

Een container aanmaken

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 loempiashop installeren

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();
	  }
?>

LXC networking opzetten

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

Een shell openen in de container

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:~#

Packages installeren

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

Toegang tot de website

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:

images

De database opzetten

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:

Laatste aanpassingen

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

Opschonen

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/

Verpakken

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment