Thème abordé :
Load Balancing de deux serveurs web Apache et création de deux serveurs de sauvegarde répliqués

Table des matières

  1. Présentation du contexte
  2. Sites internet à migrer
  3. Topologie et convention de nommage
  4. Utilisateurs systèmes
  5. Configuration du serveur DNS
  6. Configuration du serveur proxy load balancer
  7. Configuration du serveur web
  8. Configuration du serveur de sauvegarde
  9. Annexes

1.Présentation du contexte

L’entreprise PPEWEB, est un prestataire d’hébergement WEB dans toute la région Hauts-de-France.

Elle vous a embauchée afin de mettre à niveau son infrastructure de serveurs. Actuellement, elle possède aujourd’hui un serveur en production et un serveur de sauvegarde. L’entreprise héberge des applications parfois sensibles pour des clients, elle doit donc avoir une qualité de service irréprochable sans interruption de même qu’au niveau sauvegarde et sécurisation des données qu’elle héberge. C’est pourquoi, elle a acquis 3 serveurs, 1 qui servira de proxy balancer, 1 serveur qui serra redondé avec l’actuel et un 1 serveur de sauvegarde redondé avec l’actuel.

Les tâches que vous ont attribuées PPEWEB sont :

  • De mettre en production ses nouveaux serveurs en toute transparence.
  • De sécuriser les échanges et les données confidentielles sans perturber les applications.

Le matériel mis à disposition :

  • 5 serveurs avec le système d’exploitation Debian 9
  • 1 PC Windows qui représentera le client sur internet
  • 1 PC Windows qui représentera un PC d’administration de l’entreprise PPEWEB

2. Sites internet à migrer

Les sites internet à migrer sont :

  • www.promeo-formation.fr
  • thomasvastel.fr
  • www.site1.com
  • www.site2.com
  • www.ugecam-normandie.fr
  • plautinet.fr
  • balarger.fr
  • www.ppeweb.fr

3. Topologie et convention de nommage

Tableau des adresses IP
PPEWEB-PRXBALANCER 100.100.100.1  /24
PPEWEB-SRVSAVE1 100.100.100.10 /24
PPEWEB-SRVSAVE2 100.100.100.11 /24
PPEWEB-SRVWEB1 100.100.100.21 /24
PPEWEB-SRVWEB2 100.100.100.22 /24
CIENT-INTERNET 100.100.100.30 /24
CLIENT-ADMIN-PPEWEB 100.100.100.31 /24

4. Utilisateurs systèmes

Utilisateurs système de tous les postes Debian :

root / P@ssw0rd

thomas / Promeo60!

sauvegarde / M0tdeP@ssEdeS@uvEg@rdE

serviceinfo / Inf0ServicePpeWeb

5. Configuration du serveur DNS

Rappel : Le DNS est un élément fondamental dans le fonctionnement d’Internet et des réseaux informatiques en général. DNS signifie Domain Name Service, ou communément en français Service de Noms de Domaines. Il permet de transformer une adresse IP en nom identifiable par un humain. Nous configurons le serveur DNS de l’entreprise PPEWEB.  Connectons-nous tout d’abord au serveur en SSH.


ssh –p 49922 serviceinfo@100.100.100.250
serviceinfo@NS1:~#
serviceinfo@NS1:~$ su
Mot de passe :
root@NS1:/home/thomas#
root@NS1:~# apt update
root@NS1:~# apt upgrade
root@NS1:~# apt install bind9
root@NS1:~# cd /etc/bind
root@NS1:/etc/bind#

Nous sommes dans le dossier de configuration de Bind9, avant de travailler dans celui-ci, nous allons en faire une sauvegarde complète.

root@NS1:/etc/bind# mkdir /etc/bind-save
root@NS1:/etc/bind# cp –r * /etc/bind-save/

Nous vérifions que la copie est belle est bien faite.

root@NS1:/etc/bind# ls /etc/bind-save

Nous créons notre première zone, nous l’appellerons thomasvastel.fr. Pour cela, nous ajoutons le contenu ci-dessous dans le fichier named.conf.local.

zone "thomasvastel.fr" {
type master;
file "/etc/bind/db.thomasvastel.fr";
};

Explications : Le contenu ci-dessus indique le serveur est maître de la zone DNS du domaine thomasvastel.fr.

