Ce document contient les livrables issus de la phase de création des templates pour les OS Debian 12 et Rocky Linux 9. L’objectif est de pouvoir disposer de templates de VM afin de créer facilement des clones complets pour avoir une configuration de base pour l’ensemble de nos VM (utilisateur, clés SSH, installation des paquets de base, …)


1. Import des images ISO

Nous avons besoin des ISO suivants pour réaliser la création de nos templates.

Distribution Version Adresse de téléchargement de l’ISO
Debian 12.10 Download
Rocky Linux 9.5 Download

2. Création des templates

Les opérations sont les mêmes pour les deux distributions. Au niveau de Proxmox lors de la création des VM nous allons attribuer les ID 10001 et 10002 (la convention de nommage pour les templates 1000X pour notre homelab), activer le qemu guest agent, créer un disque SCSI de 20Go avec émulation SSD, 1 vCPU, 2048 Mo de RAM avec le ballooning activé, une carte réseau positionnée sur le vmbr0 pour avoir un accès par pont au réseau local puis le tag templates. Les éléments suivants vont être configurés pour les deux VM créées à partir des ISO précédemment récupérés.

Item Debian 12.10 Rocky Linux 9.5
Agent QEMU Installé (qemu-guest-agent package) Installé (qemu-guest-agent package)
Hostname debian12-template rocky9-template
Domaine homelab homelab
Partitionnement LVM (/boot 512Mo, / 10Go, /home 3Go, /var 5Go, SWAP 1Go ) LVM (/boot 512Mo, / 10Go, /home 3Go, /var 5Go, SWAP 1Go )

3. Configuration basique de l’OS

Voici la procédure utilisée pour configurer l’OS qui va servir de template

3.1 Mise à jour de l’OS

# Mise à jour du cache du gestionnaire de paquet et mise à jour des packages
# Debian12
apt update && apt upgrade -y

# Rocky9
sudo yum update -y

3.2 Installation de SSH et Sudo

# Installation du serveur openssh et sudo
apt install -y openssh-server sudo

3.3 Création de l’utilisateur ansible et gestion de la paire de clé associée

# Création de l'utilisateur ansible
sudo useradd --create-home --shell /bin/bash --groups sudo ansible

Nous allons créer les paires de clés pour l’utilisateur d’administration ngobert ainsi que pour l’utilisateur ansible.

sudo mkdir /root/identites
sudo ssh-keygen -t ed25519 -f /root/identites/id_admin -C "Utilisateur d'administration"
sudo ssh-keygen -t ed25519 -f /root/identites/id_ansible -C "Utilisateur Ansible"

À partir du chapitre 10, “Coffre fort”, nous pourrons nous servir de la solution VaultWarden pour stocker les clés SSH précédemment générées.

Ces clés doivent être stockées dans un environnement sécurisé. On peut autoriser notre clé privée à se connecter sur les machines en collant le contenu de la clé publique (*.pub) au niveau du fichier /home/ngobert/.ssh/authorized_keys et du fichier /home/ansible/.ssh/authorized_keys

## 3.4 Configuration temporaire du réseau

# Configuration du réseau (adresse IP standard non utilisable dans ce contexte)
# Debian12
sudo vim /etc/network/interfaces
[...]
auto eth0
iface eth0 inet static
    address 192.168.100.10/24 # Pour Debian12
    gateway 192.168.100.254

# Rocky9
nmtui

3.5 Configuration de sudo pour l’utilisateur ansible

Enfin, nous offrons la possibilité à l’utilisateur ansible d’exécuter toutes les commandes avec sudo sans demande de saisie du mot de passe. Pour cela, nous créons le fichier /etc/sudoers.d/ansible avec la ligne suivante

ansible ALL=(ALL) NOPASSWD: ALL

## 3.6 Durcissement de la configuration du daemon sshd

Nous modifions la configuration du daemon sshd pour améliorer la sécurité en autorisant uniquement la connexion ssh avec les utilisateurs ngobert et root avec une clé, on écoute uniquement sur l’interface choisie, etc.

Voici le contenu du fichier /etc/ssh/sshd_config

Include /etc/ssh/sshd_config.d/*.conf

Port 22
ListenAddress 192.168.100.10
LogLevel INFO
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
KbdInteractiveAuthentication no
UsePAM yes
AllowAgentForwarding yes
AllowTcpForwarding yes
X11Forwarding yes
PrintMotd no
PrintlastLog no
PermitTunnel no
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server
AllowUsers ngobert root ansible

3.7 Mise en place de fail2ban

Toujours dans l’optique d’améliorer la sécurité, nous installons et configurons la solution fail2ban pour SSH

sudo apt install -y fail2ban

Nous créons le fichier /etc/fail2ban/jail.d/ssh.conf avec les éléments suivants

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd

Nous activons le daemon au démarrage du système et on l’exécute maintenant

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

3.8 Mise en place de nftables

Enfin, pour durcir davantage la sécurité du serveur, nous installons et configurons le firewall nftables.

sudo apt install -y nftables

Nous activons le daemon nftables au démarrage du système

sudo systemctl enable nftables

Nous modifions sommairement le fichier de configuration de nftables pour appliquer une autorisation vers le port 22 pour les connexions ssh.

ansible-core.homelab représente le serveur Ansible mis en place au chapitre 8.

#!/usr/sbin/nft -f

table inet filter {
  chain input {
    type filter hook input priority 0;
    policy drop;
    iif lo accept
    ct state established,related accept

    ip protocol icmp accept

    ip saddr {{ admin-core.homelab, ansible-core.homelab }} iifname "ens19" tcp dport 22 accept
  }

  chain forward {
    type filter hook forward priority 0;
    policy drop;
  }

  chain output {
    type filter hook output priority 0;
    policy accept;
  }
}

Nous vérifions la syntaxe du fichier de configuration /etc/nftables.conf, puis nous appliquons les modifications en faisant un restart du daemon

sudo nft -c -f /etc/nftables.conf
sudo systemctl restart nftables