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
-
Présentation du contexte
-
Sites internet à migrer
-
Topologie et convention de nommage
-
Utilisateurs systèmes
-
Configuration du serveur DNS
-
Configuration du serveur proxy load balancer
-
Configuration du serveur web
-
Configuration du serveur de sauvegarde
-
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
- 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 !"
- 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é !!"
- 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 !"