TP sysres IMA2a5 2018/2019 G3 : Différence entre versions

De Wiki d'activités IMA
(Configuration des ports)
(Modifications sur Gandi)
 
(43 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 30 : Ligne 30 :
 
==== Configuration ====
 
==== 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.
 
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 =====
 
===== Configuration des ports =====
  
   enbale                                                 // Passage en administrateur
+
   enable                                                 // Passage en administrateur
 
   
 
   
 
   configure terminal
 
   configure terminal
Ligne 66 : Ligne 80 :
 
         rewrite ingress tag pop 1 symmetric
 
         rewrite ingress tag pop 1 symmetric
 
         bridge-domain 6
 
         bridge-domain 6
   
+
 +
      service instance 42 ethernet
 +
        encapsulation dot1q 42
 +
        rewrite ingress tag pop 1 symmetric
 +
        bridge-domain 42
 +
   
 
     service instance 130 ethernet
 
     service instance 130 ethernet
 
         encapsulation dot1q 130
 
         encapsulation dot1q 130
Ligne 108 : Ligne 127 :
 
         rewrite ingress tag pop 1 symmetric
 
         rewrite ingress tag pop 1 symmetric
 
         bridge-domain 6
 
         bridge-domain 6
 
+
 +
      service instance 42 ethernet
 +
        encapsulation dot1q 42
 +
        rewrite ingress tag pop 1 symmetric
 +
        bridge-domain 42
 +
 
     service instance 130 ethernet
 
     service instance 130 ethernet
 
         encapsulation dot1q 130
 
         encapsulation dot1q 130
 
         rewrite ingress tag pop 1 symmetric
 
         rewrite ingress tag pop 1 symmetric
 
         bridge-domain 130
 
         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 <code>fdisk -l</code> 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 <code>df</code>.
 +
 +
== 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.
 +
 +
==== 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'''.
 +
 +
[[Fichier:kmlb_achat.png]]
 +
 +
===== Configuration =====
 +
Sur Gandi, il faut remplir le '''Glue Recors''' afin d’associer notre nom de domaine à l'IP (routée) de notre VM.
 +
[[Fichier:kmlb_glureccord.png]]
 +
 +
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 :
 +
[[Fichier:kmlb_dns.png]]
 +
 +
==== Configuration du Docker ====
 +
 +
=== HTTPS ===
 +
==== Modifications sur Gandi ====
 +
 +
Une fois notre site fonctionnel, nous l'avons sécurisé (passage en HTTPS). Pour cela, il a fallu configurer le docker (partie suivante) mais aussi récupérer les certificats sur gandi.net.
 +
 +
Pour cela, nous sommes allé dans l'onglet certifiats SSL et avons cliqué sur acheter.
 +
[[Fichier:kmlb_ssl.png]]
 +
 +
Il faut alors selectionner :
 +
* Installer ailleurs
 +
* Choisir un certificat standard
 +
* Coller le CSR créé précédemment sur notre docker
 +
* Valider (normalement l'opération est gratuite)
 +
 +
Après cette demande, il faut attendre que tout soit validé. Après validation, on accède à cette page :
 +
 +
[[Fichier:kmlb_certificat.png]]
 +
 +
Sur cette page, il est possible de télécharger les fichiers nécessaires à la sécurisation du site. Attention il faut bien télécharger les 2 fichiers pour que tout fonctionne.
 +
 +
==== Docker ====
 +
Pour l'utilisation du protocol HTTPS, nous avons configuré Docker httpd avec les fichiers de configuration suivant:
 +
 +
Dans httpd.conf il  faut décommenter les lignes suivantes:
 +
 +
LoadModule ssl_module modules/mod_ssl.so
 +
 +
et:
 +
 +
Include conf/extra/httpd-ssl.conf
 +
 +
Fichier https-ssl.conf:
 +
Listen 443
 +
<VirtualHost _default_:443>
 +
#  General setup for the virtual host
 +
DocumentRoot "/usr/local/apache2/htdocs"
 +
ServerName rince-cochon.pw:443
 +
ServerAdmin kmadoret@polytech-lille.net
 +
   
 +
#  SSL Engine Switch:
 +
SSLEngine on
 +
   
 +
#  Server Certificate:
 +
SSLCertificateFile "/etc/ssl/certs/rince-cochon.pw.crt"
 +
   
 +
#  Server Private Key:
 +
SSLCertificateKeyFile "/etc/ssl/private/rince-cochon.key"
 +
 +
        SSLCertificateChainFile "/etc/ssl/certs/GandiStandardSSLCA2.pem"
 +
</VirtualHost>
 +
 +
 +
Dans votre repertoire pour le docker httpd vous devez donc avoir:
 +
3CE93B161541A0601DB846EEF1C8D0CA.txt
 +
GandiStandardSSLCA2.pem
 +
httpd-ssl.conf
 +
httpd.conf
 +
index.html
 +
rince-cochon.csr
 +
rince-cochon.key
 +
rince-cochon.pw.crt
 +
 +
Où rince-cochon.csr, rince-cochon.key, rince-cochon.pw.crt, 3CE93B161541A0601DB846EEF1C8D0CA.txt et GandiStandardSSLCA2.pem sont utilisés pour les certificats SSL pour Gandi.
 +
La commande suivante permet de générer le fichier .csr:
 +
openssl req -nodes -newkey rsa:2048 -sha256 -keyoutrince-cochon.key -out rince-cochon.csr
 +
 +
Pour lancer le docker:
 +
docker run -d --name=httpd \
 +
v /root/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf \
 +
v /root/httpd/httpd-ssl.conf:/usr/local/apache2/conf/extra/httpd-ssl.conf \
 +
v /root/httpd/index.html:/usr/local/apache2/htdocs/index.html \
 +
v /root/httpd/rince-cochon.csr:/usr/local/apache2/conf/rince-cochon.csr \
 +
v /root/httpd/rince-cochon.key:/usr/local/apache2/conf/rince-cochon.key \
 +
v /root/httpd/GandiStandardSSLCA2.pem:/etc/ssl/certs/GandiStandardSSLCA2.pem \
 +
v /root/httpd/rince-cochon.pw.crt:/etc/ssl/certs/rince-cochon.pw.crt \
 +
v /root/httpd/rince-cochon.key:/etc/ssl/private/rince-cochon.key \
 +
v /root/httpd/3CE93B161541A0601DB846EEF1C8D0CA.txt:/usr/local/apache2/htdocs/.well-known/pki-validation/3CE93B161541A0601DB846EEF1C8D0CA.txt \
 +
p 443:443 \
 +
p 80:80 \
 +
httpd
 +
 +
=== Bind ===
 +
Pour l'installation de Bind, plusieurs fichiers de configuration ont été nécessaires:
 +
 +
Le fichier named.conf.options:
 +
    options {
 +
        directory "/var/cache/bind";
 +
        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;
 +
    };
 +
 +
Le fichier named.conf.local:
 +
 +
    // Consider adding the 1918 zone here, if they are not used in your
 +
    // organization
 +
    // include "/etc/bind/zones.rfc1918";
 +
   
 +
    zone "rince-cochon.pw" {
 +
        type master;
 +
        file "/etc/bind/rince-cochon.pw";
 +
    };
 +
 +
Le fichier rince-cochon.pw:
 +
 +
    $TTL 259200
 +
   
 +
    @ IN SOA dns.rince-cochon.pw. admin.rince-cochon.pw. (
 +
        10    ; Version
 +
        7200    ; Refresh (2h)
 +
        3600    ; Retry (1h)
 +
        1209600    ; Expire (14j)
 +
        259200    ; Minimum TTL (3j)
 +
    IN NS dns.rince-cochon.pw.
 +
    IN NS ns6.gandi.net.
 +
    IN MX 100 rince-cochon.pw.
 +
    IN A    193.48.57.163
 +
   
 +
    www    IN A    193.48.57.163
 +
          IN MX  100 rince-cochon.pw.
 +
    dns    IN A    193.48.57.163
 +
 +
 +
 +
Puis on lance le docker via la commande:
 +
 +
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/rince-cochon.pw:/etc/bind/rince-cochon.pw ventz/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"

Version actuelle datée du 9 décembre 2018 à 17:45

Projet de Killian et Lucas

Equipement réseau choisis : Routeur

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 :

  1. ttyACM0
  2. 9600 bauds
  3. 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.

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.

Kmlb achat.png

Configuration

Sur Gandi, il faut remplir le Glue Recors afin d’associer notre nom de domaine à l'IP (routée) de notre VM. Kmlb glureccord.png

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 : Kmlb dns.png

Configuration du Docker

HTTPS

Modifications sur Gandi

Une fois notre site fonctionnel, nous l'avons sécurisé (passage en HTTPS). Pour cela, il a fallu configurer le docker (partie suivante) mais aussi récupérer les certificats sur gandi.net.

Pour cela, nous sommes allé dans l'onglet certifiats SSL et avons cliqué sur acheter. Kmlb ssl.png

Il faut alors selectionner :

  • Installer ailleurs
  • Choisir un certificat standard
  • Coller le CSR créé précédemment sur notre docker
  • Valider (normalement l'opération est gratuite)

Après cette demande, il faut attendre que tout soit validé. Après validation, on accède à cette page :

Kmlb certificat.png

Sur cette page, il est possible de télécharger les fichiers nécessaires à la sécurisation du site. Attention il faut bien télécharger les 2 fichiers pour que tout fonctionne.

Docker

Pour l'utilisation du protocol HTTPS, nous avons configuré Docker httpd avec les fichiers de configuration suivant:

Dans httpd.conf il faut décommenter les lignes suivantes:

LoadModule ssl_module modules/mod_ssl.so

et:

Include conf/extra/httpd-ssl.conf

Fichier https-ssl.conf:

Listen 443
<VirtualHost _default_:443>
	#   General setup for the virtual host
	DocumentRoot "/usr/local/apache2/htdocs"
	ServerName rince-cochon.pw:443
	ServerAdmin kmadoret@polytech-lille.net
	    
	#   SSL Engine Switch:
	SSLEngine on
	    
	#   Server Certificate:
	SSLCertificateFile "/etc/ssl/certs/rince-cochon.pw.crt"
	    
	#   Server Private Key:
	SSLCertificateKeyFile "/etc/ssl/private/rince-cochon.key"

        SSLCertificateChainFile "/etc/ssl/certs/GandiStandardSSLCA2.pem"
</VirtualHost>


Dans votre repertoire pour le docker httpd vous devez donc avoir:

3CE93B161541A0601DB846EEF1C8D0CA.txt
GandiStandardSSLCA2.pem
httpd-ssl.conf
httpd.conf
index.html
rince-cochon.csr
rince-cochon.key
rince-cochon.pw.crt

Où rince-cochon.csr, rince-cochon.key, rince-cochon.pw.crt, 3CE93B161541A0601DB846EEF1C8D0CA.txt et GandiStandardSSLCA2.pem sont utilisés pour les certificats SSL pour Gandi. La commande suivante permet de générer le fichier .csr:

openssl req -nodes -newkey rsa:2048 -sha256 -keyoutrince-cochon.key -out rince-cochon.csr

Pour lancer le docker:

docker run -d --name=httpd \
v /root/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf \
v /root/httpd/httpd-ssl.conf:/usr/local/apache2/conf/extra/httpd-ssl.conf \
v /root/httpd/index.html:/usr/local/apache2/htdocs/index.html \
v /root/httpd/rince-cochon.csr:/usr/local/apache2/conf/rince-cochon.csr \
v /root/httpd/rince-cochon.key:/usr/local/apache2/conf/rince-cochon.key \
v /root/httpd/GandiStandardSSLCA2.pem:/etc/ssl/certs/GandiStandardSSLCA2.pem \
v /root/httpd/rince-cochon.pw.crt:/etc/ssl/certs/rince-cochon.pw.crt \
v /root/httpd/rince-cochon.key:/etc/ssl/private/rince-cochon.key \
v /root/httpd/3CE93B161541A0601DB846EEF1C8D0CA.txt:/usr/local/apache2/htdocs/.well-known/pki-validation/3CE93B161541A0601DB846EEF1C8D0CA.txt \
p 443:443 \
p 80:80 \
httpd

Bind

Pour l'installation de Bind, plusieurs fichiers de configuration ont été nécessaires:

Le fichier named.conf.options:

   options {
       directory "/var/cache/bind";
       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;
   };

Le fichier named.conf.local:

   // Consider adding the 1918 zone here, if they are not used in your
   // organization
   // include "/etc/bind/zones.rfc1918";
   
   zone "rince-cochon.pw" {
       type master;
       file "/etc/bind/rince-cochon.pw";
   };

Le fichier rince-cochon.pw:

   $TTL 259200
   
   @ IN SOA dns.rince-cochon.pw. admin.rince-cochon.pw. (
       10    ; Version
       7200    ; Refresh (2h)
       3600    ; Retry (1h)
       1209600    ; Expire (14j)
       259200    ; Minimum TTL (3j)
    IN NS dns.rince-cochon.pw.
    IN NS ns6.gandi.net.
    IN MX 100 rince-cochon.pw.
    IN A     193.48.57.163
   
   www    IN A    193.48.57.163
          IN MX   100 rince-cochon.pw.
   dns    IN A    193.48.57.163


Puis on lance le docker via la commande:

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/rince-cochon.pw:/etc/bind/rince-cochon.pw ventz/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"