Post

cwwk KVM - Serveur virtuel Debian 12 (vm-deb2), test nextcloud

cwwk KVM - Serveur virtuel Debian 12 (vm-deb2), test nextcloud

Comment installer Debian 12 sur un serveur KVM grâce à l’utilisation de l’une des images cloud officielles de Debian. Se connecter via ssh sur la machine qui héberge QEMU/KVM

Debian cloud images

debian-cloud
Si vous exploitez un nuage privé ou une plateforme de virtualisation fonctionnant avec KVM, comme OpenStack et oVirt. La manière la plus idéale de faire tourner une machine virtuelle Debian 12 est d’utiliser une image de nuage. Dans ce blog, nous vous montrons comment télécharger l’image officielle du nuage Debian 12 et créer une instance de machine virtuelle à partir de celle-ci sur l’hyperviseur KVM.

  • generic : Doit fonctionner dans n’importe quel environnement
  • genericcloud : devrait fonctionner dans n’importe quel environnement virtualisé. Il est plus petit que generic car il exclut les pilotes pour le matériel physique.
  • nocloud : Principalement utile pour tester le processus de construction lui-même. N’a pas installé cloud-init, mais permet à l’utilisateur de se connecter en tant que root sans mot de passe.

Prérequis

Les packages cloud-utils et whois

1
sudo apt update && sudo apt install cloud-utils whois -y

cloud-utils est nécessaire pour exécuter la commande cloud-localds , pour créer l’image ISO cloud init ultérieurement et valider la configuration cloud-init.
whois pour exécuter la commande mkpasswd ultérieurement si nous voulons l’utiliser pour générer la version hachée de notre mot de passe pour la configuration cloud-init.

L’extension php8.x-yaml donne accès au standard de sérialisation YAML Ain’t Markup Language (YAML).
L’analyse syntaxique et la production de données sont effectuées par la bibliothèque » LibYAML.

1
sudo apt install php8.3-yaml

Le paquet libguestfs-tools, qui contient l’utilitaire virt-sysprep

1
sudo apt install libguestfs-tools

Télécharger Image cloud debian

Télécharger la dernière image debian bookworm generic dans le dossier /srv/kvm/libvirt/images/ en la renommant deb2.qcow2

1
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2 -O /srv/kvm/libvirt/images/deb2.qcow2

Choisir un nom

Tout d’abord, choisissez un nom pour votre nouveau VPS. Je crée toujours un invité « modèle », à partir duquel je le clone ensuite pour créer les autres invités

VM_NAME=”vm-deb2”

Augmenter la taille du disque

L’image qcow2 que nous avons extraite était destinée à une très petite machine virtuelle qui manquera rapidement d’espace si vous commencez à l’utiliser pour quoi que ce soit. Je recommanderais d’augmenter la taille du disque à la taille souhaitée pour la machine virtuelle. Dans ce cas, je règle 20 Go.

1
2
3
4
5
6
DESIRED_SIZE=12G
DOSSIER="/srv/kvm/libvirt/images"

sudo qemu-img resize \
  $DOSSIER/deb2.qcow2 \
  $DESIRED_SIZE

Générer une paire de clés SSH

Génération

1
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vm-deb2

La clé publique

1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJkwn15syqfLql9YFdZSZzgthj4qyEd65GnoZ+iXgdYc yick@cwwk

Créer un fichier de configuration cloud

Script PHP modifiable pour générer un fichier cloud-config.cfg

Télécharger le script

1
wget https://files.programster.org/tutorials/cloud-init/create-debian-12-kvm-guest-from-cloud-image/generate.php -O generate-cloud-cfg.php

Remplissez les paramètres en haut du script generate-cloud-cfg.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

# Fill in these settings as appropriate to you.

# Set the hostname for the guest.
$hostname = "vm-deb2";

# Specify your username and password
$username = "debyan";
$password = "debyan49";

# Set a random salt string here for password hashing
$randomSaltString = '9120794cd6920b7c74d7';

# Specify the public keys of the private-keys you wish to login with.
$sshPublicKeys = [
    'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJkwn15syqfLql9YFdZSZzgthj4qyEd65GnoZ+iXgdYc yick@cwwk',
];