Le fichier nommé db.thomasvastel.fr contient l’ensemble des enregistrements DNS pour la zone. Nous le créons.

$TTL    604800
@       IN      SOA     thomasvastel.fr. ns1.ppeweb.fr. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL ;
@       IN      NS      ns1.thomasvastel.fr.
@       IN      A       100.100.100.1

Explications du fichier de configuration :

@       IN      SOA     thomasvastel.fr. ns1.ppeweb.fr. (

SOA = Start Of Authority

L’autorité du nom de domaine thomasvastel.fr est le serveur DNS (Name Server) nommé ns1.ppeweb.fr.

@       IN      NS      ns1.ppeweb.fr.

Pour le nom de domaine thomasvastel.fr, le serveur de nom est ns1.ppeweb.fr

@       IN      A       100.100.100.1

L’adresse IPv4 (A) de thomasvastel.fr est 100.100.100.1. Cette adresse IP est celle du serveur web reverse proxy load balancer.

Nous rechargeons les fichiers de configuration du service bind9. Puis nous vérifions si le service est bien actif.

root@NS1:/etc/bind# service bind9 reload

root@NS1:/etc/bind# service bind9 status

Si le service est déclaré comme « running », si oui, le service est démarré et fonctionnel.

La zone thomasvastel.fr est désormais créée et est désormais opérationnelle. Nous pourrons faire la même chose pour les autres noms de domaine. Pour gagner du temps, nous  automatisons ces étapes à l’aide d’un script. (Disponible en annexe 1).

6. Configuration du serveur proxy load balancer

Le proxy est utilisé de diverses manières dans l’utilisation d’Internet et des outils web. Dans le cas de l’entreprise PPEWEB, elle utilise un proxy avec Apache afin de répartir la charge de travail entre les serveurs.

Passons à la configuration du serveur proxy load balancer.

Nous mettons à jour le serveur et installons Apache2 et PHP

root@PRXBALANCER:~# apt update && apt upgrade –y
root@PRXBALANCER:~# apt install apache2 php

Nous vérifions qu’Apache est fonctionnel, pour cela nous allons vérifier son statut.

root@PRXBALANCER:~# service apache2 status
root@PRXBALANCER:~#
apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) […]

Parfait, nous pouvons continuer.

Nous allons maintenant activer les modules nécessaires au Load Balancing et au reverse proxy.

root@PRXBALANCER:~# a2enmod proxy_balancer proxy_https proxy_http2 proxy_http

Nous activons aussi les modules indispensables à l’hébergement de sites,  le mod SSL et le mod header.

root@PRXBALANCER:~# a2enmod ssl header

Nous allons créer notre premier site qui sera load balancé. Attention, il y aura une erreur après l’activation du site puisqu’il ne sera pas encore créé sur les deux serveurs de fond.

Notre premier site se nommera thomasvastel.fr.

Dirigeons-nous dans le répertoire dans lequel se trouvent toutes les configurations des vhost d’Apache et créons le fichier de configuration de note site (thomasvastel.fr.conf).

root@PRXBALANCER:~# cd /etc/apache2/sites-availables/
root@PRXBALANCER:/etc/apache2/sites-availables/# nano thomasvastel.fr.conf

Nous insérons les lignes ci-dessous dans le fichier.

<VirtualHost *:80>
        ProxyRequests off
        ServerName thomasvastel.fr #nom du site

        <Proxy balancer://thomasvastel.fr> #serveurs de fond
                BalancerMember http://100.100.100.21:80 route=1 #membre 1
                BalancerMember http://100.100.100.22:80 route=2 #membre 2
                 ProxySet lbmethod=byrequests
        </Proxy>
        <Location /balancer-manager>
                SetHandler balancer-manager
                Require host thomasvastel.fr
        </Location>
        ProxyPass /balancer-manager !
        ProxyPass / balancer://thomasvastel.fr/
        ProxyPreserveHost On
        ProxyRequests On
        ProxyPass / http://100.100.100.21
        ProxyPassReverse / http://100.100.100.21
        ProxyPass / http://100.100.100.22
        ProxyPassReverse / http://100.100.100.22

</VirtualHost>

Nous activons le vhost (un message indiquera que le site est activé), puis nous rechargeons Apache.

root@PRXBALANCER:~# a2ensite thomasvastel.fr.conf
root@PRXBALANCER:~# service apache2 reload

