Atelier SysRes SE4 2024/2025 E1
Projet Virtualisation Sarah DEPARIS - Machine Moon
L'objectif de ce projet est d'installer et configurer des machines virtuelles destinées à héberger des services sur un environnement Xen
Création des machines virtuelles
Les machines virtuelles sont créées sur le Dom0 capbreton.plil.info
.
Pour la création des commutateurs virtuels du réseau routé de la promotion et des réseaux privés on a :
- modifié le fichier
/etc/network/interfaces
du Dom0 pour décrire le commutateur du réseau routé.
- créé un fichier dans le répertoire
/etc/network/interfaces.d
du Dom0 pour créer notre pont.
Dans la VM cap breton, pour voir les ponts :
Ensuite, nous avons pu commencé à créer nos 3 machines virtuelles sur Capbreton en utilisant la commande suivante :
root@capbreton:~# xen-create-image --hostname=SE4.Moon --dhcp --dir=/usr/local/xen --size=10G --dist=daedalus --memory=2G --bridge=pontKS
root@capbreton:~# xen-create-image --hostname=SE4.Solstice --dhcp --bridge=pontKS --dir=/usr/local/xen --size=10GB --dist=daedalus --memory=2048M --force
2 machines de services ( Moon et Apollo ) qui joueront un rôle clé dans l'hébergement des services, et 1 machine mandataire ( Solstice ) qui assurera la gestion du réseau et de l'interconnexion avec l'extérieur,
- Nom de la machine de service : SE4.Moon
- Taille du disque : 10G
Configuration de la VM dans : /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
XEN LIST
Affiche des informations sur les machines virtuelles (VM) qui sont actuellement gérées par Xen. Cette commande fournit des détails sur l'état de chaque machine virtuelle, comme : si elle est en cours d'exécution, son nom, son identifiant (ID), et d'autres informations.
root@capbreton:~# xen list
Name ID Mem VCPUs State Time(s)
Domain-0 0 3970 4 r----- 83423.2
SE4.Solstice 39 2048 1 -b---- 2560.1
SE4.Apollo 118 2048 1 -b---- 462.7
SE4.Moon 119 2048 1 -b---- 452.3
Liste des commandes utiles :
Fonction | Commande |
---|---|
listes des VMs allumées | xen list
|
Allumer la VM | xen create /etc/xen/SE4.Moon.cfg
|
Connexion à la VM | xen console SE4.Moon
|
Eteindre la VM | xen shutdown SE4.Moon
|
Configuration du réseau | Modification du fichier /etc/network/interfaces
|
Remarque :
Problème login : Ctrl + AltGr + ] => vi => :q! => reconnexion
Le mot de passe de la VM est dans /var/log/xen-tools/SE4.Moon.log
Pour changer le nom de la VM :
vi /etc/hostname
Configuration de la machine de services Moon
Création et Configuration de Partitions LVM pour le Montage de /var et /home sur la Machine Virtuelle
Création de partitions LVM pour /var et /home
Objectif : Afin de séparer les données utilisateur et applicatives du système principal, nous avons créé deux partitions LVM de 10G chacune, dédiées respectivement à /var
et /home
. Cette séparation facilite la gestion, la sauvegarde et la récupération des données en cas de problème
De plus, séparer /var
et /home
permet d’isoler les données utilisateur et applicatives du système principal, facilitant ainsi la gestion, la sauvegarde et la récupération des données en cas de problème.
Nous devons :
- Modifier la configuration de la machine virtuelle pour monter ces partitions sous
/var
et/home
. - Transférer les fichiers de
/var
avant de modifier le point de montage pour éviter la perte de données. - Mettre à jour
/etc/fstab
pour un montage automatique des partitions au démarrage.
Création des Fichiers de Partition
Depuis le serveur Capbreton, on a créé 2 fichiers de partitions dans /dev/virtual
pour chaque machines de services pour Moon SE4.Moon.var et SE4.Moon.home :
root@capbreton:/dev/virtual# ls
SE4.Apollo.var SE4.Apollo.home SE4.Moon.var SE4.Moon.home
Après la création de nos partitions, nous avons modifié le fichier /etc/xen/SE4.Moon.cfg
de la VM sur capbreton pour y ajouter les deux répertoires.
disk = [ 'file:/usr/local/xen/domains/SE4.Moon/disk.img,xvda2,w',
'file:/usr/local/xen/domains/SE4.Moon/swap.img,xvda1,w',
'phy:/dev/virtual/SE4.Moon.home,xvdb,w',
'phy:/dev/virtual/SE4.Moon.var,xvdc,w', ]
Création et formatage des partitions
mkfs -t ext4 /dev/xvdb # Formatage de la partition pour /var
mkfs -t ext4 /dev/xvdc # Formatage de la partition pour /home
Préparer les partitions et déplacer les données :
- Montage temporaire des partitions dans
/mnt
:
Pour pouvoir déplacer les données, nous avons du monter les nouvelles partitions LVM dans un répertoire temporaire /mnt
. On a créé 2 partitions une pour /var
et une /home
sous les noms xvdb et xvdc dans /dev
,que l'on monte avec :
mount /dev/xvdb /mnt
mount /dev/xvdc /mnt
- Déplacement des fichiers existants
mv /var/* /mnt # Déplacement des fichiers de /var vers la nouvelle partition
Démonter les partitions temporaires :
Avant de configurer les montages permanents, on démonte les partitions des répertoires temporaires (/mnt
)
umount /mnt # Démontage après transfert des données
Modification du fichier /etc/fstab
pour un montage automatique au démarrage :
On modifie le fichier /etc/fstab
, qui contient la liste des partitions.
Ajout des nouvelles partitions LVM au fichier /etc/fstab
:
- /dev/xvdb /var ext4 defaults 0 2
- /dev/xvdc /home ext4 defaults 0 2
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/xvda1 none swap sw 0 0
/dev/xvda2 / ext4 noatime,nodiratime,errors=remount-ro 0 1
/dev/xvdb /var ext4 defaults 0 2
/dev/xvdc /home ext4 defaults 0 2
Monter les partitions définies dans fstab
:
Pour monter toutes les partitions définies dans le fichier /etc/fstab
:
mount -a # Remontage des partitions définies dans fstab
Cette commande monte toutes les partitions qui ne sont pas encore montées et qui sont définies dans /etc/fstab
remet les données dans le fichier déplacer.
Puis, pour appliquer les changement nous avons redémarré la VM :
xen shutdown SE4.Moon
xen create /etc/xen/SE4.Moon.cfg
Vérification des partitions montées
Après avoir configuré le montage automatique et remonté les partitions, nous devons vérifier que les partitions sont correctement montées. Nous avons utilisé la commande df -h
pour afficher l'espace disque utilisé et disponible sur les partitions montées.
Cela nous permet de confirmer que les partitions /var
et /home
sont correctement montées sur les répertoires associés et qu'il n'y a pas de problème d'espace disque.
root@Moon:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 973M 0 973M 0% /dev
tmpfs 199M 108K 199M 1% /run
/dev/xvda2 9.8G 673M 8.6G 8% /
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 500M 0 500M 0% /dev/shm
/dev/xvdb 9.8G 229M 9.1G 3% /var
/dev/xvdc 9.8G 24K 9.3G 1% /home
Résumé des Commandes Utilisées
Étape | Commande |
---|---|
Création et formatage des partitions | mkfs -t ext4 /dev/xvdb
|
Montage temporaire des partitions | mount /dev/xvdb /mnt
|
Déplacement des données | mv /var/* /mnt
|
Démontage après transfert | umount /mnt
|
Ajout dans /etc/fstab
|
Ajout des entrées pour /var et /home
|
Montage automatique des partitions | mount -a
|
Vérification des partitions montées | df -h
|
Configuration du réseau | Modification du fichier /etc/network/interfaces pour configurer IPv6 et IPv4
|
Configuration du Réseau
Tout d'abord nous avons dû modifier /etc/xen/SE4.Moon.cfg
pour créer une interface eth1 sur le bridge de la promotion SE4
Dans la catégorie Networking, on retrouve une ligne vif à modifier.
Afin d’assurer une connectivité IPv6 stable et routée pour un accès direct à Internet, ainsi qu’une communication efficace avec la machine mandataire, nous avons modifié le fichier /etc/network/interfaces
.
De plus, une adresse IPv4 fixe a été attribuée sur le réseau privé afin de garantir une interaction optimale entre les machines de services et leur machine mandataire.
Mise à jour du fichier /etc/network/interfaces
# Interface loopback
auto lo
iface lo inet loopback
# Interface principale (eth0) - IPv4 statique + IPv6 automatique
auto eth0
iface eth0 inet static
address 172.16.0.3
netmask 255.255.255.0 # /24
gateway 172.16.0.1 # @mandataire
iface eth0 inet6 auto # Attribution automatique d'une IPv6
# Interface secondaire (eth1) - IPv6 automatique uniquement
auto eth1
iface eth1 inet6 auto
(remarque: on retire dhcp car probème avec ifup (erreur dhcp dicscover)) Pour appliquer les changements :
ifdown eth0 && ifup eth0
ifdown eth1 && ifup eth1
Cela désactive et réactive les interfaces sans redémarrer la machine. On peut également redémarrer le service réseau
systemctl restart networking
Pour obtenir les adresses ip route, ipv4, et ipv6 :
ip route show #172.16.0.1/24
ip -4 addr show #172.16.0.3/24
ip -6 addr show #2001:660:4401:60a0:216:3eff:fe6f:f548/64
On peut maintenant ping nos machines entre elles ( Moon et Appollo )
root@Moon:~# ping 172.16.0.2 #@IPv4 de Apollo
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from 172.16.0.2: icmp_seq=2 ttl=64 time=0.318 ms
64 bytes from 172.16.0.2: icmp_seq=3 ttl=64 time=0.369 ms
64 bytes from 172.16.0.2: icmp_seq=4 ttl=64 time=0.356 ms
--- 172.16.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3077ms
rtt min/avg/max/mdev = 0.132/0.293/0.369/0.095 ms
Installation des services essentiels
Pourquoi ?
- SSH : Permet l’accès à distance sécurisé à la machine pour l’administration et la maintenance.
- Apache2 (serveur Web) : Héberge des applications et sites web accessibles aux utilisateurs.
- Bind (serveur DNS) : Assure la résolution de noms de domaine, essentielle pour le bon fonctionnement des services sur le réseau.
Installation des paquetages sur Moon :
apt install -y openssh-server apache2 bind9
Détails des paquetages :
- openssh-server → Serveur SSH pour permettre l'accès à distance sécurisé.
- apache2 → Serveur Web Apache.
- bind9 → Serveur DNS BIND.
Après l'installation :
Vérifiez si les services sont en cours d'exécution :
systemctl status ssh apache2 bind9
Activez et démarrez les services si nécessaire :
systemctl enable --now ssh apache2 bind9
Configuration de la machine mandataire
De la même manière nous avons dû modifier /etc/xen/SE4.Solstice.cfg
pour créer une interface eth1 sur le bridge de la promotion SE4
Mise à jour du fichier /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
#Interface IPv4 priv pour le r seau interne (passerelle pour Apollo et M>auto eth0
iface eth0 inet static
address 172.16.0.1/24
#Interface IPv4 rout e pour l'acc s Internet
auto eth1
iface eth1 inet static
address 193.48.57.166/27
gateway 193.48.57.161 #passerelle routeur
#IPv6 automatique
iface eth1 inet6 auto
post-up nft -f /etc/nftables.conf
Pour appliquer les changements :
ifdown eth0 && ifup eth0
ifdown eth1 && ifup eth1
Cela désactive et réactive les interfaces sans redémarrer la machine. On peut également redémarrer le service réseau
systemctl restart networking
root@Solstice:~# 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:29:88:0e brd ff:ff:ff:ff:ff:ff
inet 172.16.0.1/24 brd 172.16.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe29:880e/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:29:88:0f brd ff:ff:ff:ff:ff:ff
inet 193.48.57.166/27 brd 193.48.57.191 scope global eth1
valid_lft forever preferred_lft forever
inet6 2001:660:4401:60a0:216:3eff:fe29:880f/64 scope global dynamic mngtmpaddr
valid_lft 987sec preferred_lft 887sec
inet6 fe80::216:3eff:fe29:880f/64 scope link
valid_lft forever preferred_lft forever
On peut maintenant ping Solstice avec les machines de services :
root@Solstice:~# ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3) 56(84) bytes of data.
64 bytes from 172.16.0.3: icmp_seq=1 ttl=64 time=0.292 ms
64 bytes from 172.16.0.3: icmp_seq=2 ttl=64 time=0.480 ms
--- 172.16.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1005ms
rtt min/avg/max/mdev = 0.292/0.386/0.480/0.094 ms
Addresses IP
Nom machine services | IPv4 privée machine services | Nom de domaine | Nom machine mandataire | IPv4 privée et routée machine mandataire |
---|---|---|---|---|
SE4.Moon | 172.16.0.3/24 | moonrises.online | SE4.Solstice | privée (172.16.0.1/24)
routée (193.48.57.166/28) Routeur en 193.48.57.161/28 |
Installation des paquetages sur Solstice :
De la même manière que pour Moon et Apollo on installe les paquetages :
apt install -y openssh-server apache2 bind9
Puis après l'installation on vérifie si les services sont en cours d'exécution :
systemctl status ssh apache2 bind9
Activez et démarrez les services si nécessaire :
systemctl enable --now ssh apache2 bind9
Configuration Cisco
Services Internet
Serveur SSH
Pour permettre l’accès SSH aux machines de services via Moon, nous avons mis en place des redirections de port. On a d'abord modifié le fichier d'autorisation ssh de root
en modifiant le fichier suivant /etc/ssh/sshd_config
:
PermitRootLogin yes
Il faut ensuite redémarrer le serveur ssh :
root@Solstice:/etc/ssh# /etc/init.d/ssh restart
Redirection des Ports sur les Machines de Services avec nftables
Sur Apollo et Moon, on a configuré nftables pour gérer la redirection SSH. On a redirigé le port 2201 vers Apollo et 2202 vers Moon.
nft add table ip nat
nft add chain ip nat PREROUTING { type nat hook prerouting priority 0 \; }
nft add rule ip nat PREROUTING tcp dport 2201 dnat to 172.16.0.2:22 # @Apollo
nft add rule ip nat PREROUTING tcp dport 2202 dnat to 172.16.0.3:22 # @Moon
nft add chain ip nat POSTROUTING { type nat hook postrouting priority 100 \; }
nft add rule ip nat POSTROUTING masquerade
Maintenant, on peux se connecter en SSH à Apollo et Moon via Solstice sans problème, même après un reboot des machines.
ssh root@193.48.57.166 -p 2201 # @Apollo
ssh root@193.48.57.166 -p 2202 # @Moon
Mise en Place d’un Serveur DNS
Nous avons configuré un serveur DNS pour gérer les noms de domaine de nos machines virtuelles : apollo-exploration.online et moonrises.online.
La première étape était d'acquérir les noms de domaine pour Apollo et Moon sur Gandi. La seconde étape était d'acquerir les certificats.
Après avoir suivi le tutoriel, nous obtenons deux fichiers : myserver.key (la clé privée) et server.csr (la demande de certificat). Ces fichiers nous permettrons de configurer DNSSEC et sécuriser la zone DNS.
Configuration bind9
Configuration du Serveur DNS Maître et Secondaire
Pour pouvoir accéder aux serveur DNS que l'on va configurer plus tard, nous devons mettre à jour le fichier etc/resolv.conf
root@Moon:~# cat /etc/resolv.conf
search plil.info
nameserver 172.26.188.12
nameserver 193.48.57.48
search moonrises.online
nameserver 172.16.0.3
nameserver 172.16.0.2
Sur Moon, nous avons configuré les zones DNS dans /etc/bind/named.conf.local
:
//include "/etc/bind/zones.rfc1918";
zone "moonrises.online" {
type master;
file "/etc/bind/db.moonrises.online";
allow-transfer{secondaries;}; //on filtre les secondaires
also-notify{hiddensecondaries;}; // secondaires caches
notify yes;
};
acl "secondaries" {
2001:660:4401:60a0:216:3eff:fe3c:33a5; #Apollo
2001:660:4401:60a0:216:3eff:fe29:880f; #Solstice
};
masters "hiddensecondaries" {
2001:660:4401:60a0:216:3eff:fe29:880f; #Solstice
};
zone "apollo-exploration.online" {
type slave;
file "/etc/bind/backup/db.apollo-exploration.online";
masters{2001:660:4401:60a0:216:3eff:fe3c:33a5;}; #Apollo
};
La machine Moon est le serveur DNS principal, tandis que Apollo sert de DNS secondaire et récupère la zone depuis Moon.
Puis on créer le fichier de zone pour le domaine : /etc/bind/db.moonrises.online
Après des modifications on a du augmenter le numéro de série dans le fichier /etc/bind/db.moonrises.online
$TTL 200
@ IN SOA ns1.moonrises.online. admin.moonrises.online. (
3298267246 ;Version
7200 ;Refresh
3600 ;Retry
1209600 ;Expire
259200 ) ;Minimum TTL
;
IN NS ns1.moonrises.online.
IN NS ns2.apollo-exploration.online.
ns1 IN AAAA 2001:660:4401:60a0:216:3eff:fe6f:f548
ns1 IN A 193.48.57.166
matrix IN A 195.101.204.154
@ IN A 193.48.57.166
@ IN AAAA 2001:660:4401:60a0:216:3eff:fe6f:f548
Pour charger la version du fichier de zone, on tape la commande "named-checkzone moonrises.online /etc/bind/db.moonrises.online " en étant dans le répertoire /etc/bind
root@Moon:/etc/bind# named-checkzone moonrises.online /etc/bind/db.moonrises.online
zone moonrises.online/IN: loaded serial 3298267246
OK
Activation et Tests du serveur DNS
On a redémarré bind9
systemctl restart named
systemctl enable named
On a autorisé les utilisateurs bind à accéder aux fichiers de zone et de config :
chown bind:bind /etc/bind/db.moonrises.online chmod 644 /etc/bind/db.moonrises.online chown bind:bind /etc/bind/named.conf.local chmod 644 /etc/bind/named.conf.local
Puis on a effectué un premier test DNS avec dig :
dig @localhost moonrises.online
dig @localhost apollo-exploration.online
Publication du DNS
Afin de rendre le serveur DNS opérationnel et accessible, on fait les configurations necessaire sur le site du registrar Gandi .
Dans l’onglet "Nameserver" de Moon domaine, on ajoute un "Glue Record", qui permet d’associer directement mon nom de domaine à mes propres serveurs DNS. Pour cela, on a rajouté les adresses IPv4 (celle de la machine mandataire) et IPv6 (celles des machines de service).
Ensuite, on a remplacé les Nameservers actuels par ceux de mon propre serveur, afin qu'il devienne le référent pour la résolution des noms de domaine associés. De même sur Apollo.
Le serveur répond correctement aux requêtes sur les deux machines.
Après quelques heures, le temps que la propagation DNS s'effectue, je vérifie la bonne prise en compte de ces changements sur le site DNS Checker. Celui-ci me permet de confirmer que mon serveur DNS est bien propagé (vérifier la disponibilité des enregistrements A et AAAA) à l’échelle mondiale, en affichant les adresses IP correspondantes lors d’une requête sur apollo-exploration.online et moonrises.online.
Sécurisation de site Web par certificat
Mise en place du DNSSEC pour signer les zones DNS
Génération des clés DNSSEC
mkdir -p /etc/bind/keys
cd /etc/bind/keys
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE moonrises.online
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE -f KSK moonrises.online
Deux paires de clés sont générées :
- ZSK (Zone Signing Key)
- KSK (Key Signing Key)
Ajout des Clés DNSSEC à la zone
Dans /etc/bind/db.moonrises.online
$include /etc/bind/keys/Kmoonrises.online.+008+58616.key
$include /etc/bind/keys/Kmoonrises.online.+013+21822.key
Vérification avec :
named-checkzone moonrises.online /etc/bind/db.moonrises.online.signed
Test et publication
root@Moon:/etc/bind/keys# cat /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
dnssec-validation auto;
listen-on-v6 { any; };
allow-query {any;};
recursion yes;
};
dnssec-policy "dnspol" {
keys {
ksk key-directory lifetime unlimited algorithm 13;
zsk key-directory lifetime unlimited algorithm 13;
};
nsec3param;
};
Après tout cela, j'ai redémarré bind9 :
systemctl restart bind9
Pour voir la propagation DNS et celle de DNSSEC on met notre nom domaine dans DNSviz. Cela permet d’analyser les signatures DNSSEC et de vérifier si la chaîne de validation est correcte: Si tout est bleu, tout est bon.
Les tests ont confirmé que la configuration était fonctionnelle.
Modification des zones DNS dans /etc/bind/named.conf.local
//include "/etc/bind/zones.rfc1918";
zone "moonrises.online" {
type master;
file "/etc/bind/db.moonrises.online";
#Pour la gestion automatique des clés
key-directory "/etc/bind/keys";
dnssec-policy "dnspol";
inline-signing yes;
allow-transfer{secondaries;}; //on filtre les secondaires
also-notify{hiddensecondaries;}; // secondaires caches
notify yes;
};
acl "secondaries" {
2001:660:4401:60a0:216:3eff:fe3c:33a5; #Apollo
2001:660:4401:60a0:216:3eff:fe29:880f; #Solstice
};
masters "hiddensecondaries" {
2001:660:4401:60a0:216:3eff:fe29:880f; #Solstice
};
zone "apollo-exploration.online" {
type slave;
file "/etc/bind/backup/db.apollo-exploration.online";
masters{2001:660:4401:60a0:216:3eff:fe3c:33a5;}; #Apollo
};
La ligne dnssec-policy "dnspol";
fait référence au bloc global ci-dessous.
root@Moon:/# cat /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
dnssec-validation auto;
listen-on-v6 { any; };
allow-query {any;};
recursion yes;
};
dnssec-policy "dnspol" {
keys {
ksk key-directory lifetime unlimited algorithm 13;
zsk key-directory lifetime unlimited algorithm 13;
};
nsec3param;
};
Installation de Fail2ban sur Moonrises
Pour protéger Moon contre les attaques brute force sur SSH, on a installé et configuré Fail2Ban.
root@Moon:/# apt install fail2ban
root@Moon:/# systemctl status fail2ban
fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service, disabled)
Active: active (running)