Installation d’un serveur web ecommerce.fr sur une machine unique

Installation des services

Installation des paquets :

dnf install nginx php-fpm mariadb-server php-mysqlnd

Configuration d’nginx

  1. Lancement et démarrage automatique du service nginx :
systemctl enable --now nginx
  1. Autorisation du protocole http dans firewall-cmd :
firewall-cmd --permanent --add-service=http && firewall-cmd --reload
  1. Test de connexion sur l’IP de la machine :

Test de connexion sur l’IP

Configuration de mariadb

  1. Lancement et démarrage automatique du service mariadb :
systemctl enable --now mariadb
  1. ““Sécurisation”” du serveur mariadb
mysql_secure_installation
Switch to unix_socket authentication [Y/n] 
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] 
Disallow root login remotely? [Y/n] 
Remove test database and access to it? [Y/n] 
Reload privilege tables now? [Y/n]
  1. Création d’une base de données et d’un utilisateur :
mysql -u root -p
create database mabdd;
CREATE USER 'hi'@'localhost' IDENTIFIED BY 'motdepasse';
GRANT ALL PRIVILEGES ON mabdd.* TO 'hi'@'localhost';
FLUSH PRIVILEGES;
exit
  1. Déploiement du site ecommerce.fr

Créer le dossier pour le site :

mkdir -p /var/www/ecommerce.fr/

Copier le contenu du site depuis un appareil externe vers le serveur :

