TP sysres IMA5sc 2020/2021 G7 : Différence entre versions

De Wiki d'activités IMA
(Équilibreur de charge (load balancer))
(Équilibreur de charge (load balancer))
 
(11 révisions intermédiaires par le même utilisateur non affichées)
Ligne 602 : Ligne 602 :
  
 
On met en place un conteneur qui contient notre site web et démarre apache2 sur le port 80.
 
On met en place un conteneur qui contient notre site web et démarre apache2 sur le port 80.
En premier lieu on installe <code>docker</code> sur <code>capbreton</code> avec <code>wget get.docker.com</code>
+
En premier lieu on installe <code>docker</code> sur <code>capbreton</code> avec <code>wget -qO - get.docker.com | sh</code>
  
 
'''Dockerfile'''
 
'''Dockerfile'''
Ligne 696 : Ligne 696 :
 
On met en place un second serveur Web qui se comporte comme un serveur mandataire inverse (reverse proxy) et comme un équilibreur de charge (load balancer).
 
On met en place un second serveur Web qui se comporte comme un serveur mandataire inverse (reverse proxy) et comme un équilibreur de charge (load balancer).
  
Sur <code>capbreton</code> dans <code>/etc/bind/db.girolle.site </code> on ajoute un deuxième CNAME :
+
'''Activation des module pour le mandataire inverse'''
 +
 
 +
Pour utiliser Apache2 mandataire inverse, on doit activer les modules <code>proxy</code> (permet l’implémentation d’un serveur mandataire/passerelle) et <code>proxy_http</code> (permet des requêtes HTTP et HTTPS au module proxy) :
 +
a2enmod proxy proxy_http
 +
service apache2 restart
 +
 
 +
'''Mise en place du VirtualHost'''
 +
 
 +
Dans <code>/etc/apache2/sites-available</code> on crée un nouveau fichier de configuration <code>reverse.conf/code> pour le second serveur web.
 +
Pour mettre en place l'équilibrage de charge, on définie les machines que l'on souhaite et on leur associe un ordre. Ici, à chaque appel ou rechargement de la page <code>reverse.girolle.site</code> la route s'incrémente et change de machine.
 +
<VirtualHost *:80>
 +
  ServerName reverse.girolle.site
 +
  ServerAdmin webmaster@localhost
 +
  <Proxy "balancer://myloadbalance">
 +
  BalancerMember "http://192.168.42.2:8087" route=1
 +
  BalancerMember "http://192.168.42.4:8087" route=2
 +
  BalancerMember "http://192.168.42.5:8087" route=3
 +
  BalancerMember "http://192.168.42.7:8087" route=4
 +
  BalancerMember "http://192.168.42.9:8087" route=5
 +
  BalancerMember "http://192.168.42.12:8087" route=6
 +
  ProxySet lbmethod=byrequests
 +
  </Proxy>
 +
  ProxyPass "/"  "balancer://myloadbalance/"
 +
  ProxyPassReverse "/"  "balancer://myloadbalance/"
 +
</VirtualHost>
 +
 
 +
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
 +
 
 +
On l'active avec les commandes suivantes :
 +
a2ensite reverse.conf
 +
service apache2 reload
 +
 
 +
Pour l'équilibrage de charge on doit parfois activer en plus le module <code>lbmethod_byrequests</code> avec la commande <code>a2enmod lbmethod_byrequests</code>.
 +
 
 +
'''Enregistrement de type CNAME dans notre DNS'''
 +
 
 +
Sur <code>capbreton</code> dans <code>/etc/bind/db.girolle.site</code> on ajoute un deuxième CNAME :
 
  ;
 
  ;
 
  ; BIND data file for local loopback interface
 
  ; BIND data file for local loopback interface
