TP sysres IMA5sc 2018/2019 G10

De Wiki d'activités IMA

TP Systeme Reseau

Vous trouverez sur cette page Wiki tous les travaux relatifs au cours de Systeme Reseau réalisés par Olivier MAHIEUX & Etienne PROFIT

TP Conteneur Reseau

Etapes de realisation des conteneurs (a la main)

Creation d'un fichier (utilisé en tant que partition) de 10240 bloc de 1024k octets (Soit un fichier de 10Go)

dd if=/dev/zero of=disc.img bs=1024k count=10240

Creation d'un systeme d'un systeme de fichier linux au sein du fichier precedemment créé

mkfs disc.img

Creation des dossiers temporaires dans lequel le systeme sera monté

mkdir /tmp/fs1
mkdir /tmp/fs2
mkdir /tmp/fs3

Montage du systeme de fichier dans fs1

mount -o loop disc.img /tmp/fs1

La commande df -Ath permet d'avoir la liste des partitions montés par le systeme

Df ath.png

On voit bien que le /tmp/fs0 propose un emplacement memoire de 10Go

Bootstrap d'un systeme Debian au sein de la partition montée

debootstrap --include=apache2,vim,nano  stable /tmp/fs1

On inclue les package Apache2 et nano pour nos conteneurs.

Preparation du montage du systeme

echo "proc /proc proc defaults 0 0" >> rootfs/etc/fstab

Unmount de la partition

umount /tmp/fs1

