TP sysres IMA2a5 2018/2019 G1

De Wiki d'activités IMA
Révision datée du 23 novembre 2018 à 08:18 par Aovelacq (discussion | contributions) (httpd)

Axel & Bastien COMMUTATEUR


Introduction

Ce TP consiste en la réalisation d’une maquette de réseau permettant de manipuler les protocoles de redondance réseau ainsi que le protocole réseau IPv6. D’un point de vue système nous avons à installer une machine virtuelle Xen avec l'OS Devian ainsi qu'implanter un auto-commutateur et un point d'accès. Nous effectuerons pas la suite des tests d'intrusion sur ces points d'accès afin de voir la vulnérabilité des différents protocoles de clé (WEP / WPA-PSK).

Installation des systèmes d'exploitation

Configuration de l'accès internet sur la Zabeth08

L’accès internet ne fonctionnait pas car l’utilitaire bridge-utils n’était pas installé, on a donc modifié le /etc/network/interfaces pour se connecter au serveur DHCP et avoir un accès internet temporaire et télécharger les paquets de cet utilitaire. Une fois ces paquets installés la connexion de pont a pu être réalisée, on a donc essayé de se connecter de nouveau, mais la connexion ne fonctionnait toujours pas. On a donc modifié le fichier /etc/dhcp/dhclient.conf pour ajouter un timeout et un retry de 180.