Ligne 702 : Ligne 738 :
 
  $TTL 604800
 
  $TTL 604800
 
  @ IN SOA ns1.girolle.site. postmaster.girolle.site. (
 
  @ IN SOA ns1.girolle.site. postmaster.girolle.site. (
      6 ; Serial
+
  6         ; Serial
604800 ; Refresh
+
  604800 ; Refresh
  86400 ; Retry
+
  86400 ; Retry
2419200 ; Expire
+
  2419200 ; Expire
604800 ) ; Negative Cache TTL
+
  604800 ) ; Negative Cache TTL
 
  ;
 
  ;
 
  @      IN      NS      ns1.girolle.site.
 
  @      IN      NS      ns1.girolle.site.
Ligne 719 : Ligne 755 :
 
  $include /etc/bind/girolle_dnssec/girolle.site-zsk.key
 
  $include /etc/bind/girolle_dnssec/girolle.site-zsk.key
  
 +
On signe de nouveau les enregistrement de la zone avec les commandes :
 +
 +
dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk
 +
bind9 restart
  
Dans <code>/etc/apache2/sites-available</code> on crée un nouveau fichier de configuration <code>reverse.conf/code> pour le second serveur web.
+
 
<VirtualHost *:80>
+
Pour constater la mise en place de l'équilibrage, on peut appeler la page <code>reverse.girolle.site</code> dans un navigateur. Elle affiche de contenu d'<code>index.html</code>. Si l'on crée une nouvelle version du contenu de la page en modifiant <code>index.html</code> sans activer la mise à jour sur les autres machines de <code>chassiron</code>, après un push/pull, seule notre VM aura la nouvelle version. En rechargeant plusieurs fois la page dans un navigateur on voit alors successivement la nouvelle et les anciennes versions.
  ServerName reverse.girolle.site
 
  ServerAdmin webmaster@localhost
 
  <Proxy "balancer://myloadbalance">
 
  BalancerMember "http://192.168.42.2:8087" route=1
 
  BalancerMember "http://192.168.42.4:8087" route=2
 
  BalancerMember "http://192.168.42.5:8087" route=3
 
                  BalancerMember "http://192.168.42.7:8087" route=4
 
  BalancerMember "http://192.168.42.9:8087" route=5
 
                  BalancerMember "http://192.168.42.12:8087" route=6
 
  ProxySet lbmethod=byrequests
 
</Proxy>
 
  ProxyPass "/"  "balancer://myloadbalance/"
 
  ProxyPassReverse "/"  "balancer://myloadbalance/"
 
  </VirtualHost>
 
 
 
  # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
 

Version actuelle datée du 19 décembre 2020 à 00:18

Explication Infrastructure

Installation VM

Connexion ssh:

ssh pifou@capbreton.plil.info

Commande (en root su -):

xen-create-image --hostname=girolle --ip=100.64.0.24 --netmask=255.255.255.240 --dist=buster --dir=/usr/local/xen --password=glopglop --force


MAJ gateway : 161
Nom de domaine: girolle.site
Adresse IP : 100.64.0.24 MAJ: 193.48.57.172
Netmask: 255.255.255.240 MAJ: 255.255.255.224
Adresse MAC : 00:16:3E:3E:E3:15

Repartition des volumes logiques :

lvdisplay 
lvrename 

Dans le fichier de configuration de la machine : girolle.cfg on rajoute var et home : lignes 'phy:/.../xdva3'


Commandes pour creer et acceder a la VM :

xl create -c etc/xen/girolle.cfg
xl console girolle

Commandes sur la vm:

dans etc/fstab il faut indiquer les fonctionnalites de xvda3 et xvda4

au prealable il faut


1) formater la partition :

mkfs -t ext4 /dev/xvda4

2) Monter la partition que l'on veut sur /mnt

mount /dev/xvda4 /mnt

3) Migrer tout le contenu de var dans mnt

cd /var
mv * /mnt

4) Dans le fichier fstab rajouter :

/dev/xvda4 /var ext4 defaults 0 2

5) Unmout mnt

umount /mnt

6) Monter tout sur dev/xdva

mount -a 

7)Verification

df
dpkg -l

Activation connexion ssh