(On remarque bien que la partition n'est plus montée via df -h)

Duplication de l'image deux fois, puis montage des trois systemes de fichier

cp diskTPconteneur diskTPconteneur2
cp diskTPconteneur diskTPconteneur3


mount -o loop diskTPconteneur /tmp/fs1
mount -o loop diskTPconteneur2 /tmp/fs2
mount -o loop diskTPconteneur3 /tmp/fs3

On verifie le resultat avec un autre df -h


Demarrage des conteneurs en chargeant les systemes de fichier.

unshare -n -u -p -f -m chroot /tmp/fs1 /bin/sh -c "mount /proc ; /bin/bash";
# La commande unshare permet de couper la liaison d'un processus avec les differentes tables de nom
# -n : table de nom reseau
# -u : table des hostnames

Si la creation du conteneur fonctionne bien : on ne peut pas revenir dans le dossier parent en faisant la commande 'cd ..', et de plus la commande ps ne retourne que les processus isolés du conteneur.

En lancant donc les trois conteneurs, chacun est alors independant de l'autre. On peut lancer sur la machine physique un ps et on observe bien les processus unshare liés à nos conteneurs.


Mise en réseau des conteneurs

Creation du bridge (commutateur virtuel) sur la machine hôte

ip link add bridge2 type bridge

Sur la machine hote, on crée également les différentes interfaces réseaux (une par conteneur + une pour le mandataire)

ip link add vif1 type veth peer name eth0@vif1   #conteneur 1
ip link add vif2 type veth peer name eth0@vif2   #conteneur 2
ip link add vif3 type veth peer name eth0@vif3   #conteneur 3
ip link add vif4 type veth peer name eth1@vif4   #mandataire

Ajout puis activation des differentes interfaces reseaux dans leur bridge respectif.

ip link set vif1 master commutPM
ip link set vif2 master commutPM
ip link set vif3 master commutPM
ip link set vif4 master bridge
ip link set vif1 up
ip link set vif2 up
ip link set vif3 up
ip link set vif4 up

On recupere les PID des differents conteneurs

ps aux | grep unshare


Il faut ensuite connecter les differentes interfaces reseaux du commutateur virtuel à leur conteneur respectif

ip link set eth0@vif1 netns /proc/[PID CONTENEUR 1]/ns/net name eth0 #conteneur 1
ip link set eth0@vif2 netns /proc/[PID CONTENEUR 2]/ns/net name eth0 #conteneur 2
ip link set eth0@vif3 netns /proc/[PID CONTENEUR 3]/ns/net name eth0 #conteneur 3

On ajoute ensuite les adresses IP a chaque conteneur

Dans le conteneur 1

ip addr add 192.168.1.4/24 dev eth0
ip link set eth0 up
ip link set lo up

Dans le conteneur 2

ip addr add 192.168.1.3/24 dev eth0
ip link set eth0 up
ip link set lo up

Dans le conteneur 3

ip addr add 192.168.1.2/24 dev eth0
ip link set eth0 up
ip link set lo up

On peut pinger les conteneurs entre eux ainsi qu'avec la machine hôte pour verifier les interconnexions

On ajoute egalement l'interface eth1 au conteneur 3 qui servira de mandataire

ip link set eth1@vif4 netns /proc/[PID CONTENEUR 3]/ns/net name eth1
ip addr add 172.26.145.3/24 dev eth1
ip link set eth1 up

Mise en place des mandataires inverses

Configuration du fichier sites-enables/000-default.conf du mandataire inverse (conteneur 3)

<VirtualHost *:80>
 ServerName oli.plil.space
 ServerAdmin webmaster@localhost
 ProxyPass / http://192.168.0.4
 ProxyPassRever / http://192.168.0.4
 ProxyRequests Off
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
 ServerName eti.plil.space
 ServerAdmin webmaster@localhost
 ProxyPass / http://192.168.0.3
 ProxyPassRever / http://192.168.0.3
 ProxyRequests Off
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

11h10 => Serveurs Web unshare OK

Utilisation de Docker

Installation de Docker

Nous avons du réaliser une installation du logiciel à la main en téléchargeant les images docker nous-même. L'installation par le service Docker connaissant des difficuoltés.

Avant de lancer une image Docker, il convient de réaliser quelques modifications : Dans etc/default/docker : on doit commenter Docker opts ="--iptables=false"

service docker restart
iptables-save

Ensuite on peut lancer notre docker avec

docker run -it debian

Puis on exporte les variables d'environnements pour le proxy et on peut faire

apt update 
apt install apache2
apt install vim nano

Ensuite on sort du conteneur en faisant Ctrl+P et Ctrl+Q. (Attention ! Un exit arrête le processus du conteneur)

docker image //nous permet de voir les différents Docker créés
docker commit ID debian_apache// nous permet de sauvegarder ce docker avec cette configuration

On va ensuite créer nos 3 conteneurs et les lier au même reseau (ne pas oublier de préciser le port) :

docker network create OurReseau
docker run -i -t --network=OurReseau debian_apache docker run -i -t --network=OurReseau debian_apache docker run -i -t --network=OurReseau -p:80:80 debian_apache 

Nos 3 conteneurs sont donc créés et les interfaces reseau sont gérées par Docker. Cependant on ne connait pas les adresses ip de nos conteneurs. On les récupère avec "ip a" et on peut ensuite commencer la creation du mandataire inverse.
Conteneur 1 : 172.18.0.2
Conteneur 2 : 172.18.0.3
Conteneur 3 : 172.18.0.4

En suivant les même étapes :

  • Installation d'Apache2
  • Modification du fichier de configuration
  • Creation d'un second nom de domaine "MahPro/Etid/Olid" sur Gandi avec l'ip 172.26.145.1 (Tutur01)
  • Modification du fichier HTML de test du serveur Apache
  • Connexion à partir d'un navigateur sur "olid.plil.space ou etid.plil.space"

14h00 => Serveur Web (docker) OK

Installation de Xen et Devuan sur un serveur HP

Elements physiques

Les slots de RAM étant innocupés, nous avons partagé 4GB de RAM ,récupérés sur un autre serveur, sur les deux HP.
Ceci fait nous pouvions lancer le serveur.
Dans le BIOS, nous avons changé d'une part la sequence de boot afin de booter sur clé.
D'autre part, nous avons supprimé toute les traces des disques précedemment installés. Pour les disques physiques déjà présents, nous avions 2*36GB et 6*146GB. Les 6 disques ont été installés en RAID5 + 1 disque spare.

Elements systèmes et logiciels

Linux Devuan version 4.9.0-6-amd64
Xen version 4.9.0-6-amd64
Installation des paquets Xen

 apt-get install xen-hypervisor-4.4-amd64
 apt-get install xen-tools

Modification de grub pour changer la priorité du boot sur "Devuan avec Xen".

 dpkg-divert --divert /etc/gub.d/20_linux_xen --rename /etc/grub.d/50_linux_xen

Cette opération permet de booter directement avec XEN.
On met à jour grub puis on reboot

 update-grub
 reboot

Elements reseaux

On peut choisir 2 options ici : - Connecter en RJ45 le serveur sur la carte eth1 d'un PC et configurer puis utiliser l'interface du PC.
- (Notre choix) Connecter directement le serveur au reseau de la salle et configurer son interface eth0 en DHCP.
Le fichier interfaces contient les informations suivantes :

 auto lo
 iface lo inet loopback
 auto eth0
 allow_hotplug eth0
 iface eth0 inet dhcp

On ajoute aussi les proxy.

Creation d'une VM avec Xen

Maintenat que Xen est installé on peut utiliser la commande suivante pour creer la premiere machine virtuelle.

 xen-create-image --hostname glopiglopa --dhcp --dir /usr/local/xen --dist stable --force --mirror=http://fr.deb.devuan.org/merged

Installation d'une machine virtuelle sur serveur

Le serveur Corduan installé et les tables de routage IP créées, on installe notre machine virtuelle sur le serveur Cordouan.
On passe par l'hyperviseur Xen.

 xen-create-image --hostname=Hermes --ip=193.48.57.186 --netmask=255.255.255.240 --gateway=193.48.57.160 --dir=/usr/local/xen

Une fois la VM créée, il est possible de la démarrer de la manière suivante :

 xl create /etc/xen/Hermes.cfg 

Ensuite, nous lançons la console de cette manière :

 xl console Hermes 
Puis, pour sortir de cette dernière, nous faisons :
 ctrl + alt gr + ] 