##### End of settings. Do not edit below this line #######
##########################################################

Exécutez ensuite le script pour générer votre fichier cloud-init.cfg

1
php generate-cloud-cfg.php

Ce script nécessite que vous ayez installé l’extension PHP YAML

Créer le fichier d’initialisation ISO du cloud

Créez le fichier ISO à partir du fichier de configuration cloud que nous venons de créer :

1
2
3
sudo cloud-localds \
  cloud-init.iso \
  cloud-init.cfg

Dans le dossier courant

1
2
3
generate-cloud-cfg.php
cloud-init.cfg
cloud-init.iso

Dans la Liste des types d’image sudo virt-install --osinfo list |grep debian, debian 12 n’existe pas donc le type sera debiantesting

Créer l’invité virtuel en exécutant la commande suivante :

1
2
3
4
5
6
7
8
9
10
11
sudo virt-install \
  --osinfo debiantesting \
  --name vm-deb2 \
  --memory 8092 \
  --vcpus 2 \
  --cpu host \
  --disk /srv/kvm/libvirt/images/deb2.qcow2,device=disk,bus=virtio \
  --cdrom cloud-init.iso \
  --graphics vnc \
  --network bridge=br0 \
  --import

Après avoir exécuté la commande précédente

Le serveur debian cwwk n’a pas d’affichage, il faut créer un tunnel ssh depuis un poste client

1
ssh -L 5900:127.0.0.1:5900 yick@192.168.0.205 -p 55205 -i /home/yann/.ssh/yick-ed25519

Puis lancer de ce même poste un client VNC (TigerVNC viewer)

la console s’affiche

ATTENTION Clavier qwerty
Saisir utilisateur/Mot de passe

Relever adresse IP : ip a –> 192.168.10.16

Connexion SSH

Dans un terminal du serveur debian cwwk

Se connecter SSH avec la clé

1
ssh debyan@192.168.10.16 -i .ssh/vm-deb2

Définir un mot de passe root.

1
2
sudo -s
passwd root

KVM debian virtuel vm-deb2

Définir le fuseau horaire

Définir le fuseau horaire sur Europe/Paris

1
sudo dpkg-reconfigure tzdata

Réseau (netplan)

netplan est utilisé comme gestionnaire réseau avec l’image debian cloud

Basculer en mode root

Pour désactiver les capacités de configuration réseau de cloud-init, écrire un fichier /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

1
echo "network : {config : disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

Les périphériques du réseau

1
ip link show
1
2
3
4
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:52:fe:c0 brd ff:ff:ff:ff:ff:ff

Netplan est un utilitaire qui permet de configurer facilement le réseau sous Linux.

Les fichiers de configuration sont dans le dossier /etc/netplan
On retire les fichiers de configuration originaux