scp -r ecommerce.fr/* root@192.168.197.55:/var/www/ecommerce.fr

Ouvrir le fichier /etc/php-fpm.d/www.conf et remplacer les valeurs user = apache et group = apache par user = nginx et group = nginx

Démarrer le service php-fpm :

systemctl enable --now php-fpm

Créer un fichier de configuration appelé ecommerce.fr.conf pour le site dans /etc/nginx/conf.d :

server {
    listen 80;
    listen [::]:80;
    root /var/www/ecommerce.fr/;
    index index.html index.htm index.nginx-debian.html sign-up.php;
    server_name ecommerce.fr;

    location ~* \.php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }

    access_log /var/log/nginx/access_ecommerce.fr.log;
    error_log /var/log/nginx/error_ecommerce.fr.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Appliquer les bonnes permissions sur ecommerce.fr :

find /var/www/ecommerce.fr/ -type d -exec chmod 755 {} \;
find /var/www/ecommerce.fr/ -type f -exec chmod 644 {} \;
chown -R nginx:nginx /var/www/ecommerce.fr/

Modifier le fichier conf.php présent dans /var/www/ecommerce.fr pour renseigner les identifiants de la base SQL :

<?php
$SETTINGS["mysql_user"]='hi';
$SETTINGS["mysql_pass"]='motdepasse';
$SETTINGS["hostname"]='localhost';
$SETTINGS["mysql_database"]='mabdd';
$SETTINGS["data_table"]='registrations';
$SETTINGS["paypal_address"]='email@domain.com';
?>

Exécuter le script SQL database.sql présent dans /var/www/ecommerce.fr :

mysql -u hi -p
use mabdd
source /var/www/ecommerce.fr/database.sql
exit
systemctl restart nginx

Modification du fichier /etc/hosts de mon PC portable pour pointer vers ecommerce.fr :

sudo su -
echo "192.168.2.55    ecommerce.fr" > /etc/hosts

Test de connexion sur ecommerce.fr :

Test de connexion sur ecommerce.fr

Pour vérifier que php est fonctionnel :

echo '<?php phpinfo(); ?>' > /var/www/ecommerce.fr/info.php

Se rendre sur ecommerce.fr/info.php

Test de connexion php ecommerce.fr

Installation d’un serveur web ecommerce.uk sur une machine unique

Répéter les opérations précédentes

  1. Création d’une nouvelle base de données et d’un nouvel utilisateur :
mysql -u root -p
create database mydb;
CREATE USER 'hello'@'localhost' IDENTIFIED BY 'motdepasse';
GRANT ALL PRIVILEGES ON mydb.* TO 'hello'@'localhost';
FLUSH PRIVILEGES;
exit
  1. Copie du dossier et de la configuration d’ecommerce.fr vers ecommerce.uk
cp -r /var/www/ecommerce.fr/ /var/www/ecommerce.uk
cp /etc/nginx/conf.d/ecommerce.fr.conf /etc/nginx/conf.d/ecommerce.uk.conf
  1. Remplacer toutes les itérations d’ecommerce.fr vers ecommerce.uk
sed -i 's/ecommerce.fr/ecommerce.uk/g' /etc/nginx/conf.d/ecommerce.uk.conf
  1. Rajouter l’entrée d’ecommerce.uk dans le fichier host de l’utilisateur
sudo su -
echo "192.168.2.55    ecommerce.uk" > /etc/hosts
  1. Redémarrer nginx et tester

Test de connexion sur ecommerce.uk

  1. Checking des logs
[root@srv-web-01 ~]# ls -lrt /var/log/nginx
total 20
-rw-r--r--. 1 root root    0 Jan 20 11:09 error.log
-rw-r--r--. 1 root root    0 Jan 20 11:09 access.log
-rw-r--r--. 1 root root 4191 Jan 20 11:35 error_ecommerce.fr.log
-rw-r--r--. 1 root root    0 Feb  3 08:45 error_ecommerce.uk.log
-rw-r--r--. 1 root root 1846 Feb  3 08:50 access_ecommerce.uk.log
-rw-r--r--. 1 root root 6438 Feb  3 08:50 access_ecommerce.fr.log

Restriction accès IP

  1. Création d’une blocklist et ajout de son addresse IP
echo "deny 192.168.2.92;" > /etc/nginx/blockip.conf
  1. Ajout de la blocking list sur ecommerce.fr
  • Ouvrir le fichier /etc/nginx/conf.d/ecommerce.fr.conf
  • Ajouter le bloc include blockip.conf; au dessus de server_name
  • Recharger nginx

Test blockip.conf sur ecommerce.fr

Analyse des logs

  1. Installer goaccess pour une interface plus claire
dnf install epel-release -y
dnf install goaccess -y
  1. Charger les logs de connexion
goaccess -f /var/log/nginx/access_ecommerce.fr.log

Choisissez le format des logs et appuyez sur Entrée.

Configuration du format des logs

Vous pouvez maintenant naviguer simplement dans les logs d’accès de votre site web.

Liste des accès sur ecommerce.fr

Ajout d’un certificat TLS

Création d’un dossier dédié à nos certificats et modification des permissions

mkdir /etc/ssl/private
chmod 700 /etc/ssl/private

Création du certificat TLS

Req : La commande x509 est un utilitaire de certificat polyvalent. Il peut être utilisé pour afficher des informations de certificat, convertir des certificats en diverses formes, signer des demandes de certificat comme une «mini CA» ou modifier les paramètres de confiance de certificat.

-x509 : Cette option génère un certificat auto-signé au lieu d’une demande de certificat. Ceci est généralement utilisé pour générer un certificat de test ou une autorité de certification racine auto-signée. Les extensions ajoutées au certificat (le cas échéant) sont spécifiées dans le fichier de configuration.

-nodes : Cela indique à OpenSSL d’ignorer l’option permettant de sécuriser notre certificat avec une passphrase. Nous avons besoin de Nginx pour pouvoir lire le fichier, sans intervention de l’utilisateur, au démarrage du serveur. Une phrase secrète empêcherait que cela se produise car nous devions la saisir après chaque redémarrage.

-days 365 : durée de validité du certificat

-newkey rsa:2048 : Cela spécifie que nous voulons générer un nouveau certificat et une nouvelle clé en même temps. Nous n’avons pas créé la clé requise pour signer le certificat lors d’une étape précédente, nous devons donc la créer avec le certificat. La partie rsa: 2048 lui indique de créer une clé RSA d’une longueur de 2048 bits.

-keyout /etc/ssl/private/nginx-selfsigned.key

-out /etc/ssl/certs/nginx-selfsigned.crt

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Hauts-de-France
Locality Name (eg, city) [Default City]:Lille
Organization Name (eg, company) [Default Company Ltd]:Basile Industries
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:srv-web-01
Email Address []:basile@ribour.org

Création d’un groupe Diffie-Hellman fort pour la négotiation de PFS

openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

Ajout du protocole https sur les sites ecommerce

  1. Rajouter ce bloc sur /etc/nginx/conf.d/ecommerce.fr.conf
server {
    listen 443 http2 ssl;
    listen [::]:443 http2 ssl;
    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    ssl_dhparam /etc/ssl/private/dhparam.pem;
    root /var/www/ecommerce.fr/;
    index index.html index.htm index.nginx-debian.html sign-up.php;
    server_name ecommerce.fr;

    location ~* \.php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }

    access_log /var/log/nginx/access_ecommerce.fr.log;
    error_log /var/log/nginx/error_ecommerce.fr.log;

    location / {
        try_files $uri $uri/ =404;
    }
}
  1. Autoriser le port https sur le firewall
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
  1. Redémarrage du service nginx et vérification

Chrome nous prévient que le certificat généré ne provient pas d’une authorité présente dans le navigateur. Nous pouvons continuer tout de même.

Message d’alerte lié au certificat auto-signé

Nous pouvons voir les détails émanant de ce certificat via l’onglet “Détails du certificat”.

Détails du certificat auto-signé

Redirection HTTP → HTTPS

Ajouter le module suivant en dessous de server_name ecommerce.fr; dans le fichier de configuration /etc/nginx/conf.d/ecommerce.fr.conf

return 301 https://$host$request_uri/;

Faire de même pour le fichier /etc/nginx/conf.d/ecommerce.uk.conf

Configurer un serveur B à accéder à la BDD d’un serveur A

  1. Ouvrir le port 3306/tcp sur le serveur A
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
  1. Autoriser les connexions extérieures à la BDD du serveur A

Ouvrir le fichier /etc/my.cnf.d/mariadb-server.cnf et décommenter la ligne bind-adress=0.0.0.0 ⚠️ Cela aura pour effet d’accepter la connexion à la BDD sur toutes les interfaces du serveur

  1. Création/Modification d’un compte pour autoriser le serveur B à se connecter à une BDD du serveur A
MariaDB [(none)]> GRANT ALL on mabdd.* to 'hi'@'192.168.43.205' IDENTIFIED BY 'motdepasse';
MariaDB [(none)]> FLUSH PRIVILEGES;

Test de connexion mariadb sur le serveur A depuis le serveur B

Ajout de la Haute Disponibilité (HA)

Installer HAProxy sur srv-haproxy-01

dnf install haproxy -y

Configuration d’HAProxy

  1. Création d’une copie du fichier de configuration
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
  1. Ajout de notre configuration HAProxy dans le fichier haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

#---------------------------------------------------------------------
# Default settings
#---------------------------------------------------------------------
defaults
    mode        http
    log         global
    option      httplog
    option      dontlognull
    timeout     connect 5000ms
    timeout     client 50000ms
    timeout     server 50000ms

#---------------------------------------------------------------------
# Stats configuration
#---------------------------------------------------------------------
listen stats
    bind        *:8080  # son port
    stats       enable
    stats       hide-version
    stats       uri /stats  # l’url
    stats       admin if LOCALHOST
    stats       auth haproxy:haproxy  # login/mdp de l’interface
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
    bind        *:80  # sur le port de votre serveur HAproxy
    acl         url_static path_beg -i /static /images /javascript /stylesheets
    acl         url_static path_end -i .jpg .gif .png .css .js
    # use_backend static if url_static
    default_backend app  # nom de votre backend

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app  
    balance roundrobin
    server web01 192.168.43.55:443 ssl verify none check
    server web02 192.168.43.205:443 ssl verify none check
  1. Activer rsyslog

Décommenter les lignes suivantes dans /etc/rsyslog.conf

module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
  1. Autoriser HAProxy à se connecter aux services sur SELinux et démarrer les services
setsebool -P haproxy_connect_any 1
systemctl enable --now haproxy
systemctl enable --now rsyslog
  1. Connexion à la page de statistiques HAProxy

Se rendre dans son navigateur et taper l’IP de votre serveur HAProxy suivi de :8080/stats. Ici, j’ai dû renseigner http://192.168.43.39:8080/stats

Page de statistiques HAProxy

Sécurisation de notre serveur HAProxy

Nous allons générer un certificat autosigné pour HAProxy.

  1. Générer le cert valide 1 an
cd /etc/pki/tls/certs
openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/haproxy.pem -out /etc/pki/tls/certs/haproxy.pem -days 365

Création du certificat RSA

  1. Modifier le fichier de configuration HAProxy

Rajouter les lignes suivantes dans global

maxsslconn 256
tune.ssl.default-dh-param 2048

Configuration global

Rajouter la ligne suivante dans frontend main

bind *:443 ssl crt /etc/pki/tls/certs/haproxy.pem

Configuration frontend

  1. Redémarrer le service et vérifier le certificat utilisé
systemctl restart haproxy

Détails du certificat auto-signé utilisé par haproxy

Installation et configuration d’un cluster HAProxy

Installation du deuxième serveur HAProxy

Réinstallez une nouvelle VM et répliquez la configuration initiale du premier HAProxy.

Ajout de la résolution des noms sur les serveurs

Ouvrez le fichier /etc/hosts sur chaque machines et ajoutez les entrées suivantes :

192.168.43.55   srv-web-01
192.168.43.205  srv-web-02
192.168.43.39   srv-haproxy-01
192.168.43.123  srv-haproxy-02

Installation et configuration de pacemaker sur les deux serveurs HAProxy

  1. Ajout du repository High Availability
dnf config-manager --set-enabled highavailability
  1. Installation du service Pacemaker et de l’outil pcs
dnf install pacemaker pcs
  1. Ajout du démon pcsd au démarrage de la machine
systemctl enable --now pcsd
  1. Création d’un mot de passe pour le compte hacluster
passwd hacluster
  1. Ouverture du port 2224/tcp pour pacemaker
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --reload
  1. Ajout de l’authentication entre nos deux nodes
pcs host auth srv-haproxy-01 srv-haproxy-02

Ajout des deux nodes sur pcs

  1. Déploiement du cluster

⚠️ À partir de maintenant, faire les manipulations uniquement sur le node01 ⚠️

pcs cluster setup ha_cluster srv-haproxy-01 srv-haproxy-02

Création du cluster

  1. Démarrage et activation du cluster
pcs cluster start --all
pcs cluster enable --all
  1. Vérification de l’état du cluster et des noeuds
pcs cluster status
pcs status corosync
pcs status cluster
pcs status nodes

Vérification de l’état du cluster et des nodes

  1. Désactivation de STONITH
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
  1. Création d’une VIP
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.43.100 cidr_netmask=24 op monitor interval=30s
  1. Installation de la ressource haproxy pour heartbeat

⚠️ Vous devez ici réaliser la manipulation sur les deux serveurs ⚠️

cd /usr/lib/ocf/resource.d/heartbeat/
curl -O https://raw.githubusercontent.com/thisismitch/cluster-agents/master/haproxy
chmod +x haproxy
  1. Création de notre cluster de ressource maintenance

⚠️ À réaliser de nouveau sur le node01 uniquement ⚠️

pcs resource create haproxy ocf:heartbeat:haproxy binpath=/usr/sbin/haproxy conffile=/etc/haproxy/haproxy.cfg op monitor interval=10s
  1. Affectation de notre ressource HAproxyGroup à notre cluster
pcs resource group add HAproxyGroup virtual_ip haproxy
pcs constraint order virtual_ip then haproxy

NDT : La commande pcs constraint n’a pas fonctionné chez moi

  1. Vérification du fonctionnement de la VIP

Test de connexion aux serveurs web depuis la VIP HAProxy