Enfin, pour éteindre la machine virtuelle :
 xl shutdown Hermes 
Et pour détruire la VM :
 xl destroy Hermes 

Création des partitions

Nous allons créer des partitions sur l'hôte pour héberger /home et /var

lvcreate -L10G -n hermes-home virtual lvcreate -L10G -n hermes-var virtual

Modification du fichier /etc/xen/hermes.cfg pour ajouter les disques

 (+)
 disk        = [
                  'phy:/dev/virtual/hermes-home,xvda3,w',
                  'phy:/dev/virtual/hermes-var,xvda4,w',
               ]

Après redémarrage de la VM, nous créons les systèmes de fichiers sur les volumes:

 mkfs -t ext4 /dev/xvda3
 mkfs -t ext4 /dev/xvda4

On utilise la commande fdisk -l afin de constater que les volumes sont bien montés.

Home

Afin de s'assurer que la partition home soit montée au démarrage de la VM, nous modifions le fichier /etc/fstab de celle-ci:

 (+)
 /dev/xvda3 /home ext4 defaults 0 2

Nous pouvons ensuite simplement monter la partition

 mount -a

Var

La partition var est d'abord montée dans un répertoire temporaire /mnt:

 mount /dev/xvda4 /mnt
 mv /var/* /mnt

La partition est ensuite rajoutée dans le fichier /etc/fstab:

 /dev/xvda4 /var ext4 defaults 0 2

Création d'un RAID

On va creer 3 volumes sur Cordouan pour réaliser un RAID pour notre machine. Grâce à cet configuartion on ajoute de la redondance à notre système.

lvcreate -L 1G -n /dev/virtual/hermes-raid1 lvcreate -L 1G -n /dev/virtual/hermes-raid2 lvcreate -L 1G -n /dev/virtual/hermes-raid3

Nous ajoutons dans /etc/xen/hermes.cfg

 'phy:/dev/virtual/hermes-raid1, xvdd1, w',
 'phy:/dev/virtual/hermes-raid2, xvdd2, w',
 'phy:/dev/virtual/hermes-raid3, xvdd3, w',

Reboot de la machine depuis cordouan

Utilisation de l'utilitaire mdadm.

Nous créons le disque RAID5

mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd1 /dev/xvdd2 /dev/xvdd3 

Installation d'un système de fichiers

mkfs -t ext4 /dev/md0 

Montage des disques:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
mount /dev/md0 /mnt

Test de reconstruction:

On crée un fichier toto.txt de contenu "toto" au dossier /mnt.

On supprime l'une des partitions, la partition xvdd1

mdadm --set-faulty /dev/md0 /dev/xvdd1
mdadm --remove /dev/md0 /dev/xvdd1
 cat /proc/mdstat
 Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
 md0 : active raid5 xvdd3[2] xvdd2[0]
      2093056 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]


Le fichier toto.txt est toujours présent et intact, on relance la création de la partition précédemment supprimée.

 mdadm --add /dev/md0 /dev/xvdd2
 cat /proc/mdstat
 Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
 md0 : active raid5 xvdd1[3] xvdd3[2] xvdd2[1]
      2093056 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
 unused devices: <none>

Mise en place du DNS

On ajoute les paquets pour le serveur apache2 et bind9.

On réserve un nom de domaine sur Gandi.net : mercure-hermes.space

Nous avons ensuite configuré bind en créant le fichier db.mercure-hermes.space dans le dossier /etc/bind/

 TTL 604800
 INCLUDE /etc/bind/mercure-hermes.dnssec/Kmercure-hermes.space-ksk.key
 INCLUDE /etc/bind/mercure-hermes.dnssec/Kmercure-hermes.space-zsk.key
 @	IN      SOA     ns.mercure-hermes.space. (
                         3           ; Serial
                         604800      ; Refresh
                         86400       ; Retry
                         2419200     ; Expire
                         604800 )    ; Negative Cache TTL
 ;
         IN      NS      ns.mercure-hermes.space.
      	  IN	  NS	  ns6.gandi.net. 
 	  IN	  A	  193.48.57.186 
 ns      IN      A       193.48.57.186
 www     IN      A       193.48.57.186


La zone est spécifiée dans le fichier named.conf.local:

 zone "mercure-hermes.space" {
        type master;
        file "/etc/bind/db.mercure-hermes.space";
        allow-transfer {217.70.177.40;};
        notify no;
 };

Configuration Gandi.net

Sur gandi.net --> Domains --> Glue Record pour y ajouter notre espace de nom (namespace) mercure-hermes.space et notre IP.

Nous avons ajouté sur gandi notre DNS principal et notre DNS secondaire dans gandi.net --> Domains --> Nameservers avec :

   DNS1 : ns.mercure-hermes.space
   DNS2 : ns6.gandi.net

Mise en place de DNSSEC

Modification dans le fichier named.conf.options:

 dnssec-validation auto;
 dnssec-enable yes;

On génère ensuite deux paires de clés ZSK et KSK:

 dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE mercure-hermes.space
 dnssec-keygen -a RSASHA1 -b 1024 -n ZONE mercure-hermes.space

On inclut ensuite les clés dans le fichier /etc/bind/db.mercure-hermes.space:

$include /etc/bind/mercure-hermes.space.dnssec/mercure-hermes.space-ksk.key $include /etc/bind/mercure-hermes.space.dnssec/mercure-hermes.space-zsk.key

On prend soin de mettre $TTL 604800 au début du fichier.

On signe enfin la zone avec les clés ZSK et KSK:

 dnssec-signzone -o mercure-hermes.space -k Kmercure-hermes.space-ksk.key ../db.mercure-hermes.space Kmercure-hermes.space-ksk.key

On renseigne ensuite les clés signées sur gandi.net -> Domains -> mercure-hermes.space -> DNSSEC

Sécurisation de notre serveur web par certificat SSL

Nous avons commencé par générer un certificate request grâce à la commande suivante:

openssl req -nodes -newkey rsa:2048 -sha1 -keyout mercure-hermes.space.key -out mercure-hermes.space.csr

Le certificat est stocké dans etc/apache/apache_keys.

On choisit une vérification par fichier et on l'ajoute dans le répertoire: /var/www/html/.well-known/pki-validation. On place le certificat (.ctr) et le fichier .pem dans le répertoire: /etc/ssl/certs. Le fichier .key se place dans le répertoire /etc/ssl/private

On créer un fichier de configuration /etc/apache2/sites-available/000-mercure-hermes.space-ssl.conf:

 <VirtualHost 193.48.57.186:443>
     ServerName www.mercure-hermes.space
     ServerAlias mercure-hermes.space
     DocumentRoot /var/www/html/
     CustomLog /var/log/apache2/secure_acces.log combined
     SSLEngine on
     SSLCertificateFile /etc/ssl/certs/mercure-hermes.space.crt
     SSLCertificateKeyFile /etc/ssl/private/mercure-hermes.space.key
     SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem
     SSLVerifyClient None
 </VirtualHost>
 <VirtualHost 193.48.57.186:80>
     ServerName www.mercure-hermes.space
     ServerAlias mercure-hermes.space.space
     Redirect / https://mercure-hermes.space
 </VirtualHost>

On active la configuration du site:

 a2enmod ssl 
 a2ensite 000-mercure-hermes.space-ssl.conf 
 service apache2 restart

On obtient ainsi un site sécurisé en https. De plus, les différents accès par "wwww" ou "ns" sont automatiquement redirigée vers "https".

Tests d'intrusion

Craquage de clé WPA

On utilise le packet aircrack-ng pour analyser les paquets d'identification.

On commence par vérifier que le point d'accès wifi de notre machine de travail en écoute. Dans le cas où elle ne l'est pas déjà, on exécute la commande

airmon-ng start $NOM_INTERFACE //l'interface a un nom du type wlp2...

On lance ensuite la commande

airodump-ng $NOM_INTERFACE

on trouve l'adresse MAC de notre point d'accès cracotte10 :

<importimage>

On capture ensuite les paquets de handshake voulu grâce à la commande

airodump-ng $NOM_INTERFACE --channel 9 --bssid $BSSID --write paquet-craq10

Aussitôt que le paquet est capturé, on commence une attaque de type force brute. Cette attaque nécessite un dictionnaire contenant l'intégralité des clés possibles. Cette clé est un nombre compris entre 1 et 99999999, il suffit donc de créer un petit programme en C qui va ajouter une à une des lignes dans un fichier, chaque ligne contenant une clé possible.

On lance ensuite la commande

aircrack-ng paquet-craq10.cap -w dico.txt

Lors de notre départ le 17/12 à 18h30, le programme est toujours en cours d'éxécution sur la Zabeth 04.

FreeRadius

Free Radius est un service d'authentification que nous allons utiliser pour l'authentification sur les points d'accès. Installation de FreeRad

On change le mot de passe /etc/freeradius/3.0/users: hermes Cleartext-Password := "glopglop"

Et dans /etc/freeradius/3.0/mods-enabled on ajoute:

 ---------
 eap{
 ---------
 default_eap_type = peap
 --------
 }
 --------

Puis dans le fichier /etc/freeradius/mods-enabled/mschap, on décommente et on change :

 use_mppe = yes
 require_encryption = yes
 require_strong = yes

On ajoute la ligne :

 with_ntdomain_hack = yes

Modification sur le point d'accès==

On ajoute au point d'accès la configuration concernant notre machine virtuelle. On execute les commandes suivantes : Activation de la fonction 'aaa' et création des entitées radius_goup et eap_group

 enable
 conf t
 aaa new-model
 aaa authentication login eap_group20 group radius_group20
 aaa group server radius radius_group20
 server 193.48.57.186 auth-port 1812 acct-port 1813
 radius-server host 193.48.57.186 auth-port 1812 acct-port 1813 key secretIMA5SC
 end

Mise en place du ssid 'Hermes' et intégration dans le vlan 20:

 enable
 conf t
 dot11 ssid Hermes
 vlan 18
 authentication open eap eap_group20
 authentication network-eap eap_group20
 authentication key-management wpa
 Mbssid Guest-mode
 end

Liaison de l'interface wifi dot11radio0 avec la vlan et méthode encryption:

 enable
 conf t
 int dot11radio0
 Mbssid
 ssid Hermes
 encryption vlan 18 mode ciphers aes-ccm tkip
 end

Encapsulation

 enable
 conf t
 int dot11radio0.20
 encapsulation dot1Q 20
 end