On modifie le fichier /etc/ssh/sshd_config

On décommente la ligne PermissionRoot :

# Authentication:
#LoginGraceTime 2m
PermitRootLogin yes

Puis on l'active avec la commande :

service sshd restart

On peut se connecter à la machine par ssh root@girolle.site (mot de passe root habituel)

Redirection DNS

Sur Gandi

Achat d'un nom de domaine : girolle.site Création d'un Glue Record : 193.48.57.182

Serveur DNS primaire : ns1.girolle.site (193.48.57.182) Serveur DNS secondaire : ns6.gandi.net (217.70.177.40)

Sur la machine virtuelle

Installation de bind9 On modifie les fichiers dans /etc/bind/named.conf. Dans /etc/bind/named.conf.options

options {
  directory "/etc/bind";
  listen-on-v6 { any; };
  allow-transfer { "allowed_to_transfer"; };
};
acl "allowed_to_transfer" {
  217.70.177.40/32 ;
};

Dans /etc/bind/named.conf.local

zone "girolle.site" {
  type master;
  file "girolle.site/girolle";
  allow-transfer (217.70.177.40;};
};

Dans db.girolle.site

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA      ns1.girolle.site.  postmaster.girolle.site(
                             2         ; Serial
                        604800         ; Refresh
                         86400         ; Retry
                       2419200         ; Expire
                        604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.girolle.site.
@       IN      NS      ns6.gandi.net.
ns1     IN      A       193.48.57.182
@       IN      MX      100 girolle.site.
www      IN      CNAME   ns1

Puis pour le relancer :

service bind9 restart


Configuration pour la réception du mail de confirmation du certificat SSL Installer Postfixe pour avoir accès au fichier aliases

Internet Site
girolle.site

Dans /etc/aliases

admin: root

Puis ajouter dans newaliases Cela va permettre de récupérer le mail de confirmation de Gandi envoyé à admin@girolle.site

https://www.jeffgeerling.com/blogs/jeff-geerling/viewing-email-linux-using


Installation de mailx pour lire les mails reçus

apt-install bsd-mailx

Pour consulter le mail de vérification

mailx admin

Sécurisation par certificat SSL

Génération du CSR à l'aide d'openssl

openssl req -nodes -newkey rsa:2048 -sha256 -keyout girolle.site.key -out girolle.site.csr

Réception du mail de vérification avec une URL et un mot de passe ce qui nous permet de récupérer le fichier girolle.site.crt

Configuration du serveur apache2

Activation du ssl sur apache2

ae2enmod ssl

Ajout dans le fichier 000-default.conf dans /etc/apache2/sites-available <VirtualHost *:80>

 ServerName www.girolle.site                                                                                             
 Redirect / https://www.girolle.site       
 ....                                                                        

</VirtualHost>

<VirtualHost 193.48.57.182:443>
    DocumentRoot /var/www/html2
    ServerName girolle.site
        SSLEngine on
        SSLCertificateFile /root/girolle.site.crt
        SSLCertificateKeyFile /root/girolle.site.key
        SSLCertificateChainFile /root/GandiCA.pem
    </VirtualHost>

verifications:

host -t soa girolle.site ns6.gandi.net
Sur Zabeth : host www.girolle.site

Sécurisation de serveur DNS par DNSSEC

On ajoute l’option dnssec-enable yes; dans le fichier named.conf.options On crée ensuite un dossier girolle_dnssec pour y stocker les couples de clés générées: Une clef asymétrique de signature de clefs de zone

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

Une clef asymétrique de la zone pour signer les enregistrements

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

On renomme les deux paires de clés de la façon suivante :

Kgirolle.site.+0+55681.key et Kgirolle.site.+0+55681.private en girolle.site-ksk.key et girolle.site-ksk.private
Kgirolle.site.+0+00840.key et Kgirolle.site.+0+00840.private en girolle.site-zsk.key et girolle.site-ksk.private

On inclue en les clefs publiques dans le fichier de zone db.girolle.site :

$include /etc/bind/girolle_dnssec/<nom_de_zone>-ksk.key
$include /etc/bind/girolle_dnssec/<nom_de_zone>-zsk.key

On signe les enregistrement de la zone avec la commande

dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk

Dans /etc/bind/named.conf.local on modifie la zone :

zone "girolle.site" IN {
 type master;
 file "/etc/bind/db.girolle.site.signed";
 allow-transfer {227.70.177.40;};
};   


Enfin sur Gandi, on ajoute la clé publique ksk avec l'algorithme(RSA/SHA-1).

On utilise l'analyseur de DNSSEC du site Verisign Labs pour vérifier. Tout s'effectue sans erreur.

Girolle.jpg

Configuration des bornes Wi-Fi

Borne classique : Cisco - AIR-CAP1602I-E-K9

Configuration IOS en CLI :

aaa new-model
!
!
aaa group server radius radius_girolle
server 193.48.57.182 auth-port 1812 acct-port 1813
!
aaa authentication login eap_group1 group radius_group1
aaa authentication login eap_girolle group radius_girolle
!         
dot11 ssid SSID_GIROLLE
   vlan 107
   authentication open eap eap_girolle 
   authentication network-eap eap_girolle 
   authentication key-management wpa
!
!
...
interface Dot11Radio0
 encryption vlan 101 mode ciphers aes-ccm tkip


...
interface BVI1
ip address 10.60.100.10 255.255.255.0
!
radius-server host 193.48.57.182 auth-port 1812 acct-port 1813 key 7 09414A191B0A051C0E1B0D2C22


10.60.100.10 : adresse IP fixe du point d'accès


Commandes et verifications /

ap(config)#interface BVI1
ap(config-if)# ip address 10.60.100.10 255.255.255.0
ap(config-if)#exit
ap#write
PING ROUTEUR 1 POUR VERIFIER LA CONNEXION
ap#ping 10.60.100.2 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.60.100.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms

test second routeur : ne fonctionne pas car pas d'addresse ip

ap#ping 10.60.100.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.60.100.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

Configurer l'adresse par defaut:

ap(config)#ip route 0.0.0.0 0.0.0.0 10.60.100.2
ap(config)#exit
ap#sh ip route


Test ping notre machine virtuelle girolle :

ap#ping 193.48.57.182
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 193.48.57.182, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

Sécurisation

On a refait la configuration avec groupe7 pour s'aligner sur les autres groupes.

wifi-ima5sc(config)# aaa authentication login eap_group7 group radius_group7
wifi-ima5sc(config)# radius-server host 193.48.57.182 auth-port 1812 acct-port 1813 key secret_group7
wifi-ima5sc(config)# aaa group server radius radius_group7
wifi-ima5sc(config-server)# server 193.48.57.182 auth-port 1812 acct-port 1813
wifi-ima5sc(config)# dot11 ssid SSID_GROUP7
wifi-ima5sc(config-radius)# mbssid guest-mode
wifi-ima5sc(config-radius)# vlan 307
wifi-ima5sc(config-radius)# authentication open eap eap_group7
wifi-ima5sc(config-radius)# authentication network-eap eap_group7
wifi-ima5sc(config-radius)# authentication key-management wpa
wifi-ima5sc(config)# int Dot11Radio0
wifi-ima5sc(config-if)# encryption vlan 307 mode ciphers aes-ccm tkip
wifi-ima5sc(config-if)# mbssid
wifi-ima5sc(config)# ssid SSID_GROUP7
wifi-ima5sc(config-subif)# int dot11radio0.7
wifi-ima5sc(config-subif)# encapsulation dot1q 307
wifi-ima5sc(config-subif)# bridge-group 7
wifi-ima5sc(config)# int Gi0.7
wifi-ima5sc(config-subif)# encapsulation dot1q 307
wifi-ima5sc(config-subif)# bridge-group 7

FreeRadius

Dans /etc/freeradius/3.0/users

pifou Cleartext-Password := "pasglop"

Dans /etc/freeradius/3.0/client.conf

client girolle_wifi {
    ipaddr = 10.60.100.10
    secret = secret_group7
}

Dans /etc/freeradius/3.0/mods-enabled/eap

default_eap_type = peap

Finalement on lance la commande freeradius -X

DHCP et mascarade

On doit implanter une fonction de serveur DHCP sur les deux routeurs.

Pour le 6509E :

IMA5sc-R1(config)#ip dhcp pool groupe7
IMA5sc-R1(dhcp-config)#dns 193.48.57.182
IMA5sc-R1(dhcp-config)#network 10.60.107.0 255.255.255.0
IMA5sc-R1(dhcp-config)#default-router 10.60.107.1
IMA5sc-R1(dhcp-config)#exit
IMA5sc-R1(config)#ip dhcp excluded-address 10.60.107.0 10.60.107.99
IMA5sc-R1(config)#ip dhcp excluded-address 10.60.107.150 10.60.107.255
IMA5sc-R1(config)#exit
IMA5sc-R1#sh ip dhcp binding
IMA5sc-R1#ping 193.48.57.182

Le ping fonctionne.

Pour le C9200 :

IMA5sc-R2(config)#ip dhcp pool groupe7
IMA5sc-R2(dhcp-config)#dns 193.48.57.182
IMA5sc-R2(dhcp-config)#network 10.60.107.0 255.255.255.0
IMA5sc-R2(dhcp-config)#default-router 10.60.107.2
IMA5sc-R2(dhcp-config)#exit
IMA5sc-R2(config)#ip dhcp excluded-address 10.60.107.0 10.60.107.49
IMA5sc-R2(config)#ip dhcp excluded-address 10.60.107.100 10.60.107.255
IMA5sc-R2(config)#exit
IMA5sc-R2#sh ip dhcp binding

Mise en place de la mascarade (vlan131 -> vlan pour se connecter au routeur):

IMA5sc-R1(config)# int vlan 307
IMA5sc-R1(config-if)# ip nat inside
IMA5sc-R1(config)# int vlan 131
IMA5sc-R1(config-if)# ip nat outside
IMA5sc-R1(config)# access-list 107 permit ip 10.60.107.0 0.0.0.255 any
IMA5sc-R1(config)# ip nat inside source list 107 interface vlan 131 overload


Création du vlan sur les routeurs

vlan 307

Configuration WLC

Utilisation de bornes Cisco 2802i

Connection via minicom -os (9600 bauds)

enable 
capwap ap ip <ip> <netmask> <gateway>

Intrusion honey.plil.info

pour avoir les identifiants de l'admin : ID = ' OR '1'='1 et MDP = ' OR '1'='1

Admin : admin jesuislechef admin Administrateur

Creer le fichier etc/phpmyadmin/config-db.php en allant dans l'onglet: .... on telecharge le fichier qu'on a crée :

<?php
##
## database access settings in php format
## automatically generated from /etc/dbconfig-common/phpmyadmin.conf
## by /usr/sbin/dbconfig-generate-include
##
## by default this file is managed via ucf, so you shouldn't have to
## worry about manual changes being silently discarded.  *however*,
## you'll probably also want to edit the configuration file mentioned
## above too.
##
$dbuser='phpmyadmin';
$dbpass='gencovid19';
$basepath=;
$dbname='phpmyadmin';
$dbserver='localhost';
$dbport='3306';
$dbtype='mysql';

on reccupere user et mdp pour acceder a la page http://honey.plil.info/phpmyadmin/ connexion id : root mdp: gencovid19

une fois connecter on recherche les identifiants des utilisateurs ssh : id = rex mdp:

connexion ssh : ssh rex@honey.plil.info

/etc/shadow pour trouver la cle de cryptage du mdp root 
copier la cle et la mettre dans un fichier (exemple :temp): root:$6$yCvXnJp4SOQwQaxV$vRYUr1fwU1SAPxZ0NbdIw/03ypGXjjRjZKRfX3sa7T2v9XnbI4xG.EyEtcrtASLlvqxuh9Hr6TrOB5Szopd6m/:18525:0:99999:7:::
installation de john 
john nom du fichier

pour aller plus rapidement creer un dictionnaire a partir des indices donnés  : motif doublé 'le mot de passe de root possède la même particularité que le mot de passe administrateur habituel des machines de projets' utiliseer crunch?

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

On utilise le paquet aircrack-ng.

La commande

airmon-ng

permet de voir le nom du réseau sans fil: wlan0mon

airmon-ng start wlan0mon

On scanne les réseaux :

airodump-ng --encrypte wep wlan0mon

On choisi un réseau parmi ceux disponibles. Par exemple la cracotte08 est sur le canal 7 et a pour BSSID 04:DA:D2:9C:50:57.

Capturewep1.png

On lance avec la commande :

airodump-ng --write testwep --channel 7 --bssid 04:DA:D2:9C:50:57 wlan0mon
aircrack-ng -z testwep-01.cap

Capturewep2.png

Ferme de serveurs web

Architecture générale de la ferme

On travaille avec deux machines virtuelles, l'une sur le serveur capbreton (celle mise en place en PRA), l'autre sur le serveur chassiron.

On ferme la machine virtuelle sur capbreton (commande halt) pour modifier le fichier de configuration girolle.cfg. On ajoute à la ligne vif 'mac=@MAC incrémenté de 1, bridge=bridgeStudents' avant de la relancer.

Interfaces

On associe l'adresse IP 192.186.42.21 à la VM sur le serveur capbreton. Pour cela on l'ajoute dans /etc/network/interfaces :

auto eth1
iface eth1 inet static
  address 192.168.42.21 
  netmask 255.255.255.0

Sur chassiron, on ajoute une interface dans /etc/network/interfaces :

auto eth0
iface eth0 inet static
  address 192.168.42.7
  netmask 255.255.255.0 
  gateway 192.168.42.21


Le ping entre leux deux machine se fait.


Mascarade

On met en place une mascarade pour que la VM sur chassiron ait accès à internet :

iptables -P FORWARD DROP
iptables -A FORWARD -j ACCEPT -s 192.168.42.7/32
iptables -A FORWARD -j ACCEPT -d 192.168.42.7/32
iptables -t nat -A POSTROUTING -j SNAT -s 192.168.42.7/32 --to-source 193.48.57.182
iptables-save
echo 1 > /proc/sys/net/ipv4/ip_forward

Mise en place d'ansible

Installation d'ansible sur la VM de capbreton. Création des clés avec la commande ssh-keygen -t rsa

On ajoute la clé public sur toutes les machines de chassiron :

cat id_rsa.pub | ssh root@192.168.42.7 'cat >> .ssh/authorized_keys2'

Installation de Python sur la VM de chassiron (Attention à installer uniquement python3 et ne pas avoir de versions antérieurs pour éviter les conflits de version).

apt install python3
ln -sf /usr/bin/python3 /usr/bin/python

L'utilitaire ansible permet d'organiser le projet en plusieurs parties. Les manipulations se font majoritairement sur capbreton.

Inventaire

Sur capbreton, on crée un inventaire dans /etc/ansible/hosts. en séparant notre serveur seul des autres (dont le notre).

[self]
192.168.42.7
[webinterne]
192.168.42.2
192.168.42.4
192.168.42.5
192.168.42.7
192.168.42.9
192.168.42.12

Playbook et roles

On va créer plusieurs rôles qui seront lancés via un playbook (/root/playbooks/). Chaque rôle à son propre sous-répertoire (/etc/ansible/roles).

Rôle basic :

  • files qui contient la configuration mymotd_conf et ntp.conf
    • mymotd_conf : On met ce que l'on veut afficher dedans
    • ntp.conf : Fichier récupéré auquel on ajoute le serveur NTP et les IP
# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example
server ntp.plil.info
...
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
restrict 192.168.42.21
restrict 192.168.42.7
  • tasks qui contient un main.yml
- name : gestion packages
  apt:
    update_cache: yes
    name: "{{ packages } }"
  vars:
    packages:
     - python3
     - python3-pip
     - ntpdate
     - ntp

- name : gestion packages pip
  pip:
     name:
        - docker
- name: lien symbolique
  command: ln -sf /usr/bin/python3 /usr/bin/python

- name: motd
  copy:
     src: /etc/ansible/roles/basic/files/mymotd_conf
     dest: /etc/motd
     owner: root
     group: root
     mode: '0644' 
- name: config ntp
  copy:
     src: /etc/ansible/roles/basic/files/ntp.conf
     dest: /etc/ntp.conf
     owner: root
     group: root
     mode: '0644'

Ce rôle permet de configurer le motd et le NTP. Il permet également d'installer les packages nécessaires.

Installation de docker

On installe docker par l'intermédiaire du playbook sur notre VM sur chassiron. Pour cela on utilise un rôle déjà créé par geerlingguy. Les variables docker_apt_gpg_key et docker_apt_repository permettent que le rôle se comporte comme si la VM est sous debian version buster.

Playbook first_play.yml :

---
- name: Premiere playbook
  hosts: self
  roles:
    - basic 
    - geerlingguy.docker
    - registry
  vars:
    docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg"
    docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }" 

