TP sysres IMA5sc 2019/2020 G5

De Wiki d'activités IMA

Création des VMs

Nous avons commandés les noms de domaines sur le site gandi.net.

Tout d'abord, nous avons réserver le nom de domaine via gandi.net: chaudepisse.site.

Installation

Tout d’abord nous allons créer une machine virtuelle sur cordouan grâce à l’hyperviseur Xen.

On se connecte d'abord en SSH à Cordouan, puis on spécifie le proxy pour pouvoir ensuite récupérer les packages. On peut alors créer l'image de la machine en spécifiant --dhcp car on ne connaît pas encore l’adresse IP.

Tout d'abord, il faut se connecter en SSH sur le serveur cordouan.insecserv.deule.net avec l'utilisateur root et le mot de passe habituel.

 ssh root@cordouan.insecserv.deule.net	

Ensuite, nous avons installés les VM xen. Pour se faire, il suffit de spécifier les proxys de polytech.

export http_proxy=http://proxy.polytech-lille.fr/	
export https_proxy=https://proxy.polytech-lille.fr/

Et lancer la commande d'installation des VM xen.

 xen-create-image --hostname=chaudepisse --dhcp --dir=/usr/local/xen/ --force

Le fichier config généré se trouve à l'emplacement /etc/xen/chaudepisse.cfg


#
# Configuration file for the Xen instance chaudepisse, created
# by xen-tools 4.7 on Mon Nov 18 17:05:05 2019.
#

#
#  Kernel + memory size
#
kernel      = '/boot/vmlinuz-4.9.0-6-amd64'
extra       = 'elevator=noop'
ramdisk     = '/boot/initrd.img-4.9.0-6-amd64'

vcpus       = '1'
memory      = '256'


#
#  Disk device(s).
#
root        = '/dev/xvda2 ro'
disk        = [
                  'file:/usr/local/xen//domains/chaudepisse/disk.img,xvda2,w',
                  'file:/usr/local/xen//domains/chaudepisse/swap.img,xvda1,w',
                  'phy:/dev/virtual/ima5_chaudepisse_home,xvdb1,w',
                  'phy:/dev/virtual/ima5_chaudepisse_var,xvdb2,w',
                  'phy:/dev/virtual/ima5_chaudepisse_disk1,xvdb3,w',
                  'phy:/dev/virtual/ima5_chaudepisse_disk2,xvdb4,w',
                  'phy:/dev/virtual/ima5_chaudepisse_disk3,xvdb5,w',
               ]


#
#  Physical volumes
#


#
#  Hostname
#
name        = 'chaudepisse'

#
#  Networking
#
dhcp        = 'dhcp'
vif         = [ 'mac=00:16:3E:FE:21:79, bridge=IMA5sc', 'mac=00:16:3E:FE:21:8F,  bridge=IMA5sc_priv' ]

#
#  Behaviour
#
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'


On a créé le bridge IMA5sc_priv afin d'avoir un réseau isolé pour les VMs (192.168.0.x)

Les fichiers de configurations /etc/network/interfaces :

Pour la publique :

auto eth1
iface eth1 inet static
 address 192.168.0.15 
 netmask 255.255.255.0

Pour la private :

auto eth0
iface eth0 inet static
 gateway 192.168.0.15
 address 192.168.0.5/24


On oublie pas de réaliser la masquerade pour laisser les packets transiter vers la private

iptables -P FORWARD DROP
iptables -A FORWARD -j ACCEPT -s 192.168.0.0/24
iptables -A FORWARD -j ACCEPT -d 192.168.0.0/24
iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.0.0/24
echo 1 > /proc/sys/net/ipv4/ip_forward

Cette mascarade étant temporaire, il faut la sauvegarder à l'aide du paquet iptables-persistent

apt install iptables-persistent


Ansible

On utilisera la technologie Ansible afin de déployer nos machines.

Tout d'abord, on modifie le fichier /etc/ansible/hosts