Il n’y a plus qu’à faire cela pour l’ensemble des sites à créer. Pour gagner du temps, nous  automatisons ces étapes à l’aide d’un script. (Disponible en annexe 2).

7. Configuration du serveur web

Nous configurons désormais un serveur web. Nous allons créer le vhost du site thomasvastel.fr, son répertoire ainsi que son dossier de logs. Nous commençons par aller dans le répertoire des vhosts d’Apache.

root@PPEWEBSRV1:~# cd /etc/apache2/sites-availables
root@PPEWEBSRV1:/etc/apache2/sites-availables/# nano thomasvastel.fr.conf

Nous insérons les lignes ci-dessous dans le fichier.

<VirtualHost *:80>
ServerName thomasvastel.fr
ServerAdmin assistance@ppeweb.fr
DocumentRoot /var/www/thomasvastel.fr
CustomLog /var/log/apache2/thomasvastel.fr/access.log combined
ErrorLog /var/log/apache2/thomasvastel.fr/error.log
</VirtualHost>

Avant d’activer le site, nous créons le fichier de logs ainsi que ces fichiers et le répertoire du site. Pour cela, nous nous dirigeons vers le répertoire de logs d’Apache.

root@PPEWEBSRV1:/etc/apache2/sites-availables/# cd /var/log/apache2
root@PPEWEBSRV1:/var/log/apache2# mkdir thomasvastel.fr && cd thomasvastel.fr && touch error.log access.log
root@PPEWEBSRV1:/var/log/apache2# cd /var/www/
root@PPEWEBSRV1:/var/www/# mkdir thomasvastel.fr

Nous changeons le propriétaire du dossier de notre site avec la commande chown. Dans notre cas, elle définit de manière récursive tous les répertoires et fichiers appartenant à www-data du groupe www-data.

root@PPEWEBSRV1:/var/www/# chown –R www-data:www-data thomasvastel.fr

Puis, nous appliquons les droits de façon que seul le propriétaire puisse lire, écrire et exécuter sur le dossier (7). Nous donnons la permission aux autres utilisateurs un accès en lecture et exécution (5) et interdisons l’accès aux autres (0).

root@PPEWEBSRV1:/var/www/# chmod 750 thomasvastel.fr

Nous créons un fichier index.html dans le répertoire du site afin que nos utilisateurs puissent le consulter.

root@PPEWEBSRV1:/var/www/# echo "thomasvastel.fr" > thomasvastel.fr/index.html

Activons maintenant notre site, nous retournons donc dans le répertoire des vhosts.

root@PPEWEBSRV1:/var/www/# cd /etc/apache2/sites-availables/
root@PPEWEBSRV1:/etc/apache2/sites-availables/# a2ensite thomasvastel.fr.conf
root@PPEWEBSRV1:/etc/apache2/sites-availables/# service apache2 reload

Notre site est désormais créé et opérationnel ! Nous devrons réexécuter cette action sur l’autre serveur à l’identique. C’est pourquoi afin de gagner du temps, nous utiliserons un script (annexe 3) pour pouvoir faire toutes ces tâches précédentes.

Afin de prévoir les sauvegardes futures, nous attribuons à l’utilisateur sauvegarde les droits de lecture et d’exécution dans le répertoire /var/www/. Nous utilisons le paquet acl.

root@PPEWEBSRV1:# apt install acl
root@PPEWEBSRV1:# setfacl –Rm u:sauvegarde:rx /var/www/

8. Configuration du serveur de sauvegarde

Les serveurs de sauvegardes permettent de conserver l’ensemble des données que PPEWEB a en sa possession. Nous configurons un serveur qui sauvegardera toutes les nuits tous les sites internet des clients.

Tout d’abord, nous allons créer un utilisateur dédié à la sauvegarde qui n’aura que les droits lecture et exécution sur les sites des clients. Nous l’appellerons sauvegarde et comme mot de passe M0tdeP@ssEdeS@uvEg@rdE.

root@PPEWEBSRVSAVE1:/#adduser sauvegarde

Afin de sécuriser et d’éviter à chaque connexion SSH vers un serveur distant, nous  créons une clé SSH pour que l’utilisateur sauvegarde puisse se connecter aux serveurs sans authentification par mot de passe. Nous devenons l’utilisateur sauvegarde afin de générer la clé.

