« Atelier SysRes SE4 2025/2026 E9 » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| (Une version intermédiaire par le même utilisateur non affichée) | |||
| Ligne 2 : | Ligne 2 : | ||
== Creation des VMs == | == Creation des VMs == | ||
=== se connecter au serveur de promo === | === se connecter au serveur de promo === | ||
Toutes les machines virtuelles sont hébergées sur le serveur capbreton, nous nous y connectons donc: | Toutes les machines virtuelles sont hébergées sur le serveur capbreton, nous nous y connectons donc: | ||
| Ligne 9 : | Ligne 9 : | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Le mot de passe est fourni par l'enseignant. | |||
Attention ! Le serveur est commun à toute la promo et vous êtes en root, donc attention aux rm et mv ! | |||
Initialement, on ne pourra se connecter à nos VMs que par capbreton, on corrigera cela lorsque nous exposerons à internet nos VMs. | |||
===Creation du commutateur virtuel=== | |||
Pour que les VMs puissent communiquer entre elles et pour bien séparer les réseaux des binômes, on crée un commutateur virtuel sur le serveur. | |||
On crée donc un fichier dans interfaces.d: | |||
<syntaxhighlight lang="shell"> | |||
vim /etc/nbetwork/interfaces.d/SE4_<login1>_<login2> | |||
</syntaxhighlight> | |||
dans lequel on écrit: | |||
<syntaxhighlight lang="shell"> | |||
auto <nom_bridge> | |||
iface <nom_bridge> inet manual | |||
bridge_ports none | |||
up ip link set $IFACE up | |||
down ip link set $IFACE down | |||
</syntaxhighlight> | |||
On active l'interface virtuelle avec : | |||
<syntaxhighlight lang="shell"> | |||
ifup <nom_bridge> | |||
</syntaxhighlight> | |||
=== initialisation des VMs === | |||
pour chacune des 2 VMs de service et la VM mandataire, on crée une image : | |||
<syntaxhighlight lang="shell"> | |||
xen-create-image --hostname=<nom_VM> --dhcp --bridge=<nom_bridge> --dir=/usr/local/xen --size=10G --dist=excalibur --memory=2048M --force | |||
</syntaxhighlight> | |||
on démarre les VMs avec : | |||
<syntaxhighlight lang="shell"> | |||
xen create /etc/xen/<nom_VM>.cfg | |||
</syntaxhighlight> | |||
et on ouvre le terminal des VMs avec: | |||
<syntaxhighlight lang="shell"> | |||
xen console <nom_VM> | |||
</syntaxhighlight> | |||
sur capbreton, vérifiez que vos VMs sont bien toutes présentes : | |||
<syntaxhighlight lang="shell"> | |||
xen list | |||
</syntaxhighlight> | |||
=== mots de passe === | |||
vous pouvez simplement afficher le mot de passe de vos VMs avec la commande : | |||
<syntaxhighlight lang="shell"> | |||
cat /var/log/xen-tools/<nom_VM>.log | grep Password | |||
</syntaxhighlight> | |||
chaque VM a initialement un mot de passe long et difficile à retenir, mais sûr. Il est recommandé de le laisser tel quel. vous pouvez toutefois le changer avec : | |||
<syntaxhighlight lang="shell"> | |||
vim /etc/xen/<nom_VM>.cfg | |||
</syntaxhighlight> | |||
A partir d'ici, vous devriez avoir accès à vos 3 VMs. | |||
=== montage des partitions === | |||
Nous allons ajouter des partions à nos VMs de service, donc pour seulement deux des trois VMs. | |||
On crée des volumes virtuels avec : | |||
<syntaxhighlight lang="shell"> | |||
lvcreate -n <nom_VM>.var -L 10G virtual | |||
lvcreate -n <nom_VM>.home -L 10G virtual | |||
</syntaxhighlight> | |||
Lorsque on exécute ces commandes, on nous demande où placer ces volumes. Placez-les sur un disque où de l'espace est disponible, "storage" par exemple. | |||
Eteignez ensuite les VMs: | |||
<syntaxhighlight lang="shell"> | |||
xen shutdown <nom_VM> | |||
</syntaxhighlight> | |||
Editez le fichier de configuration de chaque VM: | |||
<syntaxhighlight lang="shell"> | |||
vim /etc/xen/<nom_VM>.cfg | |||
</syntaxhighlight> | |||
ajoutez dans disk : | |||
<syntaxhighlight lang="shell"> | |||
'phy:/dev/virtual/<nom_VM>.home,xvda3,w', | |||
'phy:/dev/virtual/<nom_VM>.var,xvdb1,w' | |||
</syntaxhighlight> | |||
ajoutez dans /etc/fstab : | |||
<syntaxhighlight lang="shell"> | |||
/dev/xvda3 /var ext4 defaults 0 2 | |||
/dev/xvdb1 /home ext4 defaults 0 2 | |||
</syntaxhighlight> | |||
formatez avec : | |||
<syntaxhighlight lang="shell"> | |||
mkfs -t ext4 /dev/xvda3 | |||
mkfs -t ext4 /dev/xvdb1 | |||
</syntaxhighlight> | |||
puis montez avec : | |||
<syntaxhighlight lang="shell"> | |||
mount /dev/xvda3 /mnt | |||
mount /dev/xvdb1 /mnt | |||
mv /var/* /mnt | |||
mv /home/* /mnt | |||
umount /mnt | |||
mount -a | |||
</syntaxhighlight> | |||
puis relancez les VMs de service avec <syntaxhighlight lang="shell">xen create</syntaxhighlight> et <syntaxhighlight lang="shell">xen console</syntaxhighlight>. | |||
=== Configuration réseau des VMs === | |||
==== Configuration des interfaces ==== | |||
Nous allons maintenant configurer les interfaces des VMs: | |||
<syntaxhighlight lang="shell"> | |||
vim /etc/network/interfaces | |||
</syntaxhighlight> | |||
On souhaite une adresse statique en IPv4 et une adresse fournie par DHCP en ipv6. | |||
nous allons donner l'adresse IPv4 avec le format suivant: 192.168.<numéro_binôme>.X avec X prenant une valeur différente pour chaque VM. | |||
ce qui nous donne la configuration des machines de service : | |||
<syntaxhighlight lang="shell"> | |||
auto lo | |||
iface lo inet loopback | |||
#statique ipv4 | |||
auto eth0 | |||
iface eth0 inet static | |||
address 192.168.<numéro_binôme>.<numéro_VM_service>/24 | |||
gateway 192.168.<numéro_binôme>.<numéro_VM_mandataire> | |||
#dhcp ipv6 | |||
auto eth0 | |||
iface eth0 inet6 auto | |||
</syntaxhighlight> | |||
de plus, sur la mandataire, il faut ajouter une seconde interface dans le fichier de configuration pour pouvoir l'exposer au bridge de promotion. | |||
on éteint la machine mandataire et on édite la partie <syntaxhighlight lang="shell">vif</syntaxhighlight> du fichier <syntaxhighlight lang="shell">/etc/xen/<nom_VM>.cfg </syntaxhighlight> et on y ajoute: | |||
<syntaxhighlight lang="shell"> | |||
'mac=00:11:22:33:44:<numéro_binôme>,bridge=SE4' | |||
</syntaxhighlight> | |||
On redémarre la mandataire et on édite les interface comme il suit: | |||
la variable <valeur_unique_au_binôme> est supérieure à 164 et unique pour chaque binôme, n'oubliez pas de la renseigner. (162 VRRP, 163 Routeur1, 164 Routeur2) | |||
<syntaxhighlight lang="shell"> | |||
auto lo | |||
iface lo inet loopback | |||
#statique ipv4 | |||
auto eth0 | |||
iface eth0 inet static | |||
address 192.168<numéro_binôme>.<numéro_VM_mandataire>/24 | |||
auto eth1 | |||
iface eth1 inet static | |||
address 193.48.57.<valeur_unique_au_binôme>/24 | |||
gateway 193.48.57.162 | |||
#dhcp ipv6 | |||
auto eth1 | |||
iface eth1 inet6 auto | |||
</syntaxhighlight> | |||
pour chaque interface configurée, on la redémarre: | |||
<syntaxhighlight lang="shell"> | |||
ifdown <interface> | |||
ifup <interface> | |||
</syntaxhighlight> | |||
==== Configuration du dns ==== | |||
dans <syntaxhighlight lang="shell"> /etc/resolv.conf </syntaxhighlight> sur les 3 machines, ajoutez: | |||
<syntaxhighlight lang="shell"> | |||
nameserver 8.8.8.8 | |||
</syntaxhighlight> | |||
cela nous donnera un serveur dns par défaut (on pourra vérifier le fonctionnement en faisant <syntaxhighlight lang="shell">ping google.com</syntaxhighlight> dans le terminal) | |||
=== Installation des packages === | |||
Sur les machines de service on met à jour et on installe: | |||
<syntaxhighlight lang="shell"> | |||
apt update | |||
apt upgrade | |||
apt install ssh bind9 apache2 iptables dnsutils openssl fail2ban | |||
</syntaxhighlight> | |||
pour pouvoir nous connecter en ssh de l'extérieur, il est nécessaire d'éditer <syntaxhighlight lang="shell">/etc/ssh/sshd_config</syntaxhighlight>: | |||
Il faut retrouver le paramètre <syntaxhighlight lang="shell">PermitRootLogin</syntaxhighlight> et le mettre à <syntaxhighlight lang="shell">yes</syntaxhighlight>, ou bien on peut l'ajouter en exécutant: | |||
<syntaxhighlight lang="shell"> | |||
echo "PermitRootLogin = yes" > /etc/ssh/sshd_config | |||
</syntaxhighlight> | |||
on valide les changements en exécutant: | |||
<syntaxhighlight lang="shell"> | |||
/etc/init.d/ssh restart | |||
</syntaxhighlight> | |||
== Méthodes de routage IPv4 == | |||
=== Mascarade === | |||
pour pouvoir router nos VMs de service en IPv4, on va d'abord utiliser la mascarade (si vous perdez accès à internet sur les machine de service avec la méthodes suivante, référez-vous à celle-ci). | |||
<syntaxhighlight lang="shell"> | |||
iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.<numéro_binôme>.<numéro_VM_mandataire>/24 | |||
</syntaxhighlight> | |||
on peut se connecter depuis l'extérieur vers nos machines de service en faisant une chaîne de ssh :pc_personnel -> machine mandataire -> machine de service. | |||
=== Redirection de port === | |||
Cette méthode nous permettra de nous connecter en ssh sur les machines de service depuis la mandataire en nous connectant sur d'autres ports. | |||
sur la mandataire on exécute: | |||
<syntaxhighlight lang="shell"> | |||
iptables -t nat -A PREROUTING -p tcp --dport 2202 -j DNAT --to-destination 192.168.<numéro_binôme>.<numéro_VM1>:22 | |||
iptables -t nat -A PREROUTING -p tcp --dport 2203 -j DNAT --to-destination 192.168.<numéro_binôme>.<numéro_VM2>:22 | |||
</syntaxhighlight> | |||
et on active la redirection de port avec: | |||
<syntaxhighlight lang="shell"> | |||
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf | |||
</syntaxhighlight> | |||
sur la mandataire | |||
On peut alors se connecter en ssh sur nos machines de service depuis l'extérieur en changeant le port: | |||
<syntaxhighlight lang="shell"> | |||
ssh root@193.48.57.<valeur_unique_au_binôme> -p2202 | |||
</syntaxhighlight> | |||
ou | |||
<syntaxhighlight lang="shell"> | |||
ssh root@193.48.57.<valeur_unique_au_binôme> -p2203 | |||
</syntaxhighlight> | |||
on sauvegarde pour avoir une configuration persistante avec: | |||
<syntaxhighlight lang="shell"> | |||
iptables-save | |||
</syntaxhighlight> | |||
== Serveurs DNS == | |||
=== Création des noms de domaine === | |||
On choisit et achète deux noms de domaine auprès de gandi.net avec les logins fournis par l'enseignant avec un carte prépayée (ne pas prendre de noms de domaine trop cher, 2 euros environ). | |||
on prendra domain1.name et domain2.name pour l'exemple. | |||
=== Création des serveurs dns redondants === | |||
Afin que bind(le service de serveur dns) puisse accéder aux fichiers de configuration: | |||
<syntaxhighlight lang="shell"> | |||
chown bind:bind /etc/bind/ | |||
chmod 666 /etc/bind/ | |||
</syntaxhighlight> | |||
nous éditons le fichier de configuration locale de bind <syntaxhighlight lang="shell">/etc/bind/named.conf.local</syntaxhighlight>sur la première machine de service: | |||
<syntaxhighlight lang="shell"> | |||
zone "domain1.name" { | |||
type master; | |||
file "/etc/bind/domain1.name"; | |||
allow-transfer{secondaries;}; | |||
notify yes; | |||
}; | |||
acl "secondaries"{ | |||
<adresse_ipv4_machine_service_2>; | |||
<adresse_ipv6_machine_service_2>; | |||
}; | |||
zone "domain2.name" { | |||
type secondary; | |||
file "/etc/bind/backup/domain2.name"; | |||
primaries{<adresse_ipv6_machine_service_2>;}; | |||
}; | |||
</syntaxhighlight> | |||
sur la seconde machine de service: | |||
<syntaxhighlight lang="shell"> | |||
zone "domain2.name" { | |||
type master; | |||
file "/etc/bind/domain2.name"; | |||
allow-transfer{secondaries;}; | |||
notify yes; | |||
}; | |||
acl "secondaries"{ | |||
<adresse_ipv4_machine_service_1>; | |||
<adresse_ipv6_machine_service_1>; | |||
}; | |||
zone "domain1.name" { | |||
type secondary; | |||
file "/etc/bind/backup/domain1.name"; | |||
primaries{<adresse_ipv6_machine_service_1>;}; | |||
}; | |||
</syntaxhighlight> | |||
et sur la machine mandataire: | |||
<syntaxhighlight lang="shell"> | |||
zone "domain1.name" { | |||
type secondary; | |||
file "/etc/bind/backup/domain1.name"; | |||
primaries{<adresse_ipv6_machine_service_1>;}; | |||
}; | |||
zone "domain2.name" { | |||
type secondary; | |||
file "/etc/bind/backup/domain2.name"; | |||
primaries{<adresse_ipv6_machine_service_2>;}; | |||
}; | |||
</syntaxhighlight> | |||
nous créons maintenant les fichiers de zone dns: | |||
sur la première machine de service dans un fichier <syntaxhighlight lang="shell">/etc/bind/domain1.name </syntaxhighlight>: | |||
<syntaxhighlight lang="shell"> | |||
$TTL 400 | |||
@ IN SOA ns.domain1.name domain1.name ( | |||
4000 ; Numero de version(faire +1 a chaque edition du fichier) | |||
21600 ; Rafraichissement (6h) | |||
3600 ; Re-tentative (1h) | |||
2592000 ; Expiration (30j) | |||
86400 ; Cache negatif (24h) | |||
); | |||
IN NS ns.domain1.name. | |||
IN NS ns.domain2.name. | |||
@ IN A <adresse_ipv4_bridge_SE4_mandataire> | |||
@ IN AAAA <adresse_ipv6_bridge_SE4_mandataire> | |||
ns IN A <adresse_ipv4_bridge_SE4_mandataire> | |||
ns IN AAAA <adresse_ipv6_bridge_SE4_mandataire> | |||
www IN CNAME domain1.name | |||
</syntaxhighlight> | |||
sur la seconde machine de service, on inversera chaque itération de domain1.name par domain2.name du fichier de zone ci-dessus et on le placera dans <syntaxhighlight lang="shell">/etc/bind/domain2.name </syntaxhighlight>. | |||
Lorsque la configuration du serveur dns est faite, on redémarre bind avec: | |||
<syntaxhighlight lang="shell"> | |||
service named restart | |||
</syntaxhighlight> | |||
sur les trois machines. | |||
=== glue record === | |||
Pour que nos serveurs DNS soient reconnus par les autres serveurs DNS d'internet, il faut créer un glue record. | |||
On se rend sur gandi.net et on suit la procédure décrite pour ajouter un glue record. On ajoute alors ns.domain1.name et ns.domain2.name. | |||
On peut alors verifier que notre nom de domaine est bien reconnu par les autres serveurs DNS sur le site dnschecker.org, et aussi en exécutant: | |||
<syntaxhighlight lang="shell"> | |||
dig domain1.name @8.8.8.8 | |||
</syntaxhighlight> | |||
=== DNSSEC === | |||
Pour sécuriser nos serveurs dns, on vient insérer ces 3 lignes dans les fichiers <syntaxhighlight lang="shell">/etc/bind/named.conf.local</syntaxhighlight> des deux machines de service dans la zone hébergée par la machine (zone domain1.name pour la machine 1, domain2.name pour la machine 2) | |||
<syntaxhighlight lang="shell"> | |||
key-directory "/etc/bind/keys"; | |||
dnssec-policy "dnspol"; | |||
inline-signing yes; | |||
</syntaxhighlight> | |||
on insère également la politique "dnspol" dans le fichier de zone sur les deux machines: | |||
<syntaxhighlight lang="shell"> | |||
dnssec-policy "dnspol" { | |||
keys { | |||
ksk key-directory lifetime unlimited algorithm 13; | |||
zsk key-directory lifetime unlimited algorithm 13; | |||
}; | |||
nsec3param; | |||
</syntaxhighlight> | |||
on crée aussi le répertoire /etc/bind/keys pour stocker les clés, et on donne les droits à bind pour y accéder (comme vu précédemment avec chown et chmod) | |||
On crée maintenant les clés avec l'utilitaire dnssec-keygen: | |||
<syntaxhighlight lang="shell"> | |||
dnssec-keygen -a RSASHA256 -f KSK -n ZONE domain1.name -K /etc/bind/keys | |||
dnssec-keygen -a RSASHA256 -n ZONE domain1.name -K /etc/bind/keys | |||
</syntaxhighlight> | |||
Retournons maintenant sur gandi.net pour authentifier notre serveur avec les clé publiques générées (.keys). | |||
On peut désormais recharger nos serveurs dns avec <syntaxhighlight lang="shell"> service named restart<syntaxhighlight lang="shell"> | |||
On vérifie alors que toute la chaîne d'authentification est correcte sur dnsviz.net. (vous pouvez vérifier la chaîne de tompere.online à https://dnsviz.net/d/tompere.online/dnssec) | |||
== Serveur web == | |||
Pour pouvoir déployer notre site web, on crée des certificats ssl avec la clé générée avec: | |||
<syntaxhighlight lang="shell"> | |||
openssl req -nodes -newkey rsa:2048 -sha256 -keyout domain1.name.key -out domain1.name.csr | |||
</syntaxhighlight> | |||
que l'on vient ensuite ajouter sur gandi.net pour récupérer des certificats. | |||
On a alors 3 fichiers qu'il faut placer au bon endroit: | |||
<syntaxhighlight lang="shell"> | |||
mv domain1.name.crt /etc/ssl/certs/ | |||
mv domain1.name.pem /etc/ssl/certs/ | |||
mv domain1.name.key /etc/ssl/private/ | |||
</syntaxhighlight> | |||
on configure notre site en éditant /etc/apache2/sites-available/000-domain1.name-ssl.conf | |||
<syntaxhighlight lang="shell"> | |||
<VirtualHost *:80> | |||
ServerName ns.domain1.name | |||
Redirect permanent / https://domain1.name/ | |||
</VirtualHost> | |||
<VirtualHost *:443> | |||
ServerName domain1.name | |||
ServerAlias domain1.name | |||
DocumentRoot /var/www/domain1.name/ | |||
CustomLog /var/log/apache2/secure_access.log combined | |||
SSLEngine on | |||
SSLCertificateFile /etc/ssl/certs/domain1.name.crt | |||
SSLCertificateKeyFile /etc/ssl/private/domain1.name.key | |||
SSLCertificateChainFile /etc/ssl/certs/domain1.name.pem | |||
SSLVerifyClient None | |||
SSLProxyEngine on | |||
</VirtualHost> | |||
</syntaxhighlight> | |||
On pourra en faire de même pour la seconde machine de service en remplaçant avec domain2.name. | |||
On peut maintenant lancer le site web en exécutant: | |||
<syntaxhighlight lang="shell"> | |||
a2ensite 000-domain1.name-ssl.conf | |||
/etc/init.d/apache2 restart | |||
</syntaxhighlight> | |||
On peut maintenant accéder au site web en allant sur https://domain1.name(nom pas déposé, n'y allez pas dans le doute) (dans mon cas, https://tompere.online) | |||
== Fail2Ban == | |||
Lorsque j'avais précisé qu'il valait mieux conserver le mot de passe par défaut des VMs, c'est pour la raison suivante: lorsque votre machine est exposée à internet, n'importe qui peut tenter d'y accéder en ssh, et donc si vous avez un mot de passe peu puissant, il y a le risque qu'une personne malveillante ait accès à votre machine. Pour s'en prémunir, nous allons configurer l'outil fail2ban pour bloquer les ip faisant des tentatives répétées de connexion: | |||
dans le fichier /etc/fail2ban/jail.local, on insère: | |||
<syntaxhighlight lang="shell"> | |||
[sshd] | |||
enabled = true | |||
port = ssh | |||
filter = sshd | |||
ignoreip = 127.0.0.1 | |||
findtime = 10m | |||
bantime = 5m | |||
maxretry = 3 | |||
</syntaxhighlight> | |||
on redémarre l'utilitaire avec : | |||
<syntaxhighlight lang="shell"> | |||
service fail2ban restart | |||
</syntaxhighlight> | |||
Seront donc bloqués d'accès en ssh tous ceux qui tentent d'y accéder en échouant 3 fois. | |||
== BruteForce d'un point d'accès Wifi == | |||
=== récupération adresse mac === | |||
Afin de casser la clé, nous devons utiliser une carte wifi permettant d'accéder au point d'accès. | |||
Il est possible de vérifier quel est le nom de la carte wifi avec: | |||
<syntaxhighlight lang="shell"> | |||
ip link | |||
</syntaxhighlight> | |||
Afin d'accélérer le bruteforce, nous avons pris une clé USB Wi-Pi qui dispose de son propre identifiant. | |||
On peut maintenant scanner le réseau pour trouver l'adresse mac du point d'accès <cracotteX>. | |||
<syntaxhighlight lang="shell"> | |||
airodump-ng <nom_carte_wifi> --essid <cracotteX> | |||
</syntaxhighlight> | |||
=== attaque sur clé WEP === | |||
Lorque l'on obtient l'adresse mac, on va logger dans un fichier de log avec: | |||
<syntaxhighlight lang="shell"> | |||
sudo airodump-ng -c 4 --bssid <adresse_mac> <nom_carte_wifi> --write dump | |||
</syntaxhighlight> | |||
maintenant, on bruteforce avec: | |||
<syntaxhighlight lang="shell"> | |||
aircrack-ng -b <adresse_mac> *.cap | |||
</syntaxhighlight> | |||
=== attaque sur clé WPA-PSK === | |||
Pour l'attaque sur clé WPA-PSK nous avons l'information que le mot de passe ne contient que 8 chiffres et est donc facilement crackable. Nous créons donc un dictionnaire avec crunch (que l'on installe avec apt install) | |||
<syntaxhighlight lang="shell"> | |||
crunch 8 8 0123456789 -o 8numbers_dico.txt | |||
</syntaxhighlight> | |||
A nouveau, nous sauvegardons les données reçues dans un fichier de logs: | |||
<syntaxhighlight lang="shell"> | |||
sudo airodump-ng -c 13 --bssid <adresse_mac> <nom_carte_wifi> --write dump | |||
</syntaxhighlight> | |||
Dans mon cas je n'ai pas pu accéder aux clés, car le flux de données s'est retrouvé ralenti, et les tentatives d'authentification prenaient plusieurs secondes à chaque fois. Cela dit, dans un environnement moins chargé en perturbations électromagnétiques et/ou avec plus de temps, il aurait été possible de les obtenir. | |||
== Serveur FreeRadius et sécurisation WPA2-EAP == | |||
nous souhaitons accéder à nos machines de service via un point d'accès wifi, et que notre réseau soit séparé en y accédant à travers un Vlan. | |||
pour faire cela, nous accédons d'abord au point d'accès avec : | |||
<syntaxhighlight lang="shell"> | |||
ssh -oKexAlgorithms=+diffie-hellman-group11-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.3 | |||
</syntaxhighlight> | |||
une fois sur le point d'accès, on paramètre l'authentification en indiquant le serveur d'authentification (une machine de service) | |||
<syntaxhighlight lang="shell"> | |||
conf t | |||
aaa new-model | |||
aaa authentication login eap_student<numéro_étudiant> group radius_student<numéro_étudiant> | |||
radius-server host <ip_machine_service> auth-port 1812 acct-port 1813 key secret_student<numéro_étudiant> | |||
aaa group server radius radius_student<numéro_étudiant> | |||
server <ip_machine_service> auth-port 1812 acct-port 1813 | |||
exit | |||
</syntaxhighlight> | |||
On crée maintenant le point d'accès WIFI avec les commandes : | |||
<syntaxhighlight lang="shell"> | |||
dot11 ssid VM_SERVICES_<numéro_étudiant> | |||
vlan <10 + numéro_étudiant> | |||
authentication open eap eap_student<numéro_étudiant> | |||
authentication network-eap eap_student<numéro_étudiant> | |||
authentication key-management wpa | |||
mbssid guest-mode | |||
</syntaxhighlight> | |||
On active le vlan souhaité sur l'interface Dot11Radio0 (l'interface wifi du point d'accès) | |||
<syntaxhighlight lang="shell"> | |||
interface Dot11Radio0 | |||
ssid VM_SERVICES_<numéro_étudiant> | |||
encryption vlan <10 + numéro_étudiant> mode ciphers aes-ccm | |||
</syntaxhighlight> | |||
On active l'encapsulation dot1Q pour le vlan souhaité sur l'interface wifi : | |||
<syntaxhighlight lang="shell"> | |||
interface Dot11Radio0.<10 + numéro_étudiant> | |||
encapsulation dot1Q <10 + numéro_étudiant> | |||
bridge-group <10 + numéro_étudiant> | |||
</syntaxhighlight> | |||
puis on active l'encapsulation dot1Q pour le vlan souhaité sur l'interface ethernet (qui est connectée au routeur) | |||
<syntaxhighlight lang="shell"> | |||
interface GigabitEthernet0.<10 + numéro_étudiant> | |||
encapsulation dot1Q <10 + numéro_étudiant> | |||
bridge-group <10 + numéro_étudiant> | |||
</syntaxhighlight> | |||
Il faut réitiérer ce processus pour le second point accès pour avoir une redondance, qui est à l'adresse ip 172.27.0.4 | |||
Sur le premier routeur, On configure le vlan étudiant avec: | |||
<syntaxhighlight lang="shell"> | |||
interface Vlan <10 + numéro_étudiant> | |||
description "VLAN etudiant_<numéro_étudiant>" | |||
ip address 10.60.<numéro_étudiant>.2 255.255.255.0 | |||
ipv6 address 2001:660:4401:60a<numéro_étudiant>::2/64 | |||
vrrp <10 + numéro_étudiant> address-family ipv4 | |||
priority 110 | |||
address 10.60.<numéro_étudiant>.1 primary | |||
</syntaxhighlight> | |||
et on vient configurer le DHCP de la façon suivante: | |||
<syntaxhighlight lang="shell"> | |||
ip dhcp pool <nom_pool_dhcp> | |||
network 10.60.<numéro_étudiant>.0 255.255.255.0 | |||
dns-server 193.48.57.<valeur_unique_au_binôme> | |||
default-router 10.60.<numéro_étudiant>.254 | |||
</syntaxhighlight> | |||
Encore une fois, il faudra doubler ces commandes sur le second routeur. | |||
Version actuelle datée du 1 mars 2026 à 20:30
note : si vous voyez des noms entre chevrons, changez-les !
Creation des VMs
se connecter au serveur de promo
Toutes les machines virtuelles sont hébergées sur le serveur capbreton, nous nous y connectons donc:
ssh root@capbreton
Le mot de passe est fourni par l'enseignant.
Attention ! Le serveur est commun à toute la promo et vous êtes en root, donc attention aux rm et mv !
Initialement, on ne pourra se connecter à nos VMs que par capbreton, on corrigera cela lorsque nous exposerons à internet nos VMs.
Creation du commutateur virtuel
Pour que les VMs puissent communiquer entre elles et pour bien séparer les réseaux des binômes, on crée un commutateur virtuel sur le serveur. On crée donc un fichier dans interfaces.d:
vim /etc/nbetwork/interfaces.d/SE4_<login1>_<login2>
dans lequel on écrit:
auto <nom_bridge>
iface <nom_bridge> inet manual
bridge_ports none
up ip link set $IFACE up
down ip link set $IFACE down
On active l'interface virtuelle avec :
ifup <nom_bridge>
initialisation des VMs
pour chacune des 2 VMs de service et la VM mandataire, on crée une image :
xen-create-image --hostname=<nom_VM> --dhcp --bridge=<nom_bridge> --dir=/usr/local/xen --size=10G --dist=excalibur --memory=2048M --force
on démarre les VMs avec :
xen create /etc/xen/<nom_VM>.cfg
et on ouvre le terminal des VMs avec:
xen console <nom_VM>
sur capbreton, vérifiez que vos VMs sont bien toutes présentes :
xen list
mots de passe
vous pouvez simplement afficher le mot de passe de vos VMs avec la commande :
cat /var/log/xen-tools/<nom_VM>.log | grep Password
chaque VM a initialement un mot de passe long et difficile à retenir, mais sûr. Il est recommandé de le laisser tel quel. vous pouvez toutefois le changer avec :
vim /etc/xen/<nom_VM>.cfg
A partir d'ici, vous devriez avoir accès à vos 3 VMs.
montage des partitions
Nous allons ajouter des partions à nos VMs de service, donc pour seulement deux des trois VMs. On crée des volumes virtuels avec :
lvcreate -n <nom_VM>.var -L 10G virtual
lvcreate -n <nom_VM>.home -L 10G virtual
Lorsque on exécute ces commandes, on nous demande où placer ces volumes. Placez-les sur un disque où de l'espace est disponible, "storage" par exemple. Eteignez ensuite les VMs:
xen shutdown <nom_VM>
Editez le fichier de configuration de chaque VM:
vim /etc/xen/<nom_VM>.cfg
ajoutez dans disk :
'phy:/dev/virtual/<nom_VM>.home,xvda3,w',
'phy:/dev/virtual/<nom_VM>.var,xvdb1,w'
ajoutez dans /etc/fstab :
/dev/xvda3 /var ext4 defaults 0 2
/dev/xvdb1 /home ext4 defaults 0 2
formatez avec :
mkfs -t ext4 /dev/xvda3
mkfs -t ext4 /dev/xvdb1
puis montez avec :
mount /dev/xvda3 /mnt
mount /dev/xvdb1 /mnt
mv /var/* /mnt
mv /home/* /mnt
umount /mnt
mount -a
puis relancez les VMs de service avec
xen create
et
xen console
.
Configuration réseau des VMs
Configuration des interfaces
Nous allons maintenant configurer les interfaces des VMs:
vim /etc/network/interfaces
On souhaite une adresse statique en IPv4 et une adresse fournie par DHCP en ipv6. nous allons donner l'adresse IPv4 avec le format suivant: 192.168.<numéro_binôme>.X avec X prenant une valeur différente pour chaque VM.
ce qui nous donne la configuration des machines de service :
auto lo
iface lo inet loopback
#statique ipv4
auto eth0
iface eth0 inet static
address 192.168.<numéro_binôme>.<numéro_VM_service>/24
gateway 192.168.<numéro_binôme>.<numéro_VM_mandataire>
#dhcp ipv6
auto eth0
iface eth0 inet6 auto
de plus, sur la mandataire, il faut ajouter une seconde interface dans le fichier de configuration pour pouvoir l'exposer au bridge de promotion.
on éteint la machine mandataire et on édite la partie
vif
du fichier
/etc/xen/<nom_VM>.cfg
et on y ajoute:
'mac=00:11:22:33:44:<numéro_binôme>,bridge=SE4'
On redémarre la mandataire et on édite les interface comme il suit: la variable <valeur_unique_au_binôme> est supérieure à 164 et unique pour chaque binôme, n'oubliez pas de la renseigner. (162 VRRP, 163 Routeur1, 164 Routeur2)
auto lo
iface lo inet loopback
#statique ipv4
auto eth0
iface eth0 inet static
address 192.168<numéro_binôme>.<numéro_VM_mandataire>/24
auto eth1
iface eth1 inet static
address 193.48.57.<valeur_unique_au_binôme>/24
gateway 193.48.57.162
#dhcp ipv6
auto eth1
iface eth1 inet6 auto
pour chaque interface configurée, on la redémarre:
ifdown <interface>
ifup <interface>
Configuration du dns
dans
/etc/resolv.conf
sur les 3 machines, ajoutez:
nameserver 8.8.8.8
cela nous donnera un serveur dns par défaut (on pourra vérifier le fonctionnement en faisant
ping google.com
dans le terminal)
Installation des packages
Sur les machines de service on met à jour et on installe:
apt update
apt upgrade
apt install ssh bind9 apache2 iptables dnsutils openssl fail2ban
pour pouvoir nous connecter en ssh de l'extérieur, il est nécessaire d'éditer
/etc/ssh/sshd_config
: Il faut retrouver le paramètre
PermitRootLogin
et le mettre à
yes
, ou bien on peut l'ajouter en exécutant:
echo "PermitRootLogin = yes" > /etc/ssh/sshd_config
on valide les changements en exécutant:
/etc/init.d/ssh restart
Méthodes de routage IPv4
Mascarade
pour pouvoir router nos VMs de service en IPv4, on va d'abord utiliser la mascarade (si vous perdez accès à internet sur les machine de service avec la méthodes suivante, référez-vous à celle-ci).
iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.<numéro_binôme>.<numéro_VM_mandataire>/24
on peut se connecter depuis l'extérieur vers nos machines de service en faisant une chaîne de ssh :pc_personnel -> machine mandataire -> machine de service.
Redirection de port
Cette méthode nous permettra de nous connecter en ssh sur les machines de service depuis la mandataire en nous connectant sur d'autres ports. sur la mandataire on exécute:
iptables -t nat -A PREROUTING -p tcp --dport 2202 -j DNAT --to-destination 192.168.<numéro_binôme>.<numéro_VM1>:22
iptables -t nat -A PREROUTING -p tcp --dport 2203 -j DNAT --to-destination 192.168.<numéro_binôme>.<numéro_VM2>:22
et on active la redirection de port avec:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sur la mandataire
On peut alors se connecter en ssh sur nos machines de service depuis l'extérieur en changeant le port:
ssh root@193.48.57.<valeur_unique_au_binôme> -p2202
ou
ssh root@193.48.57.<valeur_unique_au_binôme> -p2203
on sauvegarde pour avoir une configuration persistante avec:
iptables-save
Serveurs DNS
Création des noms de domaine
On choisit et achète deux noms de domaine auprès de gandi.net avec les logins fournis par l'enseignant avec un carte prépayée (ne pas prendre de noms de domaine trop cher, 2 euros environ). on prendra domain1.name et domain2.name pour l'exemple.
Création des serveurs dns redondants
Afin que bind(le service de serveur dns) puisse accéder aux fichiers de configuration:
chown bind:bind /etc/bind/
chmod 666 /etc/bind/
nous éditons le fichier de configuration locale de bind
/etc/bind/named.conf.local
sur la première machine de service:
zone "domain1.name" {
type master;
file "/etc/bind/domain1.name";
allow-transfer{secondaries;};
notify yes;
};
acl "secondaries"{
<adresse_ipv4_machine_service_2>;
<adresse_ipv6_machine_service_2>;
};
zone "domain2.name" {
type secondary;
file "/etc/bind/backup/domain2.name";
primaries{<adresse_ipv6_machine_service_2>;};
};
sur la seconde machine de service:
zone "domain2.name" {
type master;
file "/etc/bind/domain2.name";
allow-transfer{secondaries;};
notify yes;
};
acl "secondaries"{
<adresse_ipv4_machine_service_1>;
<adresse_ipv6_machine_service_1>;
};
zone "domain1.name" {
type secondary;
file "/etc/bind/backup/domain1.name";
primaries{<adresse_ipv6_machine_service_1>;};
};
et sur la machine mandataire:
zone "domain1.name" {
type secondary;
file "/etc/bind/backup/domain1.name";
primaries{<adresse_ipv6_machine_service_1>;};
};
zone "domain2.name" {
type secondary;
file "/etc/bind/backup/domain2.name";
primaries{<adresse_ipv6_machine_service_2>;};
};
nous créons maintenant les fichiers de zone dns:
sur la première machine de service dans un fichier
/etc/bind/domain1.name
:
$TTL 400
@ IN SOA ns.domain1.name domain1.name (
4000 ; Numero de version(faire +1 a chaque edition du fichier)
21600 ; Rafraichissement (6h)
3600 ; Re-tentative (1h)
2592000 ; Expiration (30j)
86400 ; Cache negatif (24h)
);
IN NS ns.domain1.name.
IN NS ns.domain2.name.
@ IN A <adresse_ipv4_bridge_SE4_mandataire>
@ IN AAAA <adresse_ipv6_bridge_SE4_mandataire>
ns IN A <adresse_ipv4_bridge_SE4_mandataire>
ns IN AAAA <adresse_ipv6_bridge_SE4_mandataire>
www IN CNAME domain1.name
sur la seconde machine de service, on inversera chaque itération de domain1.name par domain2.name du fichier de zone ci-dessus et on le placera dans
/etc/bind/domain2.name
.
Lorsque la configuration du serveur dns est faite, on redémarre bind avec:
service named restart
sur les trois machines.
glue record
Pour que nos serveurs DNS soient reconnus par les autres serveurs DNS d'internet, il faut créer un glue record. On se rend sur gandi.net et on suit la procédure décrite pour ajouter un glue record. On ajoute alors ns.domain1.name et ns.domain2.name.
On peut alors verifier que notre nom de domaine est bien reconnu par les autres serveurs DNS sur le site dnschecker.org, et aussi en exécutant:
dig domain1.name @8.8.8.8
DNSSEC
Pour sécuriser nos serveurs dns, on vient insérer ces 3 lignes dans les fichiers
/etc/bind/named.conf.local
des deux machines de service dans la zone hébergée par la machine (zone domain1.name pour la machine 1, domain2.name pour la machine 2)
key-directory "/etc/bind/keys";
dnssec-policy "dnspol";
inline-signing yes;
on insère également la politique "dnspol" dans le fichier de zone sur les deux machines:
dnssec-policy "dnspol" {
keys {
ksk key-directory lifetime unlimited algorithm 13;
zsk key-directory lifetime unlimited algorithm 13;
};
nsec3param;
on crée aussi le répertoire /etc/bind/keys pour stocker les clés, et on donne les droits à bind pour y accéder (comme vu précédemment avec chown et chmod)
On crée maintenant les clés avec l'utilitaire dnssec-keygen:
dnssec-keygen -a RSASHA256 -f KSK -n ZONE domain1.name -K /etc/bind/keys
dnssec-keygen -a RSASHA256 -n ZONE domain1.name -K /etc/bind/keys
Retournons maintenant sur gandi.net pour authentifier notre serveur avec les clé publiques générées (.keys).
On peut désormais recharger nos serveurs dns avec
service named restart<syntaxhighlight lang="shell">
On vérifie alors que toute la chaîne d'authentification est correcte sur dnsviz.net. (vous pouvez vérifier la chaîne de tompere.online à https://dnsviz.net/d/tompere.online/dnssec)
== Serveur web ==
Pour pouvoir déployer notre site web, on crée des certificats ssl avec la clé générée avec:
<syntaxhighlight lang="shell">
openssl req -nodes -newkey rsa:2048 -sha256 -keyout domain1.name.key -out domain1.name.csr
que l'on vient ensuite ajouter sur gandi.net pour récupérer des certificats. On a alors 3 fichiers qu'il faut placer au bon endroit:
mv domain1.name.crt /etc/ssl/certs/
mv domain1.name.pem /etc/ssl/certs/
mv domain1.name.key /etc/ssl/private/
on configure notre site en éditant /etc/apache2/sites-available/000-domain1.name-ssl.conf
<VirtualHost *:80>
ServerName ns.domain1.name
Redirect permanent / https://domain1.name/
</VirtualHost>
<VirtualHost *:443>
ServerName domain1.name
ServerAlias domain1.name
DocumentRoot /var/www/domain1.name/
CustomLog /var/log/apache2/secure_access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/domain1.name.crt
SSLCertificateKeyFile /etc/ssl/private/domain1.name.key
SSLCertificateChainFile /etc/ssl/certs/domain1.name.pem
SSLVerifyClient None
SSLProxyEngine on
</VirtualHost>
On pourra en faire de même pour la seconde machine de service en remplaçant avec domain2.name.
On peut maintenant lancer le site web en exécutant:
a2ensite 000-domain1.name-ssl.conf
/etc/init.d/apache2 restart
On peut maintenant accéder au site web en allant sur https://domain1.name(nom pas déposé, n'y allez pas dans le doute) (dans mon cas, https://tompere.online)
Fail2Ban
Lorsque j'avais précisé qu'il valait mieux conserver le mot de passe par défaut des VMs, c'est pour la raison suivante: lorsque votre machine est exposée à internet, n'importe qui peut tenter d'y accéder en ssh, et donc si vous avez un mot de passe peu puissant, il y a le risque qu'une personne malveillante ait accès à votre machine. Pour s'en prémunir, nous allons configurer l'outil fail2ban pour bloquer les ip faisant des tentatives répétées de connexion: dans le fichier /etc/fail2ban/jail.local, on insère:
[sshd]
enabled = true
port = ssh
filter = sshd
ignoreip = 127.0.0.1
findtime = 10m
bantime = 5m
maxretry = 3
on redémarre l'utilitaire avec :
service fail2ban restart
Seront donc bloqués d'accès en ssh tous ceux qui tentent d'y accéder en échouant 3 fois.
BruteForce d'un point d'accès Wifi
récupération adresse mac
Afin de casser la clé, nous devons utiliser une carte wifi permettant d'accéder au point d'accès. Il est possible de vérifier quel est le nom de la carte wifi avec:
ip link
Afin d'accélérer le bruteforce, nous avons pris une clé USB Wi-Pi qui dispose de son propre identifiant.
On peut maintenant scanner le réseau pour trouver l'adresse mac du point d'accès <cracotteX>.
airodump-ng <nom_carte_wifi> --essid <cracotteX>
attaque sur clé WEP
Lorque l'on obtient l'adresse mac, on va logger dans un fichier de log avec:
sudo airodump-ng -c 4 --bssid <adresse_mac> <nom_carte_wifi> --write dump
maintenant, on bruteforce avec:
aircrack-ng -b <adresse_mac> *.cap
attaque sur clé WPA-PSK
Pour l'attaque sur clé WPA-PSK nous avons l'information que le mot de passe ne contient que 8 chiffres et est donc facilement crackable. Nous créons donc un dictionnaire avec crunch (que l'on installe avec apt install)
crunch 8 8 0123456789 -o 8numbers_dico.txt
A nouveau, nous sauvegardons les données reçues dans un fichier de logs:
sudo airodump-ng -c 13 --bssid <adresse_mac> <nom_carte_wifi> --write dump
Dans mon cas je n'ai pas pu accéder aux clés, car le flux de données s'est retrouvé ralenti, et les tentatives d'authentification prenaient plusieurs secondes à chaque fois. Cela dit, dans un environnement moins chargé en perturbations électromagnétiques et/ou avec plus de temps, il aurait été possible de les obtenir.
Serveur FreeRadius et sécurisation WPA2-EAP
nous souhaitons accéder à nos machines de service via un point d'accès wifi, et que notre réseau soit séparé en y accédant à travers un Vlan. pour faire cela, nous accédons d'abord au point d'accès avec :
ssh -oKexAlgorithms=+diffie-hellman-group11-sha1 -oHostKeyAlgorithms=+ssh-rsa -oCiphers=+aes128-cbc admin@172.27.0.3
une fois sur le point d'accès, on paramètre l'authentification en indiquant le serveur d'authentification (une machine de service)
conf t
aaa new-model
aaa authentication login eap_student<numéro_étudiant> group radius_student<numéro_étudiant>
radius-server host <ip_machine_service> auth-port 1812 acct-port 1813 key secret_student<numéro_étudiant>
aaa group server radius radius_student<numéro_étudiant>
server <ip_machine_service> auth-port 1812 acct-port 1813
exit
On crée maintenant le point d'accès WIFI avec les commandes :
dot11 ssid VM_SERVICES_<numéro_étudiant>
vlan <10 + numéro_étudiant>
authentication open eap eap_student<numéro_étudiant>
authentication network-eap eap_student<numéro_étudiant>
authentication key-management wpa
mbssid guest-mode
On active le vlan souhaité sur l'interface Dot11Radio0 (l'interface wifi du point d'accès)
interface Dot11Radio0
ssid VM_SERVICES_<numéro_étudiant>
encryption vlan <10 + numéro_étudiant> mode ciphers aes-ccm
On active l'encapsulation dot1Q pour le vlan souhaité sur l'interface wifi :
interface Dot11Radio0.<10 + numéro_étudiant>
encapsulation dot1Q <10 + numéro_étudiant>
bridge-group <10 + numéro_étudiant>
puis on active l'encapsulation dot1Q pour le vlan souhaité sur l'interface ethernet (qui est connectée au routeur)
interface GigabitEthernet0.<10 + numéro_étudiant>
encapsulation dot1Q <10 + numéro_étudiant>
bridge-group <10 + numéro_étudiant>
Il faut réitiérer ce processus pour le second point accès pour avoir une redondance, qui est à l'adresse ip 172.27.0.4
Sur le premier routeur, On configure le vlan étudiant avec:
interface Vlan <10 + numéro_étudiant>
description "VLAN etudiant_<numéro_étudiant>"
ip address 10.60.<numéro_étudiant>.2 255.255.255.0
ipv6 address 2001:660:4401:60a<numéro_étudiant>::2/64
vrrp <10 + numéro_étudiant> address-family ipv4
priority 110
address 10.60.<numéro_étudiant>.1 primary
et on vient configurer le DHCP de la façon suivante:
ip dhcp pool <nom_pool_dhcp>
network 10.60.<numéro_étudiant>.0 255.255.255.0
dns-server 193.48.57.<valeur_unique_au_binôme>
default-router 10.60.<numéro_étudiant>.254
Encore une fois, il faudra doubler ces commandes sur le second routeur.