Création du conteneur

On met en place un conteneur qui contient notre site web et démarre apache2 sur le port 80. En premier lieu on installe docker sur capbreton avec wget -qO - get.docker.com | sh

Dockerfile

Il faut ensuite réaliser un dockerfile toujours sur capbreton :

FROM httpd:latest
MAINTAINER NourClara
COPY ./index.html /usr/local/apache2/htdocs/
CMD [ "httpd", "-D", "FOREGROUND" ]

Le fichier index.html dans lequel se trouve le contenu du site web doit se trouver dans le même répertoire que le dockerfile.

Construction et lancement de l'image docker

docker build -t webserver .

On aurait pu mettre girolle au lieu de webserver par exemple.

docker run -d webserver

On vérifie que l'image est construite et lancée correctement avec les commandes docker images et docker ps -a.

Dépôt docker local

Sur chassiron, on installe un dépôt local qui accueillera notre image docker.

docker run -d -p 5000:5000 --restart always --name registry registry:2


Rôle registry :

  • tasks qui contient un main.yml
- name: Setup registry
  docker_container:
          name: registry
          image: registry
          ports:
                  - "5000:5000"

Autorisation d'un dépôt non sécurisé

Par défaut, la connexion se fait en HTTPS. Comme ici les différents dépôts ne sont pas sécurisés, on doit autoriser la connexion en HTTP. Pour cela, on ajoute un fichier deamon.json sur nos deux machines dans /etc/docker/ :

