TP sysres IMA2a5 2018/2019 G3
Projet de Killian et Lucas
Equipement réseau choisis : Routeur
Sommaire
Introduction
Ce projet consiste à mettre en place une maquette de réseau. Au travers de ce projet, nous serons amené à manipuler les protocoles de redondance réseau ainsi que le protocole IPv6. Ce projet comporte une partie système en plus de la partie réseau. Dans cette partie, nous allons devoir installer une machine virtuelle (sous Xen), mettre en place un commutateur logiciel et prendre en main l'outils docker. Au cours de ce projet, nous découvrirons également la mise en place d'un réseau wifi sécurisé et un site web en HTTPS.
Partie réseau
Le but de ce TP est de mettre en place un réseau redondé permettant aux machines virtuelles de tous les groupes d'accéder au réseau de l'école et à internet même en cas de défaillance de l'un de nos équipements réseaux. Dans la mise en place de ce réseau, nous sommes en charge de la configuration du routeur Cisco 4331.
Détermination de la table d'adressage
Avant de commencer à configurer le routeur, il a fallu se mettre d'accord avec le Groupe 4 en charge du 2ème routeur afin de déterminer la table d'adressage de notre réseau. Nous avions à notre disposition le réseau IPv4 routé suivant : 193.48.57.160/27 nous l'avons découpé en deux réseau "/28" afin d'avoir un réseau pour notre classe et un pour les IMA en formation initiale. Nous avons ensuite redécoupé le réseau et attribué des adresses IP à chaque routeur dans tous les réseaux nécessaires. Nous avons obtenu la table située en page d'accueil (ici).
Configuration du Routeur
Une fois la table d'adressage déterminée, nous avons configuré le routeur Cisco 4331.
Connexion
Pour accéder au routeur, nous nous somme connecté au routeur à l'aide du PC portable à notre disposition. Dans un terminal nous avons ouvert minicom et configuré les paramètres de connexion :
minicom -os
Les paramètres de connexion sont les suivants :
- ttyACM0
- 9600 bauds
- flow control : no
Configuration
Dans un premier temps, nous nous limitons à configurer tout le réseau en IPv4. Une fois l'IPv4 configuré, toutes les VMs auront un accès internet et tous les groupes pourront travailler sur leur VM. Dans un second temps, nous ajouterons l'IPv6.
Commandes Cisco utiles
enable // passage en admin
write // Sauvegarde de la config !! PENSER A SAUVEGARDER AVANT UNE COUPURE DU ROUTEUR !!
show interface // Montre l'état d'une interface
shutdown // Eteint un port ou un BDI (Dépend du niveau au quel on utilise la commande)
no shutdown // Allume un port ou un BDI (Dépend du niveau au quel on utilise la commande)
exit // recule d'un niveau
Configuration des ports
enable // Passage en administrateur configure terminal interface GigabitEthernet0/0/0 //Vers le Commutateur 6006 no ip address negotiation auto media-type RJ45 service instance 2 ethernet encapsulation dot1q 2 rewrite ingress tag pop 1 symmetric bridge-domain 2 service instance 3 ethernet encapsulation dot1q 3 rewrite ingress tag pop 1 symmetric bridge-domain 3 service instance 4 ethernet encapsulation dot1q 4 rewrite ingress tag pop 1 symmetric bridge-domain 4 service instance 5 ethernet encapsulation dot1q 5 rewrite ingress tag pop 1 symmetric bridge-domain 5 service instance 6 ethernet encapsulation dot1q 6 rewrite ingress tag pop 1 symmetric bridge-domain 6 service instance 42 ethernet encapsulation dot1q 42 rewrite ingress tag pop 1 symmetric bridge-domain 42 service instance 130 ethernet encapsulation dot1q 130 rewrite ingress tag pop 1 symmetric bridge-domain 130 interface GigabitEthernet0/0/1 //Vers le routeur de l'école no ip address negotiation auto service instance 130 ethernet encapsulation dot1q 130 bridge-domain 130 interface GigabitEthernet0/0/2 //Vers le Commutateur 4006 no ip address negotiation auto media-type sfp service instance 2 ethernet encapsulation dot1q 2 rewrite ingress tag pop 1 symmetric bridge-domain 2 service instance 3 ethernet encapsulation dot1q 3 rewrite ingress tag pop 1 symmetric bridge-domain 3 service instance 4 ethernet encapsulation dot1q 4 rewrite ingress tag pop 1 symmetric bridge-domain 4 service instance 5 ethernet encapsulation dot1q 5 rewrite ingress tag pop 1 symmetric bridge-domain 5 service instance 6 ethernet encapsulation dot1q 6 rewrite ingress tag pop 1 symmetric bridge-domain 6 service instance 42 ethernet encapsulation dot1q 42 rewrite ingress tag pop 1 symmetric bridge-domain 42 service instance 130 ethernet encapsulation dot1q 130 rewrite ingress tag pop 1 symmetric bridge-domain 130
Pour le spanning-tree, on tape :
spanning-tree mode pvst
Pour la configuration de l'OSPF :
configure terminal router ospf 1 //Pour l'échange de routes ipv4 router-id 10.100.0.1 log-adjacency-changes summary address 193.48.57.160 255.255.255.240 redistribute connected subnets network 192.168.222.8 0.0.0.7 area 1 exit exit
Configuration des BDI (Vlans)
Ici nous configurons les différents BDI. On attribue donc une adresse IP au routeur dans chacun d'entre en fonction de ce qui a été défini dans la table d'adressage. Pour le BDI 130, il faut s'assurer que l'adresse est lire car c'est le réseau de l'école et non le notre. Pour cela, nous avons effectué un ping sur l'adresse que nous voulions our otre routeur et vérifié qu'elle ne répondait pas avant de l'attribuer au routeur.
Une fois cette précaution prise, voici les commandes à taper :
configure terminal interface BDI130 ip address 192.168.222.1 255.255.255.248 //IPV4 - pas besoin de HSRP ipv6 address FE80::42:2 link-local //IPV6 ipv6 enable
exit interface BDI2 ip address 10.60.1.254 255.255.255.000 //IPV4 standby version 2 standby 2 ip 10.60.1.252 //Déclaration adresse virtuelle par HSRP standby 2 preempt ipv6 address 2001:660:4401:60B2::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B2::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance exit interface BDI3 ip address 10.60.2.254 255.255.255.000 //IPV4 standby version 2 standby 3 ip 10.60.2.252 //Déclaration adresse virtuelle par HSRP standby 3 preempt ipv6 address 2001:660:4401:60B3::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B3::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance exit interface BDI4 ip address 10.60.3.254 255.255.255.000 //IPV4 standby version 2 standby 4 ip 10.60.3.252 //Déclaration adresse virtuelle par HSRP standby 4 preempt ipv6 address 2001:660:4401:60B4::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B4::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance interface BDI5 ip address 10.60.4.254 255.255.255.000 //IPV4 standby version 2 standby 5 ip 10.60.4.252 //Déclaration adresse virtuelle par HSRP standby 5 preempt ipv6 address 2001:660:4401:60B5::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B5::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance exit interface BDI6 ip address 10.60.5.254 255.255.255.000 //IPV4 standby version 2 standby 6 ip 10.60.5.252 //Déclaration adresse virtuelle par HSRP standby 6 preempt ipv6 address 2001:660:4401:60B6::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B6::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance exit interface BDI42 ip address 193.48.57.174 255.255.255.240 //IPV4 standby version 2 standby 7 ip 193.48.57.174 //Déclaration adresse virtuelle par HSRP standby 7 preempt ipv6 address 2001:660:4401:60B1::/64 eui-64 //IPV6 ipv6 enable ipv6 nd prefix 2001:660:4401:60B1::/64 1000 900 //Donner un préfixe IPV6 à chaque machine ipv6 nd router-preference Low //Définition priorité pour la redondance exit exit
Problèmes Rencontrés
Le premier problème rencontré s'est montré lorsque lors d'un reboot du routeur. En effet le routeur avait booté sur une ancienne version de l'OS qui n'implémentait pas le spanning-tree.
enable conf t boot system bootflash:isr4300-universalk9.03.16.05.S.155-3.S5-ext.SPA.bin exit write reload
Un autre problème à été que si le BDI 130 de l'interface GigabyteEthernet0/0/1 est configuré en untagged, alors il ne gère plus le spanning-tree.
Nous avons donc dû configurer le port du commutateur de l'école en trunk au lieu de VLAN 130.
Nous avons donc configuré l'interface GigabyteEthernet0/0/1 de notre routeur avec le BDI 130 en taggé.
Test d'intrusion Wifi
Installation du Wifi
La carte wifi du PC portable fourni pour le TP n'est pas reconnue par l'OS. Nous avons donc utilisé un dongle wifi externe (Wi-Pi). Pour cela nous avons commencé par installer les drivers de la clé. Ces drivers se trouvent dans le package firmware-ralink.
Commande pour installer le package :
apt-get install firmware-ralink
Crackage de la clé WEP
La première clé que nous avons cracké est une clé WEP (assez peu sécurisée). Pour cracker cette clé, nous avons utilisé un package contenant tous les utilitaires nécessaires (aircrack-ng).
apt-get install aircrack-ng
Une fois le paquet installé, on liste les interfaces disponibles pour trouver la clé wifi.
airmon-ng
Une fois notre interface trouvée, on la démarre :
airmon start 'interface'
Le nom de l'interface est wlx40a5ef05aa25. Ce nom change à l’exécution de la commande. On doit relancer la commande sur l'interface wlan0mon.
L'interface est alors démarrée.
Maintenant que l'interface est démarrée, on peut écouter pour trouver quelle borne wifi émet. Pour cela on utilise la commande suivante :
airodump-ng -i wlan0mon
On repère une cracotte qui émet des données.
Une fois la cracotte repérée, on utilise la commande suivante pour écouter et enregistrer toute ce quelle émet.
airodump -i wlan0mon -c canal d'émission -d SSID -w /root/crack.cap
-i : Spécifie l'interface d'écoute -c : Spécifie le canal d'écoute -d : Spécifie le SSID sur lequel on écoute -w : Spécifie le fichier dans lequel on écrit
En parallèle de cette commande, on exécute la commande suivante sur un autre terminal pour craquer la clé WEP :
aircrack-ng /root/crack.cap-01.ivs
Cette commande prend en paramètre le fichier créé par la commande airodump.
Une fois la clé craquée, aircrack-ng nous donne la clé en hexadécimal.
Craquage WPA
Une fois le caquage de la clé WEP réussi, nous somme passé au craquage d'une clé WPA. Cette méthode de sécurisation étant plus performante, il nous fallait des indices sur la clé avant de tenter de la casser. On sait que la clé est composé de 8 chiffres. Nous avons donc pu générer un dictionnaire de toutes les clés possibles à l'aide d'un programme c très simple :
#include <stdio.h> #include <stdlib.h> int main (){ FILE* dico = NULL; unsigned long int cpt = 0; dico = fopen("dico.txt", "w"); while (cpt < 100000000){ fprintf(dico,"%08ld\n",cpt); cpt ++; } fclose(dico); return 0; }
Une fois le dictionnaire de clé généré, on reprend les premières étapes du cassage de la clé WEP :
airodump -i wlan0mon airodump -i wlan0mon -c canal d'émission -d SSID -w /root/crack.cap
Ici on a pas forcément besoin de trouver une cracotte entrain d'émettre. On doit juste écouter jusqu'à capturer les entêtes d'identifications.
Une fois les entêtes récupérées, on récupère le fichier pour le mettre sur un ordinateur plus puissant pour accélérer la vitesse de craquage. Pour casser la clé on utilise la commande suivante :
aircrack-ng crack.cap-01.ivs -w dico.txt
-w permet de spécifier le fichier contenant les clé à tester
Cette opération est très longue :
- 1 jour et 15h annoncé sur le PC portable
- 7h annoncé sur une Zabeth
Nous n'avons donc pas eu le temps de craquer la clé.
Machine Virtuelle
Après avoir rendu le réseau fonctionnel, nous avons pu passer à la configuration de notre machine virtuelle. Cette machine virtuelle est implémentée sur un serveur faisant partie de notre réseau. Elle a pour but de recevoir différents docker contenant des services internet :
- Serveur DNS
- Site Web (en HTTP et en HTTPS)
- Serveur d'identification
Installation de la VM Xen
La première étape a été de créer la machine virtuelle sur le serveur cordouan. Pour cela on commence par aller sur cordouan :
ssh root@cordouan.insecserv.deule.net
Arrivé sur cordouan on crée notre VM :
xen-create-image --hostname=rince-cochon --dhcp --dir=/usr/local/xen --dist=ascii --apt-proxy=http://proxy.polytech-lille.fr:3128 --mirror=http://fr.deb.devuan.org/merged/ --force
Nous avons ensuite modifié le fichier rince-cochon.cfg afin d'ajouter la VM dans un bridge afin de lui donner un accès internet. Dans un premier temps, nous l'avons mise dans le bridge StudentsInfo car notre réseau n'était pas tout à fait opérationnel.
vif = [ 'mac=Adresse mac, bridge=StudentsInfo' ]
On peut maintenant lancer notre VM (commandes à taper en étant de /etc/xen)
xl create rince-conchon.cfg xl console rince-cochon
Lors de la première connexion nous nous sommes rendu compte que le mot de passe par défaut qui nous est donné au moment de la création est trop complexe. Nous l'avons donc modifié par un mot de passe plus facile à retenir.
passwd
Notre VM créée, nous avons enfin pu passer aux choses sérieuses. Nous avons monté le /var et le /home de notre VM sur cordouan.
Sur Cordouan, il faut créer des volumes de 10Go pour chaque répertoire
lvcreate -L10G -n apIMA5-rince-cochon-home virtual lvcreate -L10G -n apIMA5-rince-cochon-var virtual
Et nous avons créé un système de fichier dans ces volumes :
mke2fs /dev/virtual/apIMA5-rince-cochon-home mke2fs /dev/virtual/apIMA5-rince-cochon-var
On indique maintenant à notre VM où se trouve ses répertoires tous neufs :
disk = [ [...] 'phy:/dev/virtual/apIMA5-PaixDieu-home,xvdb1,w', 'phy:/dev/virtual/apIMA5-PaixDieu-var,xvdb2,w', ]
La commande fdisk -l
nous permet de vérifier que les volumes sont bien montés.
On modifie le fichier /etc/fstab de la VM pour que les volumes soient pris en compte à chaque démarrage de la VM :
/dev/xvdb1 /home ext4 defaults 0 2 /dev/xvdb2 /var ext4 defaults 0 2
Pour le volume /var, nous devons procéder différemment et lançons les commandes suivantes depuis la VM :
mount /dev/xvdb2 /mnt mv /var/* /mnt umount /mnt mount -a
On vérifie que tout est OK avec df
.
Configuration des Dockers
Les différents services que nous devons implémenter dans notre VM sont à mettre dans des conteneurs. Pour cela nous allons utiliser Docker.
Docker est un logiciel libre permettant facilement de lancer des applications dans des conteneurs logiciels.
HTTP
Réservation et configuration du nom de domaine
Réservation
Pour mettre en place un site internet, nous avons dû acheter un nom de domaine afin de rendre notre site accessible depuis n'importe où facilement. Nous avons donc acheté un nom de domaine à l'aide du compte fourni sur Gandi.net. Le nom de notre VM étant Rince Cochon, nous avons réservé le nom de domaine rince-cochon.pw.
Configuration
Sur Gandi, il faut remplir le Glue Recors afin d’associer notre nom de domaine à l'IP (routée) de notre VM.
Il faut également configurer le DNS pour pouvoir accéder à notre site via le om de domaine. La configuration doit se faire à la fois sur Bind (notre serveur DNS) et sur Gandi. Nous allons ici nous intéresser à la configuration sur Gandi.net.
Dans l'onglet Serveur de nom on supprime les 3 adresses pré-remplies et on met la configuration suivante :
Configuration du Docker
HTTPS
Modifications sur Gandi
Modififications du Docker
Bind
FreeRadius
Pour l'installation du Docker FreeRadius, nous avons lancé le Dockerfile suivant :
FROM alpine:3.8 WORKDIR /projects RUN apk update && apk upgrade && \ apk add --update freeradius freeradius-postgresql freeradius-radclient freeradius-rest freeradius-eap openssl-dev && \ chgrp radius /usr/sbin/radiusd && chmod g+rwx /usr/sbin/radiusd && \ ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled/sql && \ rm /var/cache/apk/* VOLUME \ /opt/db/ \ /etc/freeradius/certs EXPOSE \ 1812/udp \ 1813/udp \ 18120 CMD ["radiusd","-X"]
Pour installer les différents packets nécessaires au bon fonctionnement de FreeRadius. Concernant la configuration pour faire de l'authentification par eap-tls, il y a plusieurs fichier à modifier.
Le fichier default :
server default { listen { type = auth ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipaddr = * port = 0 type = acct limit { } } listen { type = auth ipv6addr = :: # any. ::1 == localhost port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipv6addr = :: port = 0 type = acct limit { } } authorize { filter_username preprocess digest suffix eap { ok = return updated = return } files -sql -ldap expiration logintime } authenticate { digest eap Auth-Type eap { eap { handled = 1 } if (handled && (Response-Packet-Type == Access-Challenge)) { attr_filter.access_challenge.post-auth handled # override the "updated" code from attr_filter } } } preacct { preprocess acct_unique suffix files } accounting { detail unix -sql exec attr_filter.accounting_response } session { } post-auth { update { &reply: += &session-state: } -sql exec remove_reply_message_if_eap if("%{sql:select count(*) from macaddenabled where isenabled = 'true' and macaddress = '%{Calling-Station-Id}'}">0){ ok }else{ if("%{sql:select count(*) from macaddenabled where isenabled = 'false' and macaddress = '%{Calling-Station-Id}'}">0){ reject }else{ if("%{sql:insert into macaddenabled values('%{Calling-Station-Id}', 'false')}"){ reject } } } Post-Auth-Type REJECT { -sql attr_filter.access_reject remove_reply_message_if_eap } Post-Auth-Type Challenge { } } pre-proxy { } post-proxy { } }
Le fichier eap avec les différents types d'authentification possibles:
eap { default_eap_type = tls timer_expire = 60 ignore_unknown_eap_types = no cisco_accounting_username_bug = no max_sessions = ${max_requests} md5 { } leap { } gtc { auth_type = PAP } tls-config tls-common { private_key_password = whatever private_key_file = ${certdir}/server.key certificate_file = ${certdir}/server.pem ca_file = ${cadir}/ca.pem dh_file = ${certdir}/dh ca_path = ${cadir} cipher_list = "HIGH" cipher_server_preference = no ecdh_curve = "prime256v1" cache { enable = yes lifetime = 24 # hours max_entries = 255 } verify { } ocsp { enable = no override_cert_url = yes url = "http://127.0.0.1/ocsp/" } } tls { tls = tls-common } ttls { tls = tls-common default_eap_type = md5 copy_request_to_tunnel = no use_tunneled_reply = no virtual_server = "inner-tunnel" } peap { tls = tls-common default_eap_type = mschapv2 copy_request_to_tunnel = no use_tunneled_reply = no virtual_server = "inner-tunnel" } mschapv2 { } }
Le fichier radiusd.conf:
prefix = /usr exec_prefix = ${prefix} sysconfdir = /etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = /var/log/radius raddbdir = ${sysconfdir}/raddb radacctdir = /var/log/radius/radacct name = radiusd confdir = ${raddbdir} modconfdir = ${confdir}/mods-config certdir = ${confdir}/certs cadir = ${confdir}/certs run_dir = ${localstatedir}/run/${name} db_dir = ${raddbdir} libdir = /usr/lib/freeradius pidfile = ${run_dir}/${name}.pid correct_escapes = true max_request_time = 30 cleanup_delay = 5 max_requests = 16384 hostname_lookups = no log { destination = files colourise = yes file = ${logdir}/radius.log syslog_facility = daemon stripped_names = no auth = no auth_badpass = no auth_goodpass = no msg_denied = "You are already logged in - access denied" } checkrad = ${sbindir}/checkrad security { user = radius group = radius allow_core_dumps = no max_attributes = 200 reject_delay = 1 status_server = yes allow_vulnerable_openssl = no } proxy_requests = yes $INCLUDE proxy.conf $INCLUDE clients.conf thread pool { start_servers = 5 max_servers = 32 min_spare_servers = 3 max_spare_servers = 10 max_requests_per_server = 0 auto_limit_acct = no } modules { $INCLUDE mods-enabled/ } instantiate { } policy { $INCLUDE policy.d/ } $INCLUDE sites-enabled/
Et si vous voulez enregistrer les connections dans une base de données (ici via docker postgresql): Le fichier sql:
sql { driver = "rlm_sql_postgresql" dialect = "postgresql" server = "postgresql" port = 5432 login = "radius" password = "radius" radius_db = "radius" acct_table1 = "radacct" acct_table2 = "radacct" postauth_table = "radpostauth" authcheck_table = "radcheck" groupcheck_table = "radgroupcheck" authreply_table = "radreply" groupreply_table = "radgroupreply" usergroup_table = "radusergroup" delete_stale_sessions = yes pool { start = ${thread[pool].start_servers} min = ${thread[pool].min_spare_servers} max = ${thread[pool].max_servers} spare = ${thread[pool].max_spare_servers} uses = 0 retry_delay = 30 lifetime = 0 idle_timeout = 60 } client_table = "nas" group_attribute = "SQL-Group" $INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf }
Pour lancer ce docker, nous avons utiliser les Docker-Compose, qui permettent de lancer différents dockers avec différentes options via un fichier yaml qu'on lance via la commande : docker-compose -f "nom du fichier".yml up -d
version: "3.1" services: #FREERADIUS DOCKER freeradius-pgsql: image: "freeradius-pgsql" restart: always ports: - "1812:1812/udp" - "1813:1813" - "18120:18120" volumes: - "/root/raddb/certs:/etc/raddb/certs" - "/root/raddb/clients.conf:/etc/raddb/clients.conf" - "/root/raddb/radiusd.conf:/etc/raddb/radiusd.conf" - "/root/raddb/sql:/etc/raddb/mods-available/sql" - "/root/raddb/default:/etc/raddb/sites-enabled/default" - "/root/raddb/eap:/etc/raddb/mods-available/eap"