root@PPEWEBSRVSAVE1:/#su sauvegarde

sauvegarde@PPEWEBSRVSAVE1:/root$

sauvegarde@PPEWEBSRVSAVE1:$ ssh-keygen -t rsa -b 4096

Enter file in which to save the key (/home/sauvegarde/.ssh/id_rsa):
Created directory ‘/home/sauvegarde/.ssh’.
Enter passphrase (empty for no passphrase): //NE PAS ENTRER DE MOT DE PASSE
Enter same passphrase again: //NE PAS ENTRER DE MOT DE PASSE

Puis nous copions la clé publique sur les serveurs web en production. Nous entrons le mot de passe de l’utilisateur sauvegarde distant puis la connexion SSH s’effectue. La clé s’incrémente dans le fichier sur lequel se trouvent toutes les clés publiques partagées. Nous répétons la même opération pour le second serveur.

sauvegarde@PPEWEBSRVSAVE1:$ ssh-copy-id sauvegarde@serv1.ppeweb.fr

sauvegarde@PPEWEBSRVSAVE1:$ ssh-copy-id sauvegarde@serv2.ppeweb.fr

La connexion SSH  se fera désormais sans mot de passe avec l’utilisateur sauvegarde.

Maintenant, nous créons un script qui permet de récupérer le contenu. Tout d’abord, nous créons un répertoire dans lequel se trouveront nos scripts.

sauvegarde@PPEWEBSRVSAVE1:$ mkdir scripts
sauvegarde@PPEWEBSRVSAVE1:$ cd scripts
sauvegarde@PPEWEBSRVSAVE1:$ nano sauvegarde_serv1.sh
Nous insérons le contenu ci-dessous dans le fichier.
#/bin/sh

annee=`date +%Y`
mois=`date +%m`
jour=`date +%d`
hote=serv1.ppeweb.fr
datedujour=`date +%Y-%m-%d`
dossier_src_sauvegarde=/var/
dossier_src=www/
dossier_dest_sauvegarde=/home/sauvegarde/
dossier_dest=www

cd $dossier_dest_sauvegarde/
if [ ! -d "$dossier_dest " ];then
        echo "Création du dossier $ dossier_dest... ";
        mkdir $ dossier_dest
        echo "OK !"
fi