{
  "insecure-registries" : ["192.168.42.2:5000", "192.168.42.4:5000", "192.168.42.5:5000", "192.168.42.7:5000", "192.168.42.9:5000", "192.168.42.12:5000"]
}

Puis service docker restart pour que le changement soit pris en compte.

Exportation depuis capbreton vers la VM sur chassiron

docker tag webserver 192.168.42.7:5000/webserver
docker push 192.168.42.7:5000/webserver

Récupération de l'image docker dans chassiron

docker pull 192.168.42.7:5000/webserver

Configuration des serveurs internes

Pour déployer notre conteneur web automatiquement sur toutes les VM de chassiron on crée un nouveau rôle. On utilise le port qui nous est alloué : le 8087.

Rôle deployer :

  • tasks contenant un main.yml
- name : deployer sur les VMs
  docker_container:
          name: site
          image: 192.168.42.7:5000/webserver
          ports:
                  - "8087:80"  

image : là où se trouve notre serveur web à déployer (sur notre VM sur chassiron)

Ensuite dans le playbook on crée une seconde partie avec pour hôte webinterne:

Playbook complet first_play.yml :

---
- name: Premiere playbook
  hosts: self
  roles:
    - basic 
    - geerlingguy.docker
    - registry
  vars:
    docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg"
    docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }"    