Voici ces fichiers:

     /etc/network/interfaces
     
     # This file describes the network interfaces available on your system
     # and how to activate them. For more information, see interfaces(5).
     
     source /etc/network/interfaces.d/*
     
     # The loopback network interface
     auto lo
     iface lo inet loopback
     
     # The primary network interface (IPv4)
     auto eth0
     iface eth0 inet manual
     up ip link set dev $IFACE up
     
     # A secondary network interface (IPv4)
     auto eth1
     iface eth1 inet manual
     up ip link set dev $IFACE up
     
     # Bridge
     auto bridge
     iface bridge inet dhcp
     bridge_ports eth0 eth1
     bridge_hw 00:22:4d:7a:f0:70
     /etc/dhcp/dhclient.conf
     # Configuration file for /sbin/dhclient.
     #
     # This is a sample configuration file for dhclient. See dhclient.conf's
     #    man page for more information about the syntax of this file
     #    and a more comprehensive list of the parameters understood by
     #    dhclient.
     #
     # Normally, if the DHCP server provides reasonable information and does
     #    not leave anything out (like the domain name, for example), then
     #    few changes must be made to this file, if any.
     #
     
     option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
     
     send host-name = gethostname();
     request subnet-mask, broadcast-address, time-offset, routers,
         domain-name, domain-name-servers, domain-search, host-name,
         dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
         netbios-name-servers, netbios-scope, interface-mtu,
         rfc3442-classless-static-routes, ntp-servers;
     
     #send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
     #send dhcp-lease-time 3600;
     #supersede domain-name "fugue.com home.vix.com";
     #prepend domain-name-servers 127.0.0.1;
     #require subnet-mask, domain-name-servers;
     timeout 180;
     retry 180;
     #reboot 10;
     #select-timeout 5;
     #initial-interval 2;
     #script "/sbin/dhclient-script";
     #media "-link0 -link1 -link2", "link0 link1";
     #reject 192.33.137.209;
     
     #alias {
     #  interface "eth0";
     #  fixed-address 192.5.5.213;
     #  option subnet-mask 255.255.255.255;
     #}
     
     #lease {
     #  interface "eth0";
     #  fixed-address 192.33.137.200;
     #  medium "link0 link1";
     #  option host-name "andare.swiftmedia.com";
     #  option subnet-mask 255.255.255.0;
     #  option broadcast-address 192.33.137.255;
     #  option routers 192.33.137.250;
     #  option domain-name-servers 127.0.0.1;
     #  renew 2 2000/1/12 00:00:01;
     #  rebind 2 2000/1/12 00:00:01;
     #  expire 2 2000/1/12 00:00:01;
     #}

Instalation de Devuan sur le PC portable

Avec la clé usb de boot on a installé l’OS Devuan sur le pc portable “brochet”

Nom d’utilisateur :
superbrochet / root
Mot de passe :
glopglop
Problèmes rencontrés
  • Le proxy de polytech n'a pas été défini lors de l'installation —> Ajout de http:/proxy proxy.polytech-lile.fr:3128 OK
  • le miroir devuan ne s’est pas configuré. On l’a donc ajouté
     /etc/apt/sources.list
     deb http://fr.deb.devuan.org/merged/ ascii main non-free contrib
     deb-src http://fr.deb.devuan.org/merged/ ascii main non-free contrib
     deb http://auto-mirror.devuan.org/merged ascii-security main non-free contrib
     deb-src http://auto-mirror.devuan.org/merged ascii-security main non-free contrib

Installation de la machine virtuelle avec Xen

Installation de la VM

Nous avons ouvert une connection Secure Shell (SSH) sur cordouan : cordouan.insecserv.deule.net

Nous avons ensuite créé la machine virtuelle grâce à la commande suivante :

     xen-create-image --hostname=coreff --dhcp --dir=/usr/local/xen --dist=ascii
     --apt-proxy=http://proxy.polytech-lille.fr:3128 --mirror=http://fr.deb.devuan.org/merged/ --force

On a ensuite modifié le fichier de configuration de la machine virtuelle de la façon suivante:

     /etc/xen/coreff.cfg
     # Configuration file for the Xen instance coreff, created
     # by xen-tools 4.7 on Fri Sep 28 16:56:02 2018.
     #
     
     #
     #  Kernel + memory size
     #
     kernel  	= '/boot/vmlinuz-4.14.0-3-amd64'
     extra   	= 'elevator=noop'
     ramdisk 	= '/boot/initrd.img-4.14.0-3-amd64'
     
     vcpus   	= '1'
     memory  	= '256'
     
     #
     #  Disk device(s).
     #
     root    	= '/dev/xvda2 ro'
     disk    	= [
                   	'file:/usr/local/xen/domains/coreff/disk.img,xvda2,w',
                   	'file:/usr/local/xen/domains/coreff/swap.img,xvda1,w',
               	]
     
     #
     #  Physical volumes
     #
     
     
     #
     #  Hostname
     #
     name    	= 'coreff'
     
     #
     #  Networking
     #
     dhcp    	= 'dhcp'
     vif     	= [ 'mac=00:16:3E:8B:FC:65' ]
     vif     	= [ 'mac=00:16:3E:8B:FC:65, bridge=StudentsInfo ' ]
     
     #
     #  Behaviour
     #
     on_poweroff = 'destroy'
     on_reboot   = 'restart'
     on_crash	= 'restart'

Puis xl create coreff.cfg pour parser la configuration de la VM. Et xl console coreff dans un autre terminal pour lancer la machine virtuelle.

On a modifié le mot de passe root de la VM : glopglop!

Montage du /var et du /home dans cordouan

En SSH sur cordouan, on a créé les volumes logiques de 10Go correspondant à ces deux répertoires:

     lvcreate -L10G -n apIMA5-coreff-home virtual
     lvcreate -L10G -n apIMA5-coreff-var virtual

Nous avons ensuite créé le système de fichier sur ces volumes :

     mke2fs /dev/virtual/apIMA5-coreff-home
     mke2fs /dev/virtual/apIMA5-coreff-var

Et modifier une nouvelle fois le fichier de configuration de notre machine virtuelle afin de lui indiquer que les répertoires correspondent à des points de montages physique:

     /etc/xen/coreff.cfg
     [...]
     #
     #  Disk device(s).
     #
     root    	= '/dev/xvda2 ro'
     disk    	= [
                   	'file:/usr/local/xen/domains/coreff/disk.img,xvda2,w',
                   	'file:/usr/local/xen/domains/coreff/swap.img,xvda1,w',               
                        'phy:/dev/virtual/apIMA5-coreff-home,xvdb1,w',
                        'phy:/dev/virtual/apIMA5-coreff-var,xvdb2,w',
                  ]
     [...]

On vérifie sur Coreff que tout à fonctionner :

     root@coreff:~# fdisk -l
     Disk /dev/xvda2: 4 GiB, 4294967296 bytes, 8388608 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     
     Disk /dev/xvda1: 512 MiB, 536870912 bytes, 1048576 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     
     Disk /dev/xvdb1: 10 GiB, 10737418240 bytes, 20971520 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     
     Disk /dev/xvdb2: 10 GiB, 10737418240 bytes, 20971520 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes

Les volumes ont bien été créés ! ♥

On modifie le fstab de la VM pour indiquer au système d'exploitation que ces volumes sont à monter automatiquement au démarrage:

     # /etc/fstab: static file system information.
     #
     # <file system> 	<mount point>	<type>		<options>				<dump>		<pass>
     proc        	/proc		proc		defaults				0		0
     devpts		/dev/pts	devpts		rw,noexec,nosuid,gid=5,mode=620		0		0
     /dev/xvda1		none		swap		sw					0		0
     /dev/xvda2		/		ext4		noatime,nodiratime,errors=remount-ro	0		1
     /dev/xvdb1		/home		ext4		defaults				0		2
     /dev/xvdb2		/var		ext4		defaults				0		2

Petite vérification : On a bien un /home vide (mis à part le lost+found)

     root@coreff:~# ls /home
     	lost+found

Notre répertoire /var n'étant pas vide, on ne peut pas procéder de la même maniere. Commençonc par monter le xvdb2 dans le répertoire de montage temporaire /mnt:

     root@coreff:~# mount /dev/xvdb2 /mnt

On déplace ensuite tout les fichiers du /var dans le /mnt

!! ATTENTION !! Cette opération est très critique car à ce moment là, le système n'a plus de /var
     root@coreff:~# mv /var/* /mnt

On démonte ensuite le /mnt, puis on remonte le tout :

     root@coreff:~# umount /mnt
     root@coreff:~# mount -a

On vérifie que toutes ces opération se sont bien passées :

     root@coreff:~# df
     Filesystem		1K-blocks	Used	Available	Use%	Mounted on
     udev		75004		0 	75004		0%	/dev
     tmpfs          	23824		76 	23748		1%	/run
     /dev/xvda2   	4062912		459920	3376896		12%	/
     tmpfs           	5120		0  	5120		0%	/run/lock
     tmpfs         	152500  	0	152500		0%	/run/shm
     /dev/xvdb1  	10321208	23028   9773892		1%	/home
     /dev/xvdb2  	10321208	71076   9725844		1%	/var

Tout est OK, passons à l'installation des paquetages.

Installation de Docker et création des containers

Pour faciliter l'installation des différents paquetages, il nous est proposé d'utiliser l'outil Docker. Docker est un outil permettant la création de containers contenant des services que nous pourrons moduler facilement en choisissant de démarrer ou non ces containers. Passons à l'installation :

Installation de Docker-Engine
Docker.png
Prérequis 
Pour l'installation de Docker-Engine il nous faut premièrement installer les paquets apt-transport-https et dirmngr
     apt-get install apt-transport-https dirmngr

Il nous faut ensuite rejouter le miroir pour pouvoir télécharger Docker-Engine :

     echo 'deb https://apt.dockerproject.org/repo debian-stretch main' >> /etc/apt/sources.list
Gestion des trousseaux de clés 
Lorsque l'on ajoute des dépots ppa à notre distribution et pour éviter l'erreur <<GPG "NO_PUBKEY">> il faut passer par la commande apt-key. apt-key gère les clés dont se sert apt pour authentifier les paquets. Les paquets authentifiés par ces clés seront réputés fiables.
Cependant, le port HKP (11371/tcp) est filtré par un pare-feu, il faut donc passer en http:
     apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys F76221572C52609D
     
     Executing: /tmp/apt-key-gpghome.t2eVBZUjfM/gpg.1.sh --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys F76221572C52609D
     gpg: key F76221572C52609D: public key "Docker Release Tool (releasedocker) 
     <docker@docker.com>" imported
     gpg: Total number processed: 1
     gpg:               imported: 1

Faisons une mise à jour : apt-get update

Installation de Docker-Engine 
Après avoir installé Docker-Engine (apt-get install docker-engine) il nous faut renseigner le proxy de Polytech' dans docker : dans le fichier /etc/default/docker on a rajouter
     export http_proxy="http://proxy.polytech-lille.fr:3128/"

On redémarre le service et le tour est joué : service docker restart

Installation des containers

Premièrement nous avons essayé de créer les containers "à la main" mais cette méthode est lourde et chronophage. Nous avons donc opté pour le téléchargement de containers sur la plateforme open-source de Docker. Ces containers sont stables et largement utilisés au travers du monde. (https://hub.docker.com/)

httpd

httpd est le programme du serveur HTTP d'Apache. Il a été conçu pour fonctionner sous forme de processus démon indépendant. Lorsqu'il est utilisé ainsi, il va créer un jeu de processus enfants ou de threads qui traiteront les requêtes.

Téléchargement
     docker pull httpd
Vérification
     root@coreff:/# docker images
     REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
     httpd               latest              dabb52744997        9 days ago          178MB
Lancement du container
     docker run -d --name=apache -v /root/httpd/index.html:/usr/local/apache2/htdocs/index.html \
     -v /root/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf -p 80:80 httpd
Nous lançons le container httpd avec les options suivantes :
-d Afin de lancer le container en mode détaché
-i Afin de garder l'entrée standart STDIN ouverte même si le container est en mode détache
-t Afin d'allouer un pseudo-tty
--name apache Afin d'attribuer un nom à ce container. Ceci rend la tâche plus simple quand il s'agit d'appeler le container plutôt que l'utiliser son UUID qui se matérialise sous la forme d'une clé en SHA-256
-v Afin de lier un point de montage. Ici nous lions $PWD qui correspond à notre répertoire /root/ au répertoire /usr/local/apache2/htdocs/ du container. Ceci nous permet de créer et modifier notre page web à la racine de notre répertoire /root et que les modifications se fassent directement dans le container, il en est de même pour le fichier de config httpd.conf.
bind9

bind est un logiciel open source qui permet de publier nos informations DNS (Domain Name System) sur Internet et de résoudre les requêtes DNS des utilisateurs. Le nom BIND signifie «Berkeley Internet Name Domain». Le service DNS (Domain Name System) est un service TCP/IP permettant la correspondance entre un nom de domaine qualifié (FQDN : Fully Qualified Domain Name) et une adresse IP.

Téléchargement
     docker pull ventz/bind
Vérification
     root@coreff:~# docker images
     REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
     httpd               latest              dabb52744997        10 days ago         178MB
     ventz/bind          latest              c54ade396204        4 weeks ago         11.7MB

Nous avons créé les fichiers de configuration suivant:

/etc/bind/named.conf.options
     root@coreff:~/Bind# cat named.conf.options
     options {
         directory "/var/cache/bind";
     
         // If there is a firewall between you and nameservers you want
         // to talk to, you may need to fix the firewall to allow multiple
         // ports to talk.  See http://www.kb.cert.org/vuls/id/800113
     
         // If your ISP provided one or more IP addresses for stable
         // nameservers, you probably want to use them as forwarders.  
         // Uncomment the following block, and insert the addresses replacing
         // the all-0's placeholder.
     
         // forwarders {
         //     0.0.0.0;
         // };
     
         //========================================================================
         // If BIND logs error messages about the root key being expired,
         // you will need to update your keys.  See https://www.isc.org/bind-keys
         //========================================================================
         dnssec-validation auto;
     
         auth-nxdomain no;    # conform to RFC1035
         listen-on-v6 { any; };
         allow-transfer { "allowed_to_transfer"; };
     };
     
     acl "allowed_to_transfer" {
         217.70.177.40/32;
     };
/etc/bind/named.conf.local
C'est dans ce ficher que se trouvent nos déclarations de zones DNS. Il faut ajouter une zone par site internet que nous hégergeons.
     root@coreff:~/Bind# cat named.conf.local
     //
     // Do any local configuration here
     //
     
     // Consider adding the 1918 zone here, if they are not used in your
     // organization
     // include "/etc/bind/zones.rfc1918";
     
     zone "coreff.space" {
         type master;
         file "/etc/bind/coreff.space";
     };
/etc/bind/coreff.space
     root@coreff:~/Bind# cat coreff.space
     $TTL 259200
     
     @ IN SOA dns.coreff.space. admin.coreff.space. (
         10    ; Version
         7200    ; Refresh (2h)
         3600    ; Retry (1h)
         1209600    ; Expire (14j)
         259200    ; Minimum TTL (3j)
      IN NS dns.coreff.space.
      IN NS ns6.gandi.net.
      IN MX 100 dns.coreff.space.
      IN A     193.48.57.161
     
     www    IN A    193.48.57.161
            IN MX    100 dns.coreff.space.
     dns    IN A    193.48.57.161
Explications
IN Signifie internet, c’est à dire que la zone après le IN est destinée à internet
SOA Signifie Star Of Authority, indiquant le serveur de nom faisant autorité c’est à dire votre DNS principal.
dns.coreff.space. est le DNS principal de notre domaine
admin.coreff.space. est une adresse email (non-valide ici mais il n'y a pas d'utilité spéciale)
IN NS est utilisé pour définir quels serveurs répondent pour cette zone.
IN MX est utilisé pour définir vers quel serveur de la zone un email à destination du domaine doit être envoyé, et avec quelle priorité.
IN A est utilisé pour faire correspondre une adresse IP a une machine
193.48.57.161 est l'adresse IP de notre machine virtuelle coreff
Problème rencontré
Il était impossible de lancer des commandes dans le container avec la commande docker exec. Il nous a fallu du temps pour comprendre que le container executait juste une configuration et se fermait automatiquement après. Pour palier à ce problème, nous avons fait comme pour http, c'est à dire lier les montages des fichiers de configuration ci-dessus.
Lancement du container
     docker run --name=dns -dit --dns=8.8.8.8 --dns=8.8.4.4 -p 53:53/udp -p 53:53 \
     -v "$PWD"/Bind/named.conf.local:/etc/bind/named.conf.local \
     -v "$PWD"/Bind/named.conf.options:/etc/bind/named.conf.options \
     -v "$PWD"/Bind/coreff.space:/etc/bind/coreff.space

Architecture réseau

Services internet

Achat et configuration du nom de domaine sur GANDI

Achat

Nous devons réaliser un site web sécurisé. Pour commencer nous avons donc acheter un nom de domaine via le registrar GANDI. Notre nom de domaine est donc coreff.space

Configuration

Pour commencer nous avons dû ajouter un "glue record" qui est un enregistrement collé (pas très français) et permet d'associer un nom d'hôte avec une adresse IP au registre.

Glue reccord.png

Une fois cela fait, nous avons pû configurer les serveurs ne noms sur GANDI: Nous avions 3 DNS proposé par défaut, on les a donc décalés et mit en 1ere position notre dns : dns.coreff.space

ModifDNS.png

Tests d'intrusion