Ce document contient les livrables issus de la mise en place du service kresus, une solution de gestion des comptes bancaires.


1. Création de la VM

Nous allons utiliser le template debian12-template créé lors du chapitre 4. Sur Proxmox on crée un clone complet à partir de ce template. Voici les caractéristiques de la VM :

OS Hostname Adresse IP Interface réseau vCPU RAM Stockage
Debian 12.10 kresus-vms 192.168.200.4 vmbr2 (vms) 1 2024 20Gio

Il faut également penser à activer la sauvegarde automatique de la VM sur Proxmox en l’ajoutant au niveau de la politique de sauvegarde précédemment créée.


2. Modification mineure de l’OS

Modification de la configuration réseau avec le fichier /etc/network/interfaces

auto ens19
iface ens19 inet static
    address 192.168.200.4/24
    gateway 192.168.200.4

Un point important ! Pendant la création du template debian12-template la désactivation de l’IPv6 n’a pas été faite. Il faut donc faire cela à la main pour chaque VM déployées et noter l’information quelque part pour ajouter cette configuration lorsque nous aurons Ansible pour le déploiement des VM.

Désactivation permanente de l’IPv6. Nous devons éditer ce fichier de configuration /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Enfin, nous devons recharger la configuration courante.

sudo sysctl -p

A présent, nous changeons le hostname de la VM pour que ce soit kresus-vms.homelab, puis nous modifions le contenu de son résolveur DNS local /etc/hosts

sudo hostnamectl set-hostname kresus-vms.homelab

Nous allons maintenant modifier la configuration du résolveur DNS de la machine.

# Installation du daemon systemd-resolved
sudo apt install -y systemd-resolved

# Purge de resolvconf (obsolète)
sudo apt purge resolvconf

# Activation au démarrage du daemon systemd-resolved
sudo systemctl enable systemd-resolved --now

# Modification du fichier /etc/systemd/resolved.conf avec les éléments suivants
DNS=192.168.100.253
FallbackDNS=1.1.1.1
Domains=~.

# Restart du daemon systemd-resolved
sudo systemctl restart systemd-resolved

# Suppression du fichier /etc/resolv.conf
sudo rm /etc/resolv.conf

# Création du nouveau lien symbolique avec /etc/resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf  /etc/resolv.conf

A présent, on peut tester que les résolutions DNS des noms de domaine internes .homelab et concernant les services exposés .ng-hl.com ainsi que les noms de domaines externes fonctionnent correctement en passant par notre serveur DNS dns-core.homelab accessible via l’IP 192.168.100.253

resolvectl status
Global
          Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
   resolv.conf mode: stub
 Current DNS Server: 192.168.100.253
Fallback DNS Servers 1.1.1.1
          DNS Domain ~.

Link 2 (ens19)
Current Scopes: LLMNR/IPv4
     Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported

Enfin, on teste quelques résolutions DNS avec notre nouvelle configuration

dig +short dns-core.homelab
192.168.100.253
dig +short google.com
216.58.214.78

3. Installation de Kresus

Il est nécessaire d’installer Docker engine pour procéder à la mise en place de kresus via docker compose

On crée le volume Docker pour avoir la persistance des données concernant la base de données PostgreSQL

docker volume create pgdata

Nous utilisons Docker compose pour disposer de deux containers. Le premier étant celui qui porte l’applicatif kresus et le second va permettre de load-balancer le trafic arrivant en HTTPS vers le container kresus. On crée le fichier /opt/kresus/docker-compose.yml

---
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: <db_user>
      POSTGRES_PASSWORD: <db_password>
      POSTGRES_DB: <db_name>
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

  kresus:
    image: bnjbvr/kresus
    container_name: kresus
    restart: unless-stopped
    ports:
      - "9876:9876"
    volumes:
      - ./config/kresus.cfg:/config/kresus.cfg:ro
    environment:
      - NODE_ENV=production
      - KRESUS_DB_TYPE=postgres
      - KRESUS_DB_HOST=postgres
      - KRESUS_DB_PORT=5432
      - KRESUS_DB_USERNAME=<db_user>
      - KRESUS_DB_PASSWORD=<db_password>
      - KRESUS_DB_NAME=<db_name>
      - KRESUS_AUTH=<username>:<password>
    depends_on:
      - postgres

  kresus-nginx:
    image: nginx:stable-alpine
    container_name: kresus-nginx
    restart: unless-stopped
    ports:
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certs:/etc/ssl/private:ro
    depends_on:
      - kresus

volumes:
  pgdata:

Nous importons les éléments nécessaires au niveau du répertoire /opt/kresus/certs pour que le certificat wildcard puisse s’appliquer correctement.

mkdir -p /opt/kresus/certs

On se positionne en tant que root sur la vm acme-core qui contient le certificat et la clé privée associée, puis on téléverse les éléments au niveau de notre server kresus-vms.homelab

scp /etc/ssl/certs/wildcard.ng-hl.com/fullchain.pem [email protected]:/opt/kresus/certs/
scp /etc/ssl/private/wildcard.ng-hl.com/privkey.key [email protected]:/opt/kresus/certs/privkey.pem

Nous créons le fichier de configuration de nginx /opt/kresus/nginx/conf.d/kresus.conf

server {
    listen 443 ssl;
    server_name kresus.ng-hl.com;

    ssl_certificate     /etc/ssl/private/fullchain.pem;
    ssl_certificate_key /etc/ssl/private/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass         http://kresus:9876;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Il est nécessaire d’autoriser le flux HTTPS depuis l’interface WAN de pfSense vers l’alias kresus_vms pointant vers l’ip 192.168.200.4 soit le service exposé kresus.ng-hl.com


Renouvellement automatique du certificat TLS

Se connecter en tant que root sur la VM acme-core, puis ajouter les informations suivantes au niveau du fichier /root/acme-deploy/targets.yml

- host: kresus-vms.homelab
  user: ngobert
  type: docker
  cert_path: /opt/kresus/certs/
  privkey_name: privkey.pem
  reload_cmd: "cd /opt/kresus && docker compose restart"

On peut tester que le nouveau service est bien pris en compte en forçant l’exécution de acme avec le script ci-dessous

/root/acme-deploy/acme-deploy.sh