- name: Deploiement
  hosts: webinterne
  roles:
     - deployer

Dans notre VM sur capbreton on peut alors lancer le playbook (après que le push et le pull aient été fait sans erreur).

ansible-playbook first_play.yml

Notre conteneur web s'est déployé correctement sur les VM des groupes 4 et 5. Les autres Vm n'ont pas tous les packages nécessaires (docker ou docker-py) ou ne sont pas joignables.

Équilibreur de charge (load balancer)

On met en place un second serveur Web qui se comporte comme un serveur mandataire inverse (reverse proxy) et comme un équilibreur de charge (load balancer).

Activation des module pour le mandataire inverse

Pour utiliser Apache2 mandataire inverse, on doit activer les modules proxy (permet l’implémentation d’un serveur mandataire/passerelle) et proxy_http (permet des requêtes HTTP et HTTPS au module proxy) :

a2enmod proxy proxy_http
service apache2 restart

Mise en place du VirtualHost

Dans /etc/apache2/sites-available on crée un nouveau fichier de configuration reverse.conf/code> pour le second serveur web. Pour mettre en place l'équilibrage de charge, on définie les machines que l'on souhaite et on leur associe un ordre. Ici, à chaque appel ou rechargement de la page <code>reverse.girolle.site la route s'incrémente et change de machine.