cd $dossier_dest
if [ ! -d $hote " ];then
        echo "Création du dossier $hote... ";
        mkdir $hote
        echo "OK !"
fi

cd $hote

if [ ! -d "$mois" ];then
        echo "Création du dossier du mois $mois... ";
        mkdir $mois
        echo "OK !"
fi

cd $mois

if [ ! -d "$jour" ];then
        echo "Création du dossier du jour n° $jour du mois $mois... ";
        mkdir $jour
        echo "OK !"
fi

cd $jour

echo ""
echo "Démarrage de la sauvegarde..."
echo ""
echo ""
        echo "Copie..."
        rsync -arpzte 'ssh -p 49922' $hote:$dossier_src_sauvegarde/$dossier_src/* $dossier_dest_sauvegarde/$dossier_dest/$hote/$jour/
        echo ""
        echo "Terminé !"

Ce script classera le contenu en du serveur sur lequel il récupère puis en fonction du mois puis du jour de l’année.  Nous devrons modifier la variable $hote puisque nous avons deux serveurs. Nous pourrons créer alors deux scripts.

Nous allons maintenant configurer la crontab de sauvegarde afin que les scripts puissent s’exécuter à une heure précise.

sauvegarde@PPEWEBSRVSAVE1:$ crontab –e

Nous insérons à la suite dans la crontab de sauvegarde ces deux lignes.

0 0 * * * /home/sauvegarde/sauvegarde_serv1.sh

0 0 * * * /home/sauvegarde/sauvegarde_serv2.sh

Elles permettent d’exécuter chaque jour à 00h le script sauvegarde_serv1.sh et sauvegarde_serv2.sh dans le répertoire /home/sauvegarde.

Nous devrons exécuter cette même opération sur le deuxième serveur de sauvegarde. Désormais, les deux serveurs pourront sauvegarder tout le contenu des serveurs de sites internet.

9. Annexes

  1. Annexe 1
#/bin/sh
nomzone=

#dossier
bind9_racine=/etc/bind/

#noms de fichiers
bind9_named=named
bind9_conf=conf
bind9_local=local
bind9_db=db

        echo -n "Entrez le nom de la zone master (domain.tld) : "
                read nomzone
                write $nomzone

        echo "La fichier de configuration se nommera $bind9_db.$nomzone"
               echo "Création de la zone master"

#creation de la zone master
cd $bind9_racine
        echo "" >> $bind9_named.$bind9_conf.$bind9_local &&
        echo "                           zone \"$nomzone\" {" >> $bind9_named.$bind9_conf.$bind9_local &&
        echo '                                          type master;' >> $bind9_named.$bind9_conf.$bind9_local &&
        echo "                                         file \"$bind9_racine/db.$nomzone\"; " >> $bind9_named.$bind9_conf.$bind9_local &&
        echo "                           };" >> $bind9_named.$bind9_conf.$bind9_local &&
               echo "OK !"

#creation de la BDD du domaine $nomzone
                              echo "Création de la Base de Données du domaine $nomzone"
        touch $bind9_db.$nomzone &&

               echo '$TTL    604800' > $bind9_db.$nomzone
                echo "
@       IN      SOA     $nomzone. ns1.ppeweb.fr. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.ppeweb.fr.
@       IN      A       100.100.100.1
               " >> $bind9_db.$nomzone
                                                         
                             echo "C'est fait !"
  1. Annexe 2
#/bin/sh

nomsite=
prxbalancer1=100.100.100.21
prxbalancer2=100.100.100.22
porthttp=80
repapachevhost=/etc/apache2/sites-available/

echo -n "Tapez le nom du site internet à créer : "
    read nomsite
    write $nomsite

echo "Le nom du site sera  $nomsite"
echo "Direction le répertoire de vhosts d'Apache"
cd $repapachevhost &&
echo ""
echo "Création du fichier de conf PROXY BALANCER du site $nomsite"
touch $nomsite.conf &&
echo "

<VirtualHost *:80>

ProxyRequests off
ServerName $nomsite

<Proxy balancer://$nomsite

BalancerMember http://$prxbalancer1:$porthttp route=1
BalancerMember http://$prxbalancer2:$porthttp route=2
ProxySet lbmethod=byrequests

</Proxy>
<Location /balancer-manager
SetHandler balancer-manager
Require host $nomsite
</Location>
ProxyPass /balancer-manager !
ProxyPass / balancer://$nomsite/
ProxyPreserveHost On
roxyRequests On

ProxyPass / http://$prxbalancer1
ProxyPassReverse / http://$prxbalancer1
ProxyPass / http://$prxbalancer2
ProxyPassReverse / http://$prxbalancer2
</VirtualHost>" >> $nomsite.conf &&

echo "C'est fait !"
echo "Activation du site"
a2ensite $nomsite.conf &&
echo "OK !"
echo "Reload d'Apache"
service apache2 reload
echo ""
echo "Terminé !!"
  1. Annexe 3
nomsite=
repapachevhost=/etc/apache2/sites-available/
repapachelog=/var/log/apache2/
repvarwww=/var/www/

echo -n "Tapez le nom  du site internet à créer : "
        read nomsite
        write $nomsite

echo "Direction $repapachevhost"
cd $repapachevhost &&
echo "Création fichier vhost du site $nomsite"
touch $nomsite.conf &&
echo "Création fichier de configuration dans Apache."
echo "

<VirtualHost *:80>
ServerName $nomsite
ServerAdmin assistance@ppeweb.fr
DocumentRoot /var/www/$nomsite
CustomLog /var/log/apache2/$nomsite/access.log combined
ErrorLog /var/log/apache2/$nomsite/error.log
</VirtualHost>" >> $nomsite.conf &&

echo "Création du répertoire de $nomsite"
mkdir $repapachelog/$nomsite &&
cd $repapachelog/$nomsite &&
touch access.log error.log &&
echo "Création du répertoire du $nomsite"
mkdir $repvarwww/$nomsite &&
cd $repvarwww/$nomsite &&
touch index.html &&
echo "<center><h1>SERV 1</h1></center>" >> index.html &&
echo "<center><h2>$nomsite</h2></center>" >> index.html &&
chown -R www-data:www-data $repvarwww/$nomsite/ &&
cd $repapachevhost &&
a2ensite $nomsite.conf &&
service apache2 reload



echo "OK !"

PPE1 : Au format PDF

Catégories : PPE1