---
all:
  hosts:
    moa:
      ansible_host: 192.168.0.5
  children:
    webservs:
      hosts:
        192.168.0.1:
        192.168.0.2:
        192.168.0.3:
        192.168.0.4:
        192.168.0.6:

On effectuera nos tests sur notre vm private (moa)

Ensuite, j'utiliserais des roles Ansibles que je stockerais dans le dossier /etc/ansible/roles/

J'utilisais un simple playbook qui appelle des roles

---
- hosts: all
  roles:
    - deploy_docker
  vars:
    docker_apt_repository: "deb [arch=Modèle:Docker apt arch] https://download.docker.com/linux/debian stretch stable"

Attention, la variable est nécessaire suite a un bug rencontré au niveau de l'achitecture de la VM private. Celle ci n'est nécessaire que pour le role geerlingguy.docker.

Le role geerlingguy.docker doit être exécuté avant le role deploy docker afin d'être sur que docker est bien installé sur la VM.

Role Maison

Permet de configurer les vms (par l'installation de tous les paquets nécessaires)

tasks :

- name: Copy motd
  copy:
    dest: /etc/motd
    src: motd

- name: install ntp
  apt:
    state: present
    name:
      - ntp
      - ntpdate

- name: Copy over the NTP configuration
  copy: src=ntp.conf dest=/etc/ntp.conf
  tags: ntp 

- name: Stop ntp
  service: name=ntp state=stopped enabled=yes
  tags: ntpd

- name: Sync time initialy
  shell: ntpdate ntp.polytech-lille.fr
  tags: ntp 
- name: Make sure NTP is started up
  service: name=ntp state=started enabled=yes
  tags: ntp

Les fichiers:

motd : (Permet de modifier le message d’accueil du terminal)

The programs included with the Devuan GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Devuan GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

HELLO LES CHAUDEPISSEUX /!\ sortez couverts !

et ntp.conf: (permet de configurer le ntp (pour qu'il synchronise l'heure du système))

server ntp.polytech-lille.fr

Role deploy_docker

Permet, comme son nom l'indique, de déployer le container docker sur une VM.

Le fichier task :

---
# tasks file for deploy_docker
- name: install rsync and python-pip
  apt:
    state: present
    name:
      - rsync
      - python-pip

- name: install docker-py
  shell: pip install docker

- name: upload the site directory to the docker host
  synchronize: src=chaudepisse dest=/tmp/site/
  register: sync_result

- name: Stop a container
  docker_container:
    name: chaudepisse_container
    state: stopped
    image: chaudepisse_image
  when: sync_result.changed

- name: delete container
  docker_container:
    name: chaudepisse_container
    state: absent
    image: chaudepisse_image
  when: sync_result.changed
  ignore_errors: yes

- name: delete the image
  docker_image: >
    name=chaudepisse_image
    tag=latest
    path=/tmp/site/chaudepisse
    state=absent
    force=yes
  when: sync_result.changed 

- name: build the image
  docker_image: >
    name=chaudepisse_image
    tag=latest
    path=/tmp/site/chaudepisse
    state=present

- name: create container
  docker_container:
    name: chaudepisse_container
    state: present
    image: chaudepisse_image

- name: Start container, connect to network and link
  docker_container:
    name: chaudepisse_container
    image: chaudepisse_image
    state: started
    recreate: yes
    ports:
     - "8005:80"


Après coup, il est possible de simplifier ce script de déploiement, mais celui-ci est 100% fonctionnel.

Pour que celui ci fonctionne il faut les fichiers:

- files /chaudepisse/Dockerfile :

FROM centos:latest
MAINTAINER chaudepisse
RUN yum -y install httpd
COPY index.html /var/www/html/
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80

- files /chaudepisse/index.html :

<!DOCTYPE html>
<html>
<body>
La chaude-pisse
</body>
</html>

Il est possible de simplifier le DockerFile, celui-ci ne nécessite pas de FROM centos mais aurait pu simplement utiliser from httpd. Cependant, il est plus facile de débugger avec une distribution centos qu'une image réduite fournie par apache.

Configuration du serveur DNS/DNSSEC

On installe les paquets suivants

apt install bind9 bind9-host dnsutils

Puis, on créé un fichier de configuration à l'emplacement /etc/bind/chaudepisse.site


;
; BIND data file for local loopback interface
;
$TTL 604800
@       IN      SOA     ns.chaudepisse.site. root.chaudepisse.site (
                        4       ; Serial
                        604800  ; Refresh
                        86400   ; Retry
                        2419200 ; Expire
                        604800 )        ; Negative Cache TTL
        IN      NS      ns.chaudepisse.site.
        IN      NS      ns6.gandi.net.
@       IN      A       193.48.57.181
ns      IN      A       193.48.57.181
www     IN      A       193.48.57.181

On ajoute ensuite la configuration de note zone dans le fichier /etc/bind/named.conf.local

zone "chaudepisse.site" {
        type master;
        file "/etc/bind/chaudepisse.site.signed";
        allow-transfer {217.70.177.40;}; //dns Gandi
};

Puis, on redémarre le service bind9

Le fichier /etc/bind/chaudepisse.site.signed a été généré à partir de clés ZSK et KSK privées et publiques. (Pour que notre DNS soit un DNSSEC)

KSK :

dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE chaudepisse.site

ZSK :

dnssec-keygen -a RSASHA1 -b 1024 -n ZONE chaudepisse.site

On inclue ces fichiers dans le fichier de zone chaudepisse.site

$include /etc/bind/chaudepisse.site-dnssec/chaudepisse.site-ksk.key
$include /etc/bind/chaudepisse.site-dnssec/chaudepisse.site-zsk.key

On signe le fichier de zone avec la commande dnssec-signzone

On effectue ensuite un restart du service bind9 afin de prendre en compte les changements

On oublie pas d'ajouter le DNS fraichement créé au Glue Records de Gandi.


Serveurs Apache

VM publique

Sur cette VM, le serveur apache doit prendre en charge les requetes HTTP et HTTPS (certificat Gandi).

Elle doit également utiliser un équilibreur de charge qui réparti la charge sur toutes les VM privates.

Il faut activer les mods suivant (apache2)

a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

Puis on modifie le fichier chaudepisse.conf

<VirtualHost 193.48.57.181:443>
                 ServerName www.chaudepisse.site
                 ServerAlias chaudepisse.site
                 DocumentRoot /var/www/html/
                 SSLEngine on
                 SSLCertificateFile /etc/ssl/certs/www.chaudepisse.site.crt
                 SSLCertificateKeyFile /etc/ssl/key/myserver.key
                 SSLCertificateChainFile /etc/ssl/certs/GandiSSLCert
                 SSLVerifyclient NONE
         <Location "/balancer-manager">
                 SetHandler balancer-manager
         </Location>
 </VirtualHost>

 <VirtualHost 193.48.57.181:80>
         ServerName www.chaudepisse.site
         ServerAlias chaudepisse.site
         Redirect / https://www.chaudepisse.site/
         ProxyPass "/" "balancer://chaudepissebalancer/"
         ProxyPassReverse "/" "balancer://chaudepissebalancer"
 </VirtualHost>
ProxyPass /balancer-manager !
 <Proxy "balancer://chaudepissebalancer">
         BalancerMember http://192.168.0.1:8005
         BalancerMember http://192.168.0.2:8005
         BalancerMember http://192.168.0.3:8005
         BalancerMember http://192.168.0.4:8005
         BalancerMember http://192.168.0.5:8005
         BalancerMember http://192.168.0.6:8005
         ProxySet lbmethod=byrequests
 </Proxy>


Il faut bien évidement placer les fichiers aux bons emplacements !

/etc/ssl/certs/www.chaudepisse.site.crt
/etc/ssl/key/myserver.key
/etc/ssl/certs/GandiSSLCert

Le port 443 est utilisé lors de la connexion en https.

Il ne faut pas oublier d'activer la conf du site.

Puis on effectue un reload :

service apache2 reload

On peut acceder au site en http ou https.

Le http pointera vers une de nos VM privés (à l'aide de l'équilibreur de charge)

Le https pointera vers le site interne de la VM publique (et l'équilibreur de charge).

Nous pouvons donc vérifier que cet équilibreur de charge fonctionne convenablement.

Load balancer chaudepisse.png

VM private

Sur ces VM, un simple serveur apache httpd suffit, il permet de créé un basique site web facilement. Les VM privates seront déployés via docker.

La page principale du site sera au chemin /var/www/html/index.html

Configuration du serveur Freeradius

La configuration de ce serveur permet l'authentification eap sur la borne wifi (avec id et mdp).

Pour cela, il faut installer Freeradius

apt-get install freeradius

Ensuite, il suffit de le configurer de la bonne manière.

client 10.60.200.5/24 {
 secret = secretIMA5SC
 shortname = borneChaudepisse1
}

# IPv6 Client
client localhost_ipv6 {
        ipv6addr        = ::1
        secret          = testing123
}

# All IPv6 Site-local clients
#client sitelocal_ipv6 {
#       ipv6addr        = fe80::/16
#       secret          = testing123
#}

client PA_IMA5sc {
        ipaddr          = 10.60.201.5
        secret          = secretIMA5SC
}


Configuration de la borne wifi

Il suffit de créer un model contenant les informations nécessaires à la connexion au Freeradius.

ap(config)#aaa new-model
ap(config)#aaa authentication login eap_groupe5 group radius_group5
ap(config)#aaa group server radius radius_group5 
ap(config-sg-radius)#server 193.48.57.181 auth-port 1812 acct-port 1813
ap(config-sg-radius)#auth-port 1812 acct-port 1813 key secretIMA5SC         
ap(config)#exit

En faisant cela, on peut voir que notre serveur radius est bien enregistré

ap#show aaa servers

Puis on peut créer le réseau wifi :

ap#conf t
ap(config)#dot11 ssid Chaudepisse
ap(config-ssid)#vlan 105
ap(config-ssid)#authentication open eap eap_group5
ap(config-ssid)#authentication network-eap eap_group5
ap(config-ssid)#authentication key-management wpa
ap(config-ssid)#Mbssid Guest-mode
ap(config-ssid)#end

puis :

ap(config)#int dot11radio0
ap(config-if)#Mbssid
ap(config-if)#encryption vlan 105 mode ciphers aes-ccm tkip
ap(config-if)#ssid Chaudepisse
ap(config-if)#end

et enfin l'encapsulation

ap(config)#int dot11radio0.11
ap(config-subif)#encapsulation dot1Q 105
ap(config-subif)#end

et

ap(config)#int dot11radio0.11   
ap(config-subif)#encapsulation dot1q 105
ap(config-subif)#bridge-group 105
ap(config-subif)#end

En n'oubliant pas de démarrer l'interface :) :

ap(config)#interface Dot11Radio0
ap(config-if)#no shutdown

Intrusion

Les clés WEP et WPA ont été toutes les deux crackées. Il y a une net différence entre les deux.


Pour notre part, nous avons consacrès nos efforts sur le crackage d'une clé de type WPA-PSK. Le nom du réseau est kracotte06. Pour se faire, il suffit (après avoir passé sa carte wifi en mode monitoring) via airmon-ng.

Ensuite, il faut écouter le réseau à la rechercher d'un handshake.

airodump-ng --encrypt wpa wlan0mon

Une fois le SSID récupéré, il suffit d'utiliser la commande suivante afin d'enregistrer les paquets reçus

airodump-ng --bssid 04:DA:D2:9C:50:5D --ch 2 -w cap

Une fois les paquets reçu (Attention il faut qu'un handshake ait été reçu)

Il faut ensuite créer un dictionnaire afin d'obtenir toutes les possibilitées à tester lors de l'attaque bruteforce.

crunch 8 8 0123456789 -o dico.txt

Puis, il suffit de lancer l'algorithme de bruteforce afin de déterminer les différentes clés PSK, TSK...

aircrack-ng cap.cap -w dico.txt


Screenshot 2019-11-25 16-38-24.png

La clé à été trouvée en 42 minutes et est 20133333

Cryptage de la clé USB

Le but de cette partie est de crypter la clé USB à l'aide de l'outil cryptsetup.

L'utilisation de cet outil est décrit [[1]]

Pour afficher la liste des périphériques connectés au PC:

 fdisk -l

On formate la partition au format LUKS (crypté) une clé de cryptage sera alors demandée

 cryptsetup luksFormat -c aes-xts-plain -s 512 /dev/sdb1

Pour acceder à la partition LUKS on utilise la commande

 cryptsetup luksOpen /dev/sdb1 chaudepisse_encrypt

Puis, on formate notre volume en ext4

 mkfs -t ext4 /dev/mapper/chaudepisse_encrypt

On le monte ensuite sur /mnt

 mount -t ext4 /dev/mapper/chaudepisse_encrypt /mnt/

On y créé un fichier et on démonte la partition ext4:

 touch test
 umount /mnt

Puis on démonte la partition LUSK

 cryptsetup luksClose chaudepisse_encrypt 

Seul un montage de la partition précédé d'un cryptsetup luksOpen permettra d'afficher le fichier test

Un montage simple, sans utiliser la clé de cryptage, ne sera pas possible. Le format de partition Luks ne peut pas être monté sans luksOpen.

Configuration du réseau

Nous devons créer un réseau à haute disponibilité, pour ce faire nous disposons de deux routeurs, deux commutateurs et d'un serveur Corduan sur lequel se trouve notre MV.

Voici le réseau que nous allons mettre en place:

Schéma de base.PNG

nous allons tout d'abord effectuer des liaisons physiques pour ensuite définir tout notre réseau sur les différents éléments de ce dernier, l'organisation de ce dernier est précisé sur la page d’accueil du groupe.

Réseau physique

Nos commutateurs/routeurs 1 et 2 sont liés par des câbles de fibre pour ce faire nous avons dû repérer les câbles libres dans chaque salle grâce à un code couleur, les voici:

- Jaune/Noir (liaison commutateur 2/routeur 1)

- Rouge/Vert (liaison commutateur 1/routeur 2)

- Orange/Noir (liaison commutateur 1/XEN)

Puis nous avons listés les adaptateurs et différents de liaisons desquels nous aurons besoin pour mettre en place notre réseau:

- 4 câbles ethernet dont un long

- 5 adaptateurs fibre/ethernet

Nous avons ensuite effectué les branchements pour respecter le schéma ci-dessus.

Réseau sur les éléments

Sur le routeur 1,nous avons répété la commande suivante 8 fois afin de créer une Vlan par machine virtuelle et d'autres d'interconnexion et pour la XEN:

 enable
 conf t
   interface Gi 0/0/0
   service instance 101 ethernet
   encapsulation dot1q 101
   rewrite ingress tag pop 1 symmetric
   bridge domain 101
 exit

sur l'exemple ci-dessus qui est pour la Vlan du groupe 1, il ne faut pas spécifié l'utilisation de trunk (un port pour plusieurs Vlan) car c'est déja fait, cependant il ne faut surtout pas oublier le "symmetric" pour que la liaison fonctionne.

Sur le Commutateur 1, nous avons effectué les mêmes différemment:

 enable
 conf t
   interface vlan101
   nom_de_la_vlan
   ip adress ip_adress mask
   standby version 2
   standby 101 ip ip_adress                                                    
   standby 101 preempt
 exit