<VirtualHost *:80>
 ServerName reverse.girolle.site
 ServerAdmin webmaster@localhost
 <Proxy "balancer://myloadbalance">
  BalancerMember "http://192.168.42.2:8087" route=1
  BalancerMember "http://192.168.42.4:8087" route=2
  BalancerMember "http://192.168.42.5:8087" route=3
  BalancerMember "http://192.168.42.7:8087" route=4
  BalancerMember "http://192.168.42.9:8087" route=5
  BalancerMember "http://192.168.42.12:8087" route=6
  ProxySet lbmethod=byrequests
 </Proxy>
 ProxyPass "/"  "balancer://myloadbalance/"
 ProxyPassReverse "/"  "balancer://myloadbalance/"
</VirtualHost>
 
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

On l'active avec les commandes suivantes :

a2ensite reverse.conf
service apache2 reload

Pour l'équilibrage de charge on doit parfois activer en plus le module lbmethod_byrequests avec la commande a2enmod lbmethod_byrequests.

Enregistrement de type CNAME dans notre DNS

Sur capbreton dans /etc/bind/db.girolle.site on ajoute un deuxième CNAME :

;
; BIND data file for local loopback interface
;
$TTL	604800
@	IN	SOA	ns1.girolle.site. postmaster.girolle.site. (
 6	        ; Serial
 604800	; Refresh
 86400		; Retry
 2419200	; Expire
 604800 )	; Negative Cache TTL
;
@       IN      NS      ns1.girolle.site.
@       IN      NS      ns6.gandi.net.
ns1     IN      A       193.48.57.182 
@	IN	MX	100 ns1.girolle.site.

www	IN	CNAME	ns1
reverse	IN	CNAME	www

$include /etc/bind/girolle_dnssec/girolle.site-ksk.key
$include /etc/bind/girolle_dnssec/girolle.site-zsk.key

On signe de nouveau les enregistrement de la zone avec les commandes :

dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk
bind9 restart


Pour constater la mise en place de l'équilibrage, on peut appeler la page reverse.girolle.site dans un navigateur. Elle affiche de contenu d'index.html. Si l'on crée une nouvelle version du contenu de la page en modifiant index.html sans activer la mise à jour sur les autres machines de chassiron, après un push/pull, seule notre VM aura la nouvelle version. En rechargeant plusieurs fois la page dans un navigateur on voit alors successivement la nouvelle et les anciennes versions.