1
2
mkdir /etc/backup.netplan
mv /etc/netplan/* /etc/backup.netplan/

Configuration statique de l’interface enp1s0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bash -c 'cat << EOF > /etc/netplan/01-enp1s0.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      addresses:
        - 192.168.10.110/24
      nameservers:
        addresses:
        - 1.1.1.1
        - 9.9.9.9
        search: []
      routes:
      - to: default
        via: 192.168.10.1
EOF'

Droits

1
chmod 600 /etc/netplan/01-enp1s0.yaml

Et on génère la configuration

1
netplan generate

Cannot call openvswitch: ovsdb-server.service is not running
Il s’agit juste d’un avertissement…

Redémarrer la machine virtuelle

Connexion ssh vm-deb2

A - Dans un terminal du serveur debian cwwk

Se connecter SSH avec la clé et la nouvelle adresse

1
ssh debyan@192.168.10.110 -i .ssh/vm-deb2

B - Dans un terminal du poste linux PC1

1
2
3
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/cwwk-vm-deb2
# droits
chmod 600 ~/.ssh/cwwk-vm-deb2

Ajouter la clé publique au fichier ~/.ssh/authorized_keys de la machien virtuelle

1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHxD7ROqzMsYKG0QseNLNgpltPooT71NvaNxMpcHop8j yann@PC1

Utilisation commande proxy pour se connecter depuis PC1 vers la machine virtuelle vm-deb2

1
ssh -o ProxyCommand="ssh -W %h:%p -p 55205 -i /home/yann/.ssh/yick-ed25519 yick@192.168.0.205" debyan@192.168.10.110 -p 22 -i /home/yann/.ssh/cwwk-vm-deb2

Domaine local et certificats

Les opérations suivantes sont à effectuer sur le serveur Debian 12 CWWK rnmkcy.eu

Local cloud.home.arpa

CWWK X86-P5 Intel N100 Serveur Debian 12 - Gérer un domaine local

En mode su

Création domaine local cloud.home.arpa, modidier le fichier /etc/unbound/unbound.conf.d/cwwk-unbound.conf
Ajouter les lignes suivantes et enregitrer

1
2
    local-data: "cloud.home.arpa 86400 IN A 192.168.10.110"
    local-data-ptr: "192.168.10.110 86400 cloud.home.arpa."

Vérifier la configuration

1
unbound-checkconf /etc/unbound/unbound.conf.d/cwwk-unbound.conf

Une fois tout configuré et Unbound relancé

1
systemctl restart unbound

Tester avec dig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
yick@cwwk:~$ dig cloud.home.arpa

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> cloud.home.arpa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52984
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;cloud.home.arpa.		IN	A

;; ANSWER SECTION:
cloud.home.arpa.	86400	IN	A	192.168.10.110

;; Query time: 0 msec
;; SERVER: 192.168.0.205#53(192.168.0.205) (UDP)
;; WHEN: Thu Mar 27 12:51:58 CET 2025
;; MSG SIZE  rcvd: 60

yick@cwwk:~$ dig -x 192.168.10.110

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -x 192.168.10.110
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61131
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;110.10.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
110.10.168.192.in-addr.arpa. 86400 IN	PTR	cloud.home.arpa.

;; Query time: 0 msec
;; SERVER: 192.168.0.205#53(192.168.0.205) (UDP)
;; WHEN: Thu Mar 27 12:52:15 CET 2025
;; MSG SIZE  rcvd: 81

Certificats mkcert

Mkcert est un outil simple qui peut être utilisé pour fabriquer des certificats de confiance localement.

Générer des certificats SSL auto-signés avec mkcert

Installer mkcert

1
2
3
4
5
6
7
8
9
10
11
# installer mkcert
sudo apt install mkcert
# Générer autorité de certification CA
mkcert -install
# Localisation
mkcert -CAROOT  # --> /home/yick/.local/share/mkcert
# Contenu 
ls /home/yick/.local/share/mkcert # --> rootCA-key.pem  rootCA.pem
# Validité autorité de certification
openssl x509 -noout -text -in /home/yick/.local/share/mkcert/rootCA.pem  |grep "Not After"
# --> Not After : Mar 27 08:12:19 2035 GMT

Générer un certificat local pour le domaine cloud.home.arpa

1
mkcert cloud.home.arpa

Résultat exécution

1
2
3
4
5
6
Created a new certificate valid for the following names 📜
 - "cloud.home.arpa"

The certificate is at "./cloud.home.arpa.pem" and the key at "./cloud.home.arpa-key.pem" ✅

It will expire on 27 June 2027 🗓

Le certificat se retrouve dans le dossier où vous avez exécuté la commande mkcert

Copier certificats sur machine virtuelle

Nous disposons du certificat d’une autorité de certification : rootCA.pem et du certificat pour le domaine cloud.home.arpa

Copier les fichiers suivants: rootCA.pem cloud.home.arpa-key.pem et cloud.home.arpa.pem sur la machine virtuelle

1
2
3
4
5
# syntaxe : scp -i ~/.ssh/id_rsa.pub FILENAME USER@SERVER:/home/USER/FILENAME
scp -i .ssh/vm-deb2 $(mkcert -CAROOT)/rootCA.pem debyan@192.168.10.110:/home/debyan/rootCA.pem
scp -i .ssh/vm-deb2 cloud.home.arpa-key.pem debyan@192.168.10.110:/home/debyan/cloud.home.arpa-key.pem
scp -i .ssh/vm-deb2 cloud.home.arpa.pem debyan@192.168.10.110:/home/debyan/cloud.home.arpa.pem

Sur la machine virtuelle

Activer l’autorité de certification

1
2
sudo mv rootCA.pem /usr/local/share/ca-certificates/mkcert.pem
sudo update-ca-certificates

Tester certificat avec nginx

Déplacer le certificat et sa clé

1
mv cloud.home.arpa* /etc/ssl/private/

Créer un fichier de configuration /etc/nginx/conf.d/cloud.home.arpa.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat <<EOF >>/etc/nginx/conf.d/cloud.home.arpa.conf
server {
  listen  80;
  server_name cloud.home.arpa;
  return 301 https://$server_name$request_uri;
  root /var/www/html;
}
server {
  listen *:443 ssl http2;
  server_name cloud.home.arpa;
  ssl_certificate /etc/ssl/private/cloud.home.arpa.pem;
  ssl_certificate_key /etc/ssl/private/cloud.home.arpa-key.pem;
  root /var/www/html;
}
EOF

Créer un dossier /var/www/html

1
mkdir -p /var/www/html

Fichier index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat <<EOF >>/var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cloud.home.arpa</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>cloud.home.arpa</h1>
<p>Test du certificat local généré par mkcert</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
</p>

<p><em>Page de test</em></p>
</body>
</html>
EOF

Recharger nginx: sudo systemctl reload nginx
Tester le lien https://cloud.home.arpa

Nextcloud

Nginx PHP MariaDB Nextcloud Hub

Installation nginx + PHP8.3 + MariaDB

Installer Nextcloud Hub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mode su
# installer bzip2
apt install bzip2
# téléchargement
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# checksum et vérification
#wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256
#sha256sum -c latest.tar.bz2.sha256 < latest.tar.bz2 
# Décompression, déplacement et effacement
tar -xvf latest.tar.bz2
mv nextcloud /var/www/
rm latest.tar.bz2
# Utilisateur nextcloud et droits
useradd -r nextcloud
chown -R nextcloud:www-data /var/www/nextcloud
chmod -R o-rwx /var/www/nextcloud

Pool PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
cat > /etc/php/8.3/fpm/pool.d/nextcloud.conf << EOF
[nextcloud]

user = nextcloud
group = nextcloud

chdir = /var/www/nextcloud

listen = /var/run/php/php8.3-fpm-nextcloud.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 16
pm.max_requests = 500
request_terminate_timeout = 1d


pm.start_servers = 6
pm.min_spare_servers = 5
pm.max_spare_servers = 8


; Additional php.ini defines, specific to this pool of workers.
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
php_admin_value[memory_limit] = 512M
php_value[upload_max_filesize] = 10G
php_value[post_max_size] = 10G
php_value[default_charset] = UTF-8
php_value[opcache.enable_cli]=1
php_value[opcache.memory_consumption]=256
php_value[opcache.interned_strings_buffer]=128
php_value[opcache.max_accelerated_files]=32530
php_value[opcache.save_comments]=1
php_value[opcache.revalidate_freq]=60
php_value[opcache.jit]=1255
php_value[opcache.jit_buffer_size]=128M
php_value[apc.enabled]=1
php_value[apc.enable_cli]=1
EOF

Redémarrer

1
systemctl restart php8.3-fpm

Configuration ssl: nginx 1.22.1 et OpenSSL 3.0.15

Créer en conséquence le fichier le fichier /etc/nginx/conf.d/security.conf.inc ci-dessous suivant le résultat de la requête précédente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    ssl_certificate /etc/ssl/private/cloud.home.arpa.pem;
    ssl_certificate_key /etc/ssl/private/cloud.home.arpa-key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/ssl/private/cloud.home.arpa.pem;

    # replace with the IP address of your resolver;
    # async 'resolver' is important for proper operation of OCSP stapling
    resolver 1.1.1.1;

Le fichier de configuration web cloud.rnmkcy.eu.conf /etc/nginx/conf.d/cloud.home.arpa.conf

  • Il faut modifier le fichier “mime.types” situé dans /etc/nginx/ : application/javascript js mjs;
  • Redémarrer php et nginx : sudo systemctl restart php8.3-fpm nginx

Ouvrir le lien https://cloud.home.arpa

ATTENTION: il est possible d’arriver sur un écran noir, touche esc pour retour normal

Cet article est sous licence CC BY 4.0